Попарное расстояние между двумя наборами наблюдений
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
,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, 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
является вектором масштабных коэффициентов для каждой размерности, заданной как положительный вектор. Значением по умолчанию является
.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'
и положительного целого числа. Если вы задаете '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
-by-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
Расстояние копьеносца
где
Указания и ограничения по применению:
Значение входного параметра расстояния (Distance
) должно быть постоянным временем компиляции. Например, чтобы использовать расстояние Минковскего, включайте coder.Constant('Minkowski')
в значение -args
codegen
.
Значение входного параметра расстояния (Distance
) не может быть пользовательской функцией расстояния.
Имена в аргументах пары "имя-значение" должны быть константами времени компиляции. Например, чтобы использовать аргумент пары "имя-значение" 'Smallest'
в сгенерированном коде, включайте {coder.Constant('Smallest'),0}
в значение -args
codegen
.
Отсортированный порядок связанных расстояний в сгенерированном коде может отличаться от порядка в MATLAB® из-за числовой точности.
Сгенерированный код pdist2
использует parfor
, чтобы создать циклы, которые запускают параллельно на поддерживаемой общей памяти многожильные платформы в сгенерированном коде. Если ваш компилятор не поддерживает интерфейс приложения Open Multiprocessing (OpenMP), или вы отключаете библиотеку OpenMP, MATLAB Coder™ обрабатывает parfor
- циклы как for
- циклы. Чтобы найти поддерживаемые компиляторы, см. Поддерживаемые Компиляторы. Чтобы отключить библиотеку OpenMP, установите свойство EnableOpenMP
объекта настройки к false
. Для получения дополнительной информации смотрите coder.CodeConfig
.
Можно сгенерировать, оптимизировал код CUDA® с помощью GPU Coder™. Поддерживаемыми значениями входного параметра расстояния (Distance
) для оптимизированного кода CUDA является 'euclidean'
, 'squaredeuclidean'
, 'seuclidean'
, 'cityblock'
, 'minkowski'
, 'chebychev'
, 'cosine'
, 'correlation'
, 'hamming'
и 'jaccard'
. Для получения дополнительной информации о Кодере GPU смотрите Начало работы с GPU Coder (GPU Coder) и Поддерживаемые Функции (GPU Coder).
Для получения дополнительной информации о генерации кода смотрите Введение в Генерацию кода и Общий Рабочий процесс Генерации кода.
Указания и ограничения по применению:
Аргумент Distance
должен быть задан как вектор символов.
Для получения дополнительной информации смотрите функции MATLAB Выполнения на графическом процессоре (Parallel Computing Toolbox).
ExhaustiveSearcher
| KDTreeSearcher
| createns
| knnsearch
| pdist
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.