exponenta event banner

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

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

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

Выполнить кластеризацию k-Means

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

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/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). Поскольку 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 функция, findNearestCentroid функция, и функция MEX возвращает тот же самый индекс.

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

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

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

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

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

Подробнее

свернуть все

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

Метрика расстояния - это функция, определяющая расстояние между двумя наблюдениями. pdist2 поддерживает различные метрики расстояния: евклидово расстояние, стандартизированное евклидово расстояние, расстояние Махаланобиса, расстояние городского блока, расстояние Минковского, расстояние Чебычева, расстояние косинуса, расстояние корреляции, расстояние Хэмминга, расстояние Джаккарда и расстояние Спирмана.

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

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

    dst2 = (xs yt) (xs − yt) ′.

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

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

    dst2 = (xs yt) V 1 (xs − yt) ′,

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

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

    dst2 = (xs yt) C 1 (xs − yt) ′,

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

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

    dst=∑j=1n'xsj−ytj|.

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

  • Минковская дистанция

    dst=∑j=1n'xsj−ytj'pp.

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

  • Чебычевская дистанция

    dst = maxj {| xsj ytj |}.

    Дистанция Чебычева - частный случай дистанции Минковского, где p = ∞.

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

    dst = (1−xsy′t (xsx′s) (yty′t)).

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

    dst=1− (xs−x¯s) (yt−y¯t) (xs−x¯s) (xs−x¯s) (yt−y¯t) (yt−y¯t) ′,

    где

    x¯s=1n∑jxsj

    и

    y¯t=1n∑jytj.

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

    dst = (# (xsj≠ytj )/n).

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

    dst = # [(xsj≠ytj) ((xsj≠0) (ytj≠0))] # [(xsj≠0) ∪ (ytj≠0)].

  • Расстояние Спирмена

    dst=1− (rs−r¯s) (rt−r¯t) (rs−r¯s) (rs−r¯s) (rt−r¯t) (rt−r¯t) ′,

    где

    • rsj - ранг xsj, принимаемый над x1j, x2j,... xmx, j, как вычислено tiedrank.

    • rtj - ранг ytj, взятый над y1j, y2j,... ymy, j, как вычислено tiedrank.

    • rs и rt являются координатными ранговыми векторами xs и yt, то есть rs = (rs1, rs2,... rsn) и rt = (rt1, rt2,... rtn).

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

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

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

..
Представлен в R2010a