pdist2

Попарное расстояние между двумя наборами наблюдений

Описание

пример

D = pdist2(X,Y,Distance) возвращает расстояние между каждой парой наблюдений в X и Y использование метрики задано Distance.

пример

D = pdist2(X,Y,Distance,DistParameter) возвращает расстояние с помощью метрики, заданной Distance и DistParameter. Можно задать DistParameter только, когда Distance 'seuclidean', 'minkowski', или 'mahalanobis'.

D = pdist2(___,Name,Value) задает дополнительную опцию с помощью одного из аргументов пары "имя-значение" 'Smallest' или 'Largest' в дополнение к любому из аргументов в предыдущих синтаксисах.

Например,

  • D = pdist2(X,Y,Distance,'Smallest',K) вычисляет расстояние с помощью метрики, заданной Distance и возвращает K наименьшие попарные расстояния до наблюдений в X для каждого наблюдения в Y в порядке возрастания.

  • D = pdist2(X,Y,Distance,DistParameter,'Largest',K) вычисляет расстояние с помощью метрики, заданной Distance и DistParameter и возвращает K самые большие попарные расстояния в порядке убывания.

пример

[D,I] = pdist2(___,Name,Value) также возвращает матричный I. Матричный I содержит индексы наблюдений в X соответствие расстояниям в D.

Примеры

свернуть все

Создайте две матрицы с тремя наблюдениями и двумя переменными.

rng('default') % For reproducibility
X = rand(3,2);
Y = rand(3,2);

Вычислите Евклидово расстояние. Значение по умолчанию входного параметра Distance 'euclidean'. При вычислении Евклидова расстояния, не используя аргумент пары "имя-значение", вы не должны задавать Distance.

D = pdist2(X,Y)
D = 3×3

    0.5387    0.8018    0.1538
    0.7100    0.5951    0.3422
    0.8805    0.4242    1.2050

D(i,j) соответствует попарному расстоянию между наблюдением i в X и наблюдение j в Y.

Создайте две матрицы с тремя наблюдениями и двумя переменными.

rng('default') % For reproducibility
X = rand(3,2);
Y = rand(3,2);

Вычислите расстояние Минковскего с экспонентой по умолчанию 2.

D1 = pdist2(X,Y,'minkowski')
D1 = 3×3

    0.5387    0.8018    0.1538
    0.7100    0.5951    0.3422
    0.8805    0.4242    1.2050

Вычислите расстояние Минковскего с экспонентой 1, который равен расстоянию городского квартала.

D2 = pdist2(X,Y,'minkowski',1)
D2 = 3×3

    0.5877    1.0236    0.2000
    0.9598    0.8337    0.3899
    1.0189    0.4800    1.7036

D3 = pdist2(X,Y,'cityblock')
D3 = 3×3

    0.5877    1.0236    0.2000
    0.9598    0.8337    0.3899
    1.0189    0.4800    1.7036

Создайте две матрицы с тремя наблюдениями и двумя переменными.

rng('default') % For reproducibility
X = rand(3,2);
Y = rand(3,2);

Найдите два наименьших попарных Евклидовых расстояния до наблюдений в X для каждого наблюдения в Y.

[D,I] = pdist2(X,Y,'euclidean','Smallest',2)
D = 2×3

    0.5387    0.4242    0.1538
    0.7100    0.5951    0.3422

I = 2×3

     1     3     1
     2     2     2

Для каждого наблюдения в Y, pdist2 находит два наименьших расстояния путем вычисления и сравнения значений расстояния со всеми наблюдениями в X. Функция затем сортирует расстояния в каждом столбце D в порядке возрастания. I содержит индексы наблюдений в X соответствие расстояниям в D.

Задайте пользовательскую функцию расстояния, которая игнорирует координаты с NaN значения, и вычисляют попарное расстояние при помощи пользовательской функции расстояния.

Создайте две матрицы с тремя наблюдениями и тремя переменными.

rng('default') % For reproducibility
X = rand(3,3)
Y = [X(:,1:2) rand(3,1)]
X =

    0.8147    0.9134    0.2785
    0.9058    0.6324    0.5469
    0.1270    0.0975    0.9575


