Найдите всех соседей на заданном расстоянии с помощью входных данных
Найдите 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
{1x7 double}
{1x2 double}
{1x11 double}
{1x2 double}
{1x12 double}
{1x9 double}
{[ 89]}
{1x0 double}
{1x0 double}
{1x0 double}
D=10×1 cell array
{1x7 double}
{1x2 double}
{1x11 double}
{1x2 double}
{1x12 double}
{1x9 double}
{[ 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 меньше чем или равно 10X не разреженно, и метрика расстояния является одним из допустимого '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. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.