Попарное расстояние между двумя наборами наблюдений
возвращает расстояние с помощью метрики, заданной 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,Y
— Входные данныеВходные данные в виде числовой матрицы. X
mx-by-n матрица и Y
my-by-n матрица. Строки соответствуют отдельным наблюдениям, и столбцы соответствуют отдельным переменным.
Типы данных: single
| double
Distance
— Метрика расстоянияМетрика расстояния в виде вектора символов, строкового скаляра или указателя на функцию, как описано в следующей таблице.
Значение | Описание |
---|---|
'euclidean' | Евклидово расстояние (значение по умолчанию). |
'squaredeuclidean' | Придал Евклидову расстоянию квадратную форму. (Эта возможность предоставляется для КПД только. Это не удовлетворяет треугольному неравенству.) |
'seuclidean' | Стандартизированное Евклидово расстояние. Каждое координатное различие между наблюдениями масштабируется путем деления на соответствующий элемент стандартного отклонения, |
'mahalanobis' | Расстояние Mahalanobis с помощью выборочной ковариации |
'cityblock' | Расстояние городского квартала. |
'minkowski' | Расстояние Минковскего. Экспонента по умолчанию равняется 2. Используйте |
'chebychev' | Расстояние Чебычева (максимум координируют различие). |
'cosine' | Один минус косинус включенного угла между точками (обработанный как векторы). |
'correlation' | Один минус корреляция выборки между точками (обработанный как последовательности значений). |
'hamming' | Расстояние Хемминга, которое является процентом координат, которые отличаются. |
'jaccard' | Один минус коэффициент 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)
isnan
для встроенных функций расстояния.
Если вы задаете любой 'Smallest'
или 'Largest'
как K
, затем D
K
- my матрица. D
содержит любого K
самый маленький или K
самые большие попарные расстояния до наблюдений в X
для каждого наблюдения в Y
. Для каждого наблюдения в Y
, pdist2
находит K
наименьшие или самые большие расстояния путем вычисления и сравнения значений расстояния со всеми наблюдениями в X
. Если K
больше mx, pdist2
возвращает mx-by-my матрица.
I
— Сортировка индексаСортировка индекса, возвращенного как положительная целочисленная матрица. 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:
Евклидово расстояние
Евклидово расстояние является особым случаем расстояния Минковскего, где p = 2.
Стандартизированное Евклидово расстояние
где V является n-by-n диагональная матрица, j которой th диагональный элемент (S (j)) 2, где S является вектором из масштабных коэффициентов для каждой размерности.
Расстояние Mahalanobis
где C является ковариационной матрицей.
Расстояние городского квартала
Расстояние городского квартала является особым случаем расстояния Минковскего, где p = 1.
Расстояние Минковскего
Для особого случая p = 1, расстояние Минковскего дает расстояние городского квартала. Для особого случая p = 2, расстояние Минковскего дает Евклидово расстояние. Для особого случая p = ∞, расстояние Минковскего дает расстояние Чебычева.
Расстояние Чебычева
Расстояние Чебычева является особым случаем расстояния Минковскего, где p = ∞.
Расстояние косинуса
Расстояние корреляции
где
и
Расстояние Хемминга
Расстояние Jaccard
Расстояние копьеносца
где
Указания и ограничения по применению:
Первый вход X
должен быть длинный массив. Введите Y
не может быть длинный массив.
Для получения дополнительной информации см. Раздел "Высокие массивы".
Указания и ограничения по применению:
Значение входного параметра расстояния (Distance
) должно быть постоянное время компиляции. Например, чтобы использовать расстояние Минковскего, включайте coder.Constant('Minkowski')
в -args
значение codegen
.
Значение входного параметра расстояния (Distance
) не может быть пользовательская функция расстояния.
Имена в аргументах пары "имя-значение" должны быть константами времени компиляции. Например, чтобы использовать 'Smallest'
аргумент пары "имя-значение" в сгенерированном коде, включайте {coder.Constant('Smallest'),0}
в -args
значение codegen
(MATLAB Coder).
Отсортированный порядок связанных расстояний в сгенерированном коде может отличаться от порядка в MATLAB® из-за числовой точности.
Сгенерированный код pdist2
использование parfor
(MATLAB Coder), чтобы создать циклы, которые запускают параллельно на поддерживаемой общей памяти многожильные платформы в сгенерированном коде. Если ваш компилятор не поддерживает интерфейс приложения Open Multiprocessing (OpenMP), или вы отключаете библиотеку OpenMP, MATLAB Coder™ обрабатывает parfor
- циклы как for
- циклы. Чтобы найти поддерживаемые компиляторы, см. Поддерживаемые Компиляторы. Чтобы отключить библиотеку OpenMP, установите EnableOpenMP
свойство настройки возражает против false
. Для получения дополнительной информации смотрите coder.CodeConfig
(MATLAB Coder).
Запуск в R2020a, pdist2
возвращает целочисленный тип (int32
) индексы, а не индексы с двойной точностью, в сгенерированном автономном коде C/C++. Поэтому функция допускает строгую поддержку с одинарной точностью, когда вы используете входные параметры с одинарной точностью. Для генерации кода MEX функция все еще возвращает индексы с двойной точностью, чтобы совпадать с поведением MATLAB.
Для получения дополнительной информации о генерации кода смотрите Введение в Генерацию кода и Общий Рабочий процесс Генерации кода.
Указания и ограничения по применению:
Поддерживаемые значения входного параметра расстояния (Distance
) поскольку оптимизированным кодом CUDA является 'euclidean'
, 'squaredeuclidean'
, 'seuclidean'
, 'cityblock'
, 'minkowski'
, 'chebychev'
, 'cosine'
Корреляция
, 'hamming'
, и 'jaccard'
.
Distance
не может быть пользовательская функция расстояния.
Distance
должно быть постоянное время компиляции.
Имена в аргументах пары "имя-значение" должны быть константами времени компиляции.
Отсортированный порядок связанных расстояний в сгенерированном коде может отличаться от порядка в MATLAB из-за числовой точности.
Указания и ограничения по применению:
Distance
аргумент должен быть задан как вектор символов.
Для получения дополнительной информации смотрите функции MATLAB Запуска на графическом процессоре (Parallel Computing Toolbox).
createns
| ExhaustiveSearcher
| KDTreeSearcher
| knnsearch
| pdist
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.