Y =

    0.8147    0.9134    0.9649
    0.9058    0.6324    0.1576
    0.1270    0.0975    0.9706

Первые два столбца X и Y идентичны. Примите тот X(1,1) ismissing.

X(1,1) = NaN
X =

       NaN    0.9134    0.2785
    0.9058    0.6324    0.5469
    0.1270    0.0975    0.9575

Вычислите Расстояние Хемминга.

D1 = pdist2(X,Y,'hamming')
D1 =

       NaN       NaN       NaN
    1.0000    0.3333    1.0000
    1.0000    1.0000    0.3333

Если наблюдение i в X или наблюдение j в Y содержит NaN значения, функциональный pdist2 возвращает NaN для попарного расстояния между i и j. Поэтому D1 (1,1), D1 (1,2) и D1 (1,3) является NaN значения.

Задайте пользовательскую функцию расстояния nanhamdist это игнорирует координаты с NaN значения и вычисляют Расстояние Хемминга. При работе с большим количеством наблюдений можно вычислить расстояние более быстро цикличным выполнением по координатам данных.

function D2 = nanhamdist(XI,XJ)  
%NANHAMDIST Hamming distance ignoring coordinates with NaNs
[m,p] = size(XJ);
nesum = zeros(m,1);
pstar = zeros(m,1);
for q = 1:p
    notnan = ~(isnan(XI(q)) | isnan(XJ(:,q)));
    nesum = nesum + ((XI(q) ~= XJ(:,q)) & notnan);
    pstar = pstar + notnan;
end
D2 = nesum./pstar; 

Вычислите расстояние с nanhamdist путем передачи указателя на функцию как входного параметра pdist2.

D2 = pdist2(X,Y,@nanhamdist)
D2 =

    0.5000    1.0000    1.0000
    1.0000    0.3333    1.0000
    1.0000    1.0000    0.3333

kmeans выполняет k-средних значений, кластеризирующихся, чтобы разделить данные в k кластеры. Когда у вас есть новый набор данных, чтобы кластеризироваться, можно создать новые кластеры, которые включают существующие данные и новые данные при помощи kmeans. kmeans функционируйте поддерживает генерацию кода C/C++, таким образом, можно сгенерировать код, который принимает обучающие данные и возвращает кластеризирующиеся результаты, и затем разверните код в устройство. В этом рабочем процессе необходимо передать обучающие данные, которые могут иметь значительный размер. Чтобы сохранить память на устройстве, можно разделить обучение и предсказание при помощи kmeans и pdist2, соответственно.

Используйте kmeans создать кластеры в MATLAB® и использовать pdist2 в сгенерированном коде, чтобы присвоить новые данные существующим кластерам. Для генерации кода задайте функцию точки входа, которая принимает кластерные центроидные положения и новый набор данных, и возвращает индекс самого близкого кластера. Затем сгенерируйте код для функции точки входа.

Генерация кода C/C++ требует MATLAB® Coder™.

Выполните Кластеризацию k-средних значений

Сгенерируйте обучающий набор данных с помощью трех распределений.

rng('default') % For reproducibility
X = [randn(100,2)*0.75+ones(100,2);
    randn(100,2)*0.5-ones(100,2);
    randn(100,2)*0.75];

Разделите обучающие данные в три кластера при помощи kmeans.

[idx,C] = kmeans(X,3);

Постройте кластеры и кластерные центроиды.

figure
gscatter(X(:,1),X(:,2),idx,'bgm')
hold on
plot(C(:,1),C(:,2),'kx')
legend('Cluster 1','Cluster 2','Cluster 3','Cluster Centroid')

Присвойте новые данные существующим кластерам

Сгенерируйте набор тестовых данных.

Xtest = [randn(10,2)*0.75+ones(10,2);
    randn(10,2)*0.5-ones(10,2);
    randn(10,2)*0.75];

Классифицируйте набор тестовых данных с помощью существующих кластеров. Найдите самый близкий центроид от каждой точки тестовых данных при помощи pdist2.

