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

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

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

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

Выполните 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')

Figure contains an axes. The axes contains 4 objects of type line. These objects represent 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')

Figure contains an axes. The axes contains 7 objects of type line. These objects represent 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 + + требуется Coder™ MATLAB ®.

Задайте функцию точки входа с именем 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}
Code generation successful.

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 возвращает логический 1 (true), что означает, что все входы равны. Сравнение подтверждает, что pdist2 function, the findNearestCentroid функция, и MEX-функция возвращает тот же индекс.

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

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

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

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

свернуть все

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

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

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

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

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

'squaredeuclidean'

Квадратное Евклидово расстояние. (Эта опция предусмотрена только для эффективности. Это не удовлетворяет неравенству треугольника.)

'seuclidean'

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

'mahalanobis'

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

'cityblock'

Расстояние между блоками.

'minkowski'

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

'chebychev'

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

'cosine'

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

'correlation'

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

'hamming'

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

'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 - вектор масштабирующих коэффициентов для каждой размерности, заданный как положительный вектор. Значение по умолчанию 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) является 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 поддерживает различные метрики расстояния: Евклидово расстояние, стандартизированное Евклидово расстояние, расстояние Махаланобиса, расстояние городского блока, расстояние Минковского, расстояние Чебычева, расстояние косинуса, расстояние корреляции, расстояние Хемминга, расстояние Жаккарда и расстояние копья.

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

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

    dst2=(xsyt)(xsyt).

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

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

    dst2=(xsyt)V1(xsyt),

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

  • Расстояние Махаланобиса

    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).

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

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

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

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

    где

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

    • rtj - это ранг ytj, занятый y 1 j, y 2 j,... 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