Попарное расстояние между двумя наборами наблюдений
возвращает расстояние, используя метрику, заданную 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')

Назначение новых данных существующим кластерам
Создайте набор тестовых данных.
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/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,Y - Входные данныеВходные данные, указанные как числовая матрица. X является матрицей mx-by-n и Y является матрицей my-by-n. Строки соответствуют отдельным наблюдениям, а столбцы - отдельным переменным.
Типы данных: single | double
Distance - Метрика расстоянияМетрика расстояния, заданная как вектор символа, скаляр строки или дескриптор функции, как описано в следующей таблице.
| Стоимость | Описание |
|---|---|
'euclidean' | Евклидово расстояние (по умолчанию). |
'squaredeuclidean' | Квадрат евклидова расстояния. (Этот вариант предусмотрен только для эффективности. Он не удовлетворяет неравенству треугольника.) |
'seuclidean' | Стандартизированное евклидово расстояние. Каждая разность координат между наблюдениями масштабируется делением на соответствующий элемент стандартного отклонения, |
'mahalanobis' | Расстояние Махаланобиса с использованием ковариации образца |
'cityblock' | Расстояние между городскими кварталами. |
'minkowski' | Минковская дистанция. Степень по умолчанию равна 2. Использовать |
'chebychev' | Расстояние Чебычева (максимальная разность координат). |
'cosine' | Один минус косинус включенного угла между точками (обрабатываемый как векторы). |
'correlation' | Один минус выборочная корреляция между точками (обрабатываемая как последовательности значений). |
'hamming' | Расстояние хэмминга, которое представляет собой процент различающихся координат. |
'jaccard' | Один минус коэффициент Джаккарда, который представляет собой процент отличных от нуля координат. |
'spearman' |
Один минус выборка ранговой корреляции Спирмена между наблюдениями (обрабатываемыми как последовательности значений). |
@ |
Пользовательский дескриптор функции расстояния. Функция расстояния имеет вид function D2 = distfun(ZI,ZJ) % calculation of distance ...
Если данные не разрежены, можно, как правило, быстрее вычислять расстояние, используя встроенное расстояние вместо дескриптора функции. |
Определения см. в разделе Метрика расстояния.
При использовании 'seuclidean', 'minkowski', или 'mahalanobis', можно указать дополнительный входной аргумент DistParameter для управления этими метриками. Эти метрики можно также использовать так же, как и другие метрики со значением по умолчанию DistParameter.
Пример:
'minkowski'
DistParameter - Значения метрических параметров расстоянияЗначения параметров метрики расстояния, заданные как положительный скаляр, числовой вектор или числовая матрица. Этот аргумент допустим только при указании 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' и положительное целое число. При указании 'Smallest', то pdist2 сортировка расстояний в каждом столбце D в порядке возрастания.
Пример: 'Smallest',3
Типы данных: single | double
'Largest' - Количество наибольших расстояний для поискаЧисло наибольших расстояний для поиска, указанное как пара, разделенная запятыми, состоящая из 'Largest' и положительное целое число. При указании 'Largest', то pdist2 сортировка расстояний в каждом столбце D в порядке убывания.
Пример: 'Largest',3
Типы данных: single | double
D - Попарные расстоянияПопарные расстояния, возвращаемые в виде числовой матрицы.
Если вы не указываете ни '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 - Индекс сортировкиИндекс сортировки, возвращаемый в виде положительной целочисленной матрицы. I имеет тот же размер, что и D. I содержит индексы наблюдений в X соответствующие расстояниям в D.
Метрика расстояния - это функция, определяющая расстояние между двумя наблюдениями. pdist2 поддерживает различные метрики расстояния: евклидово расстояние, стандартизированное евклидово расстояние, расстояние Махаланобиса, расстояние городского блока, расстояние Минковского, расстояние Чебычева, расстояние косинуса, расстояние корреляции, расстояние Хэмминга, расстояние Джаккарда и расстояние Спирмана.
Учитывая матрицу X данных mx-на-n, которая обрабатывается как векторы строк mx (1-на-n) x1, x2,..., xmx и матрица данных my-на-n Y, которая обрабатывается как мои векторы строк y1, y2,..., ymy, различные расстояния между вектором xs и yt определяются следующим образом:
Евклидово расстояние
− yt) ′.
Евклидово расстояние - частный случай расстояния Минковского, где p = 2.
Стандартизированное евклидово расстояние
xs − yt) ′,
где V - диагональная матрица n-на-n, j-й диагональный элемент которой равен (S (j)) 2, где S - вектор масштабных коэффициентов для каждой размерности.
Расстояние Махаланобиса
xs − yt) ′,
где C - ковариационная матрица.
Расстояние между городскими кварталами
Расстояние городского блока - частный случай расстояния Минковского, где p = 1.
Минковская дистанция
Для особого случая p = 1 расстояние Минковского даёт расстояние городского блока. Для частного случая p = 2 расстояние Минковского даёт евклидово расстояние. Для частного случая p = ∞ дистанция Минковского даёт дистанцию Чебычева.
Чебычевская дистанция
ytj |}.
Дистанция Чебычева - частный случай дистанции Минковского, где p = ∞.
Расстояние косинуса
yty′t)).
Корреляционное расстояние
(yt−y¯t) ′,
где
и
Расстояние хэмминга
/n).
Расстояние Яккарда
∪ (ytj≠0)].
Расстояние Спирмена
(rt−r¯t) ′,
где
Примечания и ограничения по использованию:
Первый вход X должен быть высоким массивом. Вход Y не может быть массивом высокого уровня.
Дополнительные сведения см. в разделе Массивы Tall.
Примечания и ограничения по использованию:
Значение входного аргумента расстояния (Distance) должна быть константой времени компиляции. Например, чтобы использовать расстояние Минковского, включите coder.Constant('Minkowski') в -args значение codegen.
Значение входного аргумента расстояния (Distance) не может быть пользовательской функцией расстояния.
Имена в аргументах пары имя-значение должны быть константами времени компиляции. Например, для использования 'Smallest' аргумент пары имя-значение в сгенерированном коде, включить {coder.Constant('Smallest'),0} в -args значение codegen (Кодер MATLAB).
Порядок сортировки связанных расстояний в сгенерированном коде может отличаться от порядка в MATLAB ® из-за числовой точности .
Созданный код pdist2 использование parfor (MATLAB Coder) для создания циклов, которые выполняются параллельно на поддерживаемых многоядерных платформах с общей памятью в сгенерированном коде. Если компилятор не поддерживает интерфейс приложения Open Multiprocessing (OpenMP) или вы отключаете библиотеку OpenMP, MATLAB Coder™ обрабатывает parfor-закольцовывает как for-контуры. Чтобы найти поддерживаемые компиляторы, см. раздел Поддерживаемые компиляторы. Чтобы отключить библиотеку OpenMP, установите EnableOpenMP свойства объекта конфигурации для false. Для получения более подробной информации см. coder.CodeConfig (Кодер MATLAB).
Начиная с R2020a, pdist2 возвращает целочисленный тип (int32) индексов, а не индексов двойной точности, в сгенерированном автономном коде C/C + +. Поэтому функция обеспечивает строгую поддержку с одной точностью при использовании входов с одной точностью. Для генерации кода MEX функция по-прежнему возвращает индексы двойной точности, соответствующие поведению MATLAB.
Дополнительные сведения о создании кода см. в разделах Введение в создание кода и Общий рабочий процесс создания кода.
Примечания и ограничения по использованию:
Поддерживаемые значения входных аргументов расстояния (Distance) для оптимизированного кода CUDA: 'euclidean', 'squaredeuclidean', 'seuclidean', 'cityblock', 'minkowski', 'chebychev', 'cosine', 'correlation', 'hamming', и 'jaccard'.
Distance не может быть пользовательской функцией расстояния.
Distance должен быть константой времени компиляции.
Имена в аргументах пары имя-значение должны быть константами времени компиляции.
Порядок сортировки связанных расстояний в сгенерированном коде может отличаться от порядка в MATLAB из-за числовой точности.
Примечания и ограничения по использованию:
Значение входного аргумента расстояния (Distance) не может быть пользовательской функцией расстояния.
Дополнительные сведения см. в разделе Запуск функций MATLAB на графическом процессоре (панель инструментов параллельных вычислений).
createns | ExhaustiveSearcher | KDTreeSearcher | knnsearch | pdist
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.