[~,idx_test] = pdist2(C,Xtest,'euclidean','Smallest',1);

Постройте тестовые данные и пометьте тестовые данные с помощью idx_test при помощи gscatter.

gscatter(Xtest(:,1),Xtest(:,2),idx_test,'bgm','ooo')
legend('Cluster 1','Cluster 2','Cluster 3','Cluster Centroid', ...
    'Data classified to Cluster 1','Data classified to Cluster 2', ...
    'Data classified to Cluster 3')

Сгенерируйте код

Сгенерируйте код С, который присваивает новые данные существующим кластерам. Обратите внимание на то, что генерация кода C/C++ требует MATLAB® Coder™.

Задайте функцию с именем точки входа findNearestCentroid это принимает центроидные положения и новые данные, и затем найдите самый близкий кластер при помощи pdist2.

Добавьте %#codegen директива компилятора (или прагма) к функции точки входа после функциональной подписи, чтобы указать, что вы намереваетесь сгенерировать код для алгоритма MATLAB. Добавление этой директивы дает Анализатору кода MATLAB команду помогать вам диагностировать и зафиксировать нарушения, которые вызвали бы ошибки во время генерации кода.

type findNearestCentroid % Display contents of findNearestCentroid.m
function idx = findNearestCentroid(C,X) %#codegen
[~,idx] = pdist2(C,X,'euclidean','Smallest',1); % Find the nearest centroid

Примечание: Если вы нажимаете кнопку, расположенную в верхнем правом разделе этой страницы, и открываете этот пример в MATLAB®, затем MATLAB® открывает папку в качестве примера. Эта папка включает файл функции точки входа.

Сгенерируйте код при помощи codegen (MATLAB Coder). Поскольку C и C++ являются статически типизированными языками, необходимо определить свойства всех переменных в функции точки входа во время компиляции. Задавать размер типа данных и массива входных параметров findNearestCentroid, передайте выражение MATLAB, которое представляет множество значений определенным размером типа данных и массива при помощи -args опция. Для получения дополнительной информации смотрите, Задают Аргументы Переменного Размера для Генерации кода.

codegen findNearestCentroid -args {C,Xtest}

codegen генерирует MEX-функцию findNearestCentroid_mex с зависимым платформой расширением.

Проверьте сгенерированный код.

myIndx = findNearestCentroid(C,Xtest);
myIndex_mex = findNearestCentroid_mex(C,Xtest);
verifyMEX = isequal(idx_test,myIndx,myIndex_mex)
verifyMEX = logical
   1

isequal возвращает логическую единицу (true), что означает, что все входные параметры равны. Сравнение подтверждает что pdist2 функция, findNearestCentroid функция и MEX-функция возвращают тот же индекс.

Можно также сгенерировать, оптимизировал код CUDA® с помощью GPU Coder™.

cfg = coder.gpuConfig('mex');
codegen -config cfg findNearestCentroid -args {C,Xtest}

Для получения дополнительной информации о генерации кода смотрите Общий Рабочий процесс Генерации кода. Для получения дополнительной информации о Кодере GPU смотрите Начало работы с GPU Coder (GPU Coder) и Поддерживаемые Функции (GPU Coder).

Входные параметры

свернуть все

Входные данные в виде числовой матрицы. X mx-by-n матрица и Y my-by-n матрица. Строки соответствуют отдельным наблюдениям, и столбцы соответствуют отдельным переменным.

Типы данных: single | double

Метрика расстояния в виде вектора символов, строкового скаляра или указателя на функцию, как описано в следующей таблице.

ЗначениеОписание
'euclidean'

Евклидово расстояние (значение по умолчанию).

'squaredeuclidean'

Придал Евклидову расстоянию квадратную форму. (Эта возможность предоставляется для КПД только. Это не удовлетворяет треугольному неравенству.)

'seuclidean'

Стандартизированное Евклидово расстояние. Каждое координатное различие между наблюдениями масштабируется путем деления на соответствующий элемент стандартного отклонения, S = std(X,'omitnan'). Используйте DistParameter задавать другое значение для S.

