Найдите всех соседей на заданном расстоянии с помощью входных данных
Найдите X
точки, которые являются на Евклидовом расстоянии 1.5
из каждого Y
точка. Оба X
и Y
выборки пятимерных нормально распределенных переменных.
rng('default') % For reproducibility X = randn(100,5); Y = randn(10,5); [Idx,D] = rangesearch(X,Y,1.5)
Idx=10×1 cell array
{[ 25 62 33 99 87 92 16]}
{[ 92 25]}
{[ 93 42 31 73 60 28 78 83 48 89 85]}
{[ 92 41]}
{[44 7 28 78 75 42 69 31 1 26 83 93]}
{[ 15 31 89 41 27 17 29 60 34]}
{[ 89]}
{1x0 double }
{1x0 double }
{1x0 double }
D=10×1 cell array
{[ 0.9546 1.0987 1.2730 1.3981 1.4140 1.4249 1.4822]}
{[ 1.4203 1.4558]}
{1x11 double }
{[ 1.1244 1.4672]}
{1x12 double }
{[1.2824 1.2843 1.3342 1.3469 1.4154 1.4237 1.4625 1.4626 1.4744]}
{[ 1.1739]}
{1x0 double }
{1x0 double }
{1x0 double }
В этом случае, последние три Y
точки являются больше, чем 1.5
расстояние далеко от любого X
точка. X(89,:)
1.1739
расстояние далеко от Y(7,:)
, и никакой другой X
точкой является на расстоянии 1.5
из Y(7,:)
X
содержит 12
точки на расстоянии 1.5
из Y(5,:)
.
Сгенерируйте 5 000 случайных точек от каждого из трех отличных многомерных нормальных распределений. Переключите средние значения распределений так, чтобы случайным образом сгенерированные точки, вероятно, сформировали три отдельных кластера.
rng('default') % For reproducibility N = 5000; dist = 10; X = [mvnrnd([0 0],eye(2),N); mvnrnd(dist*[1 1],eye(2),N); mvnrnd(dist*[-1 -1],eye(2),N)];
Для каждой точки в X
, найдите точки в X
это - в радиусе dist
далеко от точки. Для более быстрого расчета задайте, чтобы сохранить индексы самых близких соседей неотсортированными. Выберите первую точку в X и найдите ее самых близких соседей.
Idx = rangesearch(X,X,dist,'SortIndices',false);
x = X(1,:);
nearestPoints = X(Idx{1},:);
Найдите значения в X
это не самые близкие соседи x
. Отобразите те точки в одном цвете и самых близких соседях x
в различном цвете. Пометьте точку x
с черным, заполненным кругом.
nonNearestIdx = true(size(X,1),1); nonNearestIdx(Idx{1}) = false; scatter(X(nonNearestIdx,1),X(nonNearestIdx,2)) hold on scatter(nearestPoints(:,1),nearestPoints(:,2)) scatter(x(1),x(2),'black','filled') hold off
Найдите пациентов в patients
набор данных, которые являются в определенном возрасте и области значений веса пациентов в Y
.
Загрузите patients
набор данных. Age
значения находятся в годах и Weight
значения находятся в фунтах.
load patients X = [Age Weight]; Y = [20 162; 30 169; 40 168]; % New patients
Создайте пользовательскую функцию расстояния distfun
это определяет расстояние между пациентами в терминах возраста и веса. Например, согласно distfun
, два пациента, которые на расстоянии в один год в возрасте и имеют тот же вес, являются одной единицей расстояния независимо. Точно так же два пациента, которые имеют тот же возраст и на расстоянии в пять фунтов в весе, являются также одной единицей расстояния независимо.
type distfun.m % Display contents of distfun.m file
function D2 = distfun(ZI,ZJ) ageDifference = abs(ZI(1)-ZJ(:,1)); weightDifference = abs(ZI(2)-ZJ(:,2)); D2 = ageDifference + 0.2*weightDifference; end
Примечание: Если вы нажимаете кнопку, расположенную в верхнем правом разделе этого примера, и открываете пример в MATLAB®, затем MATLAB открывает папку в качестве примера. Эта папка включает файл функции distfun.m
.
Найдите пациентов в X
это - на расстоянии 2
из пациентов в Y
.
[Idx,D] = rangesearch(X,Y,2,'Distance',@distfun)
Idx=3×1 cell array
{1x0 double}
{1x0 double}
{[ 41]}
D=3×1 cell array
{1x0 double}
{1x0 double}
{[ 1.8000]}
Третий пациент в Y
единственный должен иметь пациента в X
на расстоянии 2
.
Отобразите Age
и Weight
значения для самого близкого пациента в X
пациенту с возрастом 40
и вес 168
.
X(Idx{3},:)
ans = 1×2
39 164
X
— Входные данныеВходные данные в виде mx-by-n числовая матрица, где каждая строка представляет один n - размерная точка. Количество столбцов n должно равняться количеству столбцов в Y
.
Типы данных: single
| double
Y
— Точки запросаТочки запроса в виде my-by-n числовая матрица, где каждая строка представляет один n - размерная точка. Количество столбцов n должно равняться количеству столбцов в X
.
Типы данных: single
| double
r
— Поисковый радиусЗадайте дополнительные разделенные запятой пары Name,Value
аргументы. Name
имя аргумента и Value
соответствующее значение. Name
должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN
.
rangesearch(X,Y,1.4,'Distance','seuclidean','Scale',iqr(X))
задает, чтобы найти все наблюдения в X
на расстоянии 1.4
из каждого наблюдения в Y
, использование стандартизированного Евклидова расстояния, масштабируемого межквартильным размахом X
.'NSMethod'
— Самый близкий соседний метод поиска'kdtree'
| 'exhaustive'
Самый близкий соседний метод поиска в виде разделенной запятой пары, состоящей из 'NSMethod'
и одно из этих значений.
Значение | Описание |
---|---|
'kdtree' | Создайте и используйте d-дерево K, чтобы найти самых близких соседей.
|
'exhaustive' | Используйте алгоритм исчерпывающего поиска. Программное обеспечение вычисляет расстояния от всего X точки к каждому Y укажите, чтобы найти самых близких соседей. |
'kdtree'
значение по умолчанию когда количество столбцов в X
меньше чем или равно 10
X
не разреженно, и метрика расстояния является одним из допустимого 'kdtree'
метрики. В противном случае значением по умолчанию является 'exhaustive'
.
Пример: 'NSMethod','exhaustive'
'Distance'
— Метрика расстояния'euclidean'
(значение по умолчанию) | 'seuclidean'
| 'mahalanobis'
| 'cityblock'
| 'minkowski'
| 'chebychev'
| указатель на функцию |...Метрика расстояния это rangesearch
использование в виде разделенной запятой пары, состоящей из 'Distance'
и одно из значений в этой таблице.
Значение | Описание |
---|---|
'euclidean' | Евклидово расстояние. |
'seuclidean' | Стандартизированное Евклидово расстояние. Каждое координатное различие между строкой в X и точка запроса масштабируется путем деления на соответствующий элемент стандартного отклонения, вычисленного из X , std(X,'omitnan') . Чтобы задать другое масштабирование, используйте 'Scale' аргумент пары "имя-значение". |
'mahalanobis' | Расстояние Mahalanobis, вычисленное использование положительной определенной ковариационной матрицы C . Значение по умолчанию C матрица выборочной ковариации X , как вычислено cov(X,'omitrows') . Задавать различное значение для C , используйте 'Cov' аргумент пары "имя-значение". |
'cityblock' | Расстояние городского квартала. |
'minkowski' | Расстояние Минковскего. Экспонентой по умолчанию является 2 . Чтобы задать различную экспоненту, используйте 'P' аргумент пары "имя-значение". |
'chebychev' | Расстояние Чебычева (максимум координируют различие). |
'cosine' | Один минус косинус включенного угла между наблюдениями (обработанный как векторы). |
'correlation' | Один минус демонстрационная линейная корреляция между наблюдениями (обработанный как последовательности значений). |
'hamming' | Расстояние Хемминга, процент координат, которые отличаются. |
'jaccard' | Один минус коэффициент Jaccard, процент ненулевых координат, которые отличаются. |
'spearman' | Один минус порядковая корреляция демонстрационного Копьеносца между наблюдениями (обработанный как последовательности значений). |
@ | Пользовательский указатель на функцию расстояния. Функция расстояния имеет форму function D2 = distfun(ZI,ZJ) % calculation of distance ...
|
Для получения дополнительной информации смотрите Метрики Расстояния.
Пример: 'Distance','minkowski'
'P'
— Экспонента для метрики расстояния Минковскего
(значение по умолчанию) | положительная скалярная величинаЭкспонента для метрики расстояния Минковскего в виде разделенной запятой пары, состоящей из 'P'
и положительная скалярная величина. Этот аргумент допустим только если 'Distance'
'minkowski'
.
Пример: 'P',4
Типы данных: single
| double
'Cov'
— Ковариационная матрица для метрики расстояния Mahalanobiscov(X,'omitrows')
(значение по умолчанию) | положительная определенная матрицаКовариационная матрица для метрики расстояния Mahalanobis в виде разделенной запятой пары, состоящей из 'Cov'
и положительная определенная матрица. Этот аргумент допустим только когда 'Distance'
'mahalanobis'
.
Пример: 'Cov',eye(4)
Типы данных: single
| double
'Scale'
— Значение масштабного коэффициента для стандартизированной Евклидовой метрики расстоянияstd(X,'omitnan')
(значение по умолчанию) | неотрицательный векторЗначение масштабного коэффициента для стандартизированной Евклидовой метрики расстояния в виде разделенной запятой пары, состоящей из 'Scale'
и неотрицательный вектор. Scale
имеет длину, равную количеству столбцов в X
. Каждое координатное различие между строкой в X
и точка запроса масштабируется соответствующим элементом Scale
. Этот аргумент допустим только когда 'Distance'
'seuclidean'
.
Пример: 'Scale',iqr(X)
Типы данных: single
| double
'BucketSize'
— Максимальное количество точек данных в вершине d-дерева K
(значение по умолчанию) | положительный целочисленный скалярМаксимальное количество точек данных в вершине d-дерева K в виде разделенной запятой пары, состоящей из 'BucketSize'
и положительный целочисленный скаляр. Этот аргумент допустим только когда NSMethod
'kdtree'
.
Пример: 'BucketSize',20
Типы данных: single
| double
'SortIndices'
— Отметьте, чтобы отсортировать возвращенные индексы согласно расстояниюtrue
(1
) (значение по умолчанию) | false
(0
)Отметьте, чтобы отсортировать возвращенные индексы согласно расстоянию в виде разделенной запятой пары, состоящей из 'SortIndices'
и любой true
(1 ) или
false
(0 ).
Для более быстрой эффективности, когда Y
содержит много наблюдений, которые имеют много самых близких точек в X
, можно установить SortIndices
к false
. В этом случае, rangesearch
возвращает индексы самых близких точек без определенного порядка. Когда SortIndices
true
, функция располагает индексы самых близких точек в порядке возрастания расстоянием.
Пример: 'SortIndices',false
Типы данных: логический
Idx
— Индексы самых близких точекИндексы самых близких точек, возвращенных как массив ячеек числовых векторов.
Idx
my-by-1
массив ячеек, где my является количеством строк в Y
. Векторный Idx{j}
содержит индексы точек (строки) в X
чьи расстояния до Y(j,:)
не больше r
. Если SortIndices
true
то rangesearch
располагает индексы в порядке возрастания расстоянием.
D
— Расстояния самых близких точек к точкам запросаРасстояния самых близких точек к точкам запроса, возвращенным как массив ячеек числовых векторов.
D
my-by-1
массив ячеек, где my является количеством строк в Y
. D{j}
содержит значения расстояния между Y(j,:)
и точки (строки) в X(Idx{j},:)
. Если SortIndices
true
то rangesearch
располагает расстояния в порядке возрастания.
Для фиксированного положительного действительного значения r
, rangesearch
находит весь X
точки, которые являются на расстоянии r
из каждого Y
точка. Найти k указывает в X
это является самым близким к каждому Y
укажите, для фиксированного положительного целочисленного k, используйте knnsearch
.
rangesearch
не сохраняет поисковый объект. Чтобы создать поисковый объект, использовать createns
.
Для обзора алгоритма d-дерева k смотрите, что Поиск k - ближайших соседей Использует Kd-дерево.
Алгоритм исчерпывающего поиска находит расстояние от каждой точки в X
к каждой точке в Y
.
Если вы устанавливаете rangesearch
функциональный 'NSMethod'
аргумент пары "имя-значение" соответствующему значению ('exhaustive'
для алгоритма исчерпывающего поиска или 'kdtree'
для алгоритма d-дерева K), затем результаты поиска эквивалентны результатам, полученным путем проведения поиска расстояния использование rangesearch
объектная функция. В отличие от этого, rangesearch
функция, rangesearch
объектная функция требует ExhaustiveSearcher
или KDTreeSearcher
объект модели.
Указания и ограничения по применению:
Если X
длинный массив, затем Y
не может быть длинный массив. Точно так же, если Y
длинный массив, затем X
не может быть длинный массив.
Для получения дополнительной информации см. Раздел "Высокие массивы".
Указания и ограничения по применению:
Для генерации кода, значения по умолчанию 'NSMethod'
аргументом пары "имя-значение" является 'exhaustive'
когда количество столбцов в X
больше 7.
Значение 'Distance'
аргумент пары "имя-значение" должен быть постоянным временем компиляции и не может быть пользовательской функцией расстояния.
'SortIndices'
аргумент пары "имя-значение" не поддерживается. Выходные аргументы всегда сортируются.
Имена в аргументах пары "имя-значение" должны быть константами времени компиляции. Например, чтобы позволить пользовательскую экспоненту для расстояния Минковскего в сгенерированном коде, включайте {coder.Constant('Distance'),coder.Constant('Minkowski'),coder.Constant('P'),0}
в -args
значение codegen
(MATLAB Coder).
Отсортированный порядок связанных расстояний в сгенерированном коде может отличаться от порядка в MATLAB® из-за числовой точности.
Когда rangesearch
использует kd-алгоритм-поиска-по-дереву, и типом сборки генерации кода является MEX-функция, codegen
(MATLAB Coder) генерирует MEX-функцию с помощью Intel® Threading Building Blocks (TBB) для параллельного расчета. В противном случае, codegen
генерирует использование кода parfor
(MATLAB Coder).
MEX-функция для kd-алгоритма-поиска-по-дереву — codegen
генерирует оптимизированное использование MEX-функции Intel TBB для параллельного расчета на многожильных платформах. Можно использовать MEX-функцию, чтобы ускорить алгоритмы MATLAB. Для получения дополнительной информации на Intel TBB, см. https://software.intel.com/en-us/intel-tbb.
Если вы генерируете MEX-функцию, чтобы протестировать сгенерированный код parfor
версия, можно отключить использование Intel TBB. Установите ExtrinsicCalls
свойство настройки MEX возражает против false
. Для получения дополнительной информации смотрите coder.MexCodeConfig
(MATLAB Coder).
MEX-функция для алгоритма исчерпывающего поиска и автономного кода C/C++ для обоих алгоритмов — сгенерированный код rangesearch
использование parfor
(MATLAB Coder), чтобы создать циклы, которые запускают параллельно на поддерживаемой общей памяти многожильные платформы в сгенерированном коде. Если ваш компилятор не поддерживает интерфейс приложения Open Multiprocessing (OpenMP), или вы отключаете библиотеку OpenMP, MATLAB Coder™ обрабатывает parfor
- циклы как for
- циклы. Чтобы найти поддерживаемые компиляторы, см. Поддерживаемые Компиляторы. Чтобы отключить библиотеку OpenMP, установите EnableOpenMP
свойство настройки возражает против false
. Для получения дополнительной информации смотрите coder.CodeConfig
(MATLAB Coder).
Запуск в R2020a, rangesearch
возвращает целочисленный тип (int32
) индексы, а не индексы с двойной точностью, в сгенерированном автономном коде C/C++. Поэтому функция допускает строгую поддержку с одинарной точностью, когда вы используете входные параметры с одинарной точностью. Для генерации кода MEX функция все еще возвращает индексы с двойной точностью, чтобы совпадать с поведением MATLAB.
Для получения дополнительной информации о генерации кода смотрите Введение в Генерацию кода и Общий Рабочий процесс Генерации кода.
createns
| ExhaustiveSearcher
| KDTreeSearcher
| knnsearch
| pdist2
| rangesearch
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.