pdist2

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

Синтаксис

D = pdist2(X,Y,Distance)
D = pdist2(X,Y,Distance,DistParameter)
D = pdist2(___,Name,Value)
[D,I] = pdist2(___,Name,Value)

Описание

пример

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) отсутствует.

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. Поскольку 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 = nanstd(X). Используйте DistParameter, чтобы задать другое значение для S.

'mahalanobis'

Расстояние Mahalanobis с помощью выборочной ковариации X, C = nancov(X). Используйте 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-by-n вектор, содержащий одно наблюдение.

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

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

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

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

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

Пример: 'minkowski'

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

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

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

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

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

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

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

Укажите необязательные аргументы в виде пар ""имя, значение"", разделенных запятыми. Имя (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) является NaN для встроенных функций расстояния.

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

Сортировка индекса, возвращенного как положительная целочисленная матрица. I одного размера как D. I содержит индексы наблюдений в 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=max j{|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