'mahalanobis'

Расстояние Mahalanobis с помощью выборочной ковариации X, C = cov(X,'omitrows'). Используйте DistParameter задавать другое значение для C, где матричный C симметрично и положительный определенный.

'cityblock'

Расстояние городского квартала.

'minkowski'

Расстояние Минковскего. Экспонента по умолчанию равняется 2. Используйте DistParameter задавать различную экспоненту P, где P значение положительной скалярной величины экспоненты.

'chebychev'

Расстояние Чебычева (максимум координируют различие).

'cosine'

Один минус косинус включенного угла между точками (обработанный как векторы).

'correlation'

Один минус корреляция выборки между точками (обработанный как последовательности значений).

'hamming'

Расстояние Хемминга, которое является процентом координат, которые отличаются.

'jaccard'

Один минус коэффициент Jaccard, который является процентом ненулевых координат, которые отличаются.

'spearman'

Один минус порядковая корреляция демонстрационного Копьеносца между наблюдениями (обработанный как последовательности значений).

@distfun

Пользовательский указатель на функцию расстояния. Функция расстояния имеет форму

function D2 = distfun(ZI,ZJ)
% calculation of distance
...
где

  • ZI 1- n вектор, содержащий одно наблюдение.

  • ZJ m2- n матрица, содержащая несколько наблюдений. distfun должен принять матричный ZJ с произвольным числом наблюдений.

  • D2 m2- 1 вектор из расстояний и D2(k) расстояние между наблюдениями ZI и ZJ(k,:).

Если ваши данные не разреженны, можно обычно вычислять расстояние более быстро при помощи встроенного расстояния вместо указателя на функцию.

Для определений смотрите Метрики Расстояния.

Когда вы используете 'seuclidean', 'minkowski', или 'mahalanobis', можно задать дополнительный входной параметр DistParameter управлять этими метриками. Можно также использовать эти метрики таким же образом в качестве других метрик со значением по умолчанию DistParameter.

Пример: 'minkowski'

Метрические значения параметров расстояния в виде положительной скалярной величины, числового вектора или числовой матрицы. Этот аргумент допустим только, когда вы задаете Distance как 'seuclidean', 'minkowski', или 'mahalanobis'.

  • Если Distance 'seuclidean', DistParameter вектор из масштабных коэффициентов для каждой размерности в виде положительного вектора. Значением по умолчанию является std(X,'omitnan').

  • Если Distance 'minkowski', DistParameter экспонента расстояния Минковскего в виде положительной скалярной величины. Значение по умолчанию равняется 2.

  • Если Distance 'mahalanobis', DistParameter ковариационная матрица в виде числовой матрицы. Значением по умолчанию является cov(X,'omitrows'). DistParameter должно быть симметричным и положительный определенный.

Пример: 'minkowski',3

Типы данных: single | double

Аргументы в виде пар имя-значение

Задайте дополнительные разделенные запятой пары Name,Value аргументы. Name имя аргумента и Value соответствующее значение. Name должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.

Пример: любой 'Smallest',K или 'Largest',K. Вы не можете использовать оба 'Smallest' и 'Largest'.

Количество наименьших расстояний, чтобы найти в виде разделенной запятой пары, состоящей из 'Smallest' и положительное целое число. Если вы задаете 'Smallest'то pdist2 сортирует расстояния в каждом столбце D в порядке возрастания.

Пример: 'Smallest',3

Типы данных: single | double

Количество самых больших расстояний, чтобы найти в виде разделенной запятой пары, состоящей из 'Largest' и положительное целое число. Если вы задаете 'Largest'то pdist2 сортирует расстояния в каждом столбце D в порядке убывания.

Пример: 'Largest',3

Типы данных: single | double

Выходные аргументы

свернуть все

Попарные расстояния, возвращенные как числовая матрица.

Если вы не задаете ни один 'Smallest' или 'Largest', затем D mx-by-my матрица, где mx и my являются количеством наблюдений в X и Y, соответственно. D(i,j) расстояние между наблюдением i в X и наблюдение j в Y. Если наблюдение i в X или наблюдение j в Y содержит NaN, затем D(i,j) isnan для встроенных функций расстояния.

Если вы задаете любой 'Smallest' или 'Largest' как K, затем D K- my матрица. D содержит любого K самый маленький или K самые большие попарные расстояния до наблюдений в X для каждого наблюдения в Y. Для каждого наблюдения в Y, pdist2 находит K наименьшие или самые большие расстояния путем вычисления и сравнения значений расстояния со всеми наблюдениями в X. Если K больше mx, pdist2 возвращает mx-by-my матрица.

Сортировка индекса, возвращенного как положительная целочисленная матрица. I одного размера с Di содержит индексы наблюдений в X соответствие расстояниям в D.

Больше о

свернуть все

Метрики расстояния

Метрика расстояния является функцией, которая задает расстояние между двумя наблюдениями. pdist2 поддержки различные метрики расстояния: Евклидово расстояние, стандартизированное Евклидово расстояние, расстояние Mahalanobis, расстояние городского квартала, расстояние Минковскего, расстояние Чебычева, расстояние косинуса, расстояние корреляции, Расстояние Хемминга, расстояние Jaccard и расстояние Копьеносца.

Учитывая mx-by-n матрица данных X, который обработан как mx (1 n) векторы-строки x1, x2..., xmx и my-by-n матрица данных Y, который обработан как my (1 n) векторы-строки y1, y2..., ymy, определяются следующим образом различные расстояния между векторным xs и yt:

  • Евклидово расстояние

    dst2=(xsyt)(xsyt).

    Евклидово расстояние является особым случаем расстояния Минковскего, где p = 2.

  • Стандартизированное Евклидово расстояние

    dst2=(xsyt)V1(xsyt),

    где V является n-by-n диагональная матрица, j которой th диагональный элемент (S (j)) 2, где S является вектором из масштабных коэффициентов для каждой размерности.

  • Расстояние Mahalanobis

    dst2=(xsyt)C1(xsyt),

    где C является ковариационной матрицей.

  • Расстояние городского квартала

    dst=j=1n|xsjytj|.

    Расстояние городского квартала является особым случаем расстояния Минковскего, где p = 1.

  • Расстояние Минковскего

    dst=j=1n|xsjytj|pp.

    Для особого случая p = 1, расстояние Минковскего дает расстояние городского квартала. Для особого случая p = 2, расстояние Минковскего дает Евклидово расстояние. Для особого случая p = ∞, расстояние Минковскего дает расстояние Чебычева.

  • Расстояние Чебычева

    dst=maxj{|xsjytj|}.

    Расстояние Чебычева является особым случаем расстояния Минковскего, где p = ∞.

  • Расстояние косинуса

    dst=(1xsyt(xsxs)(ytyt)).

  • Расстояние корреляции

    dst=1(xsx¯s)(yty¯t)(xsx¯s)(xsx¯s)(yty¯t)(yty¯t),

    где

    x¯s=1njxsj

    и

    y¯t=1njytj.

  • Расстояние Хемминга

    dst=(#(xsjytj)/n).

  • Расстояние Jaccard

    dst=#[(xsjytj)((xsj0)(ytj0))]#[(xsj0)(ytj0)].

  • Расстояние копьеносца

    dst=1(rsr¯s)(rtr¯t)(rsr¯s)(rsr¯s)(rtr¯t)(rtr¯t),

    где

    • rsj является рангом xsj, принятого x 1j, x 2j... xmx,j, как вычислено tiedrank.

    • rtj является рангом ytj, принятого y 1j, y 2j... ymy,j, как вычислено tiedrank.

    • rs и rt являются координатно-мудрыми векторами ранга из xs и yt, то есть, rs = (rs 1, rs 2... rsn) и rt = (r t 1, r t 2... rtn).

    • r¯s=1njrsj=(n+1)2.

    • r¯t=1njrtj=(n+1)2.

Расширенные возможности

Смотрите также

| | | |

Введен в R2010a