Парное расстояние между двумя наборами наблюдений
возвращает расстояние с помощью метрики, заданной как 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')
Назначение новых данных существующим кластерам
Сгенерируйте тестовые данные набор.
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 + + требуется 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,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
-by - my матрица. D
содержит либо K
наименьший или K
наибольшие парные расстояния до наблюдений в X
для каждого наблюдения в Y
. Для каждого наблюдения в Y
, pdist2
находит K
наименьшие или самые большие расстояния путем вычисления и сравнения значений расстояний со всеми наблюдениями в X
. Если K
больше mx, pdist2
возвращает mx -by- my матрицу.
I
- Сортировка индексаСортировка индекса, возвращенная как положительная целочисленная матрица. 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 определены следующим образом:
Евклидово расстояние
Евклидово расстояние является частным случаем расстояния Минковского, где p = 2.
Стандартизированное Евклидово расстояние
где V - n -by n диагональная матрица, j-й диагональный элемент которой (S (j))2, где S является вектором масштабирующих коэффициентов для каждой размерности.
Расстояние Махаланобиса
где C - ковариационная матрица.
Расстояние между блоками
Расстояние городского блока является частным случаем расстояния Минковского, где p = 1.
Расстояние Минковского
Для особого случая p = 1 расстояние Минковского даёт городскую блочную дистанцию. Для особого случая p = 2 расстояние Минковского даёт евклидово расстояние. Для особого случая p = ∞ дистанция Минковского даёт дистанцию Чебычева.
Чебычевская дистанция
Дистанция Чебычева является частным случаем дистанции Минковского, где p = ∞.
Косинусоидальное расстояние
Расстояние корреляции
где
и
Расстояние Хемминга
Расстояние Жаккара
Расстояние копьеносца
где
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).
.
.
Указания и ограничения по применению:
Первый входной 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'
, 'correlation'
, 'hamming'
, и 'jaccard'
.
Distance
не может быть пользовательской функцией расстояния.
Distance
должен быть константой времени компиляции.
Имена в аргументах пары "имя-значение" должны быть константами во время компиляции.
Отсортированный порядок связанных расстояний в сгенерированном коде может отличаться от порядка в MATLAB из-за численной точности.
Указания и ограничения по применению:
Значение входного параметра расстояния (Distance
) не может быть пользовательской функцией расстояния.
Для получения дополнительной информации смотрите Запуск функций MATLAB на графическом процессоре (Parallel Computing Toolbox).
createns
| ExhaustiveSearcher
| KDTreeSearcher
| knnsearch
| pdist
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.