Найдите всех соседей на заданном расстоянии с помощью входных данных
Найдите 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,:).
Сгенерируйте 5000 случайных точек из каждого из трех различных многомерных нормальных распределений. Сдвиньте средства распределений так, чтобы случайным образом сгенерированные точки, вероятно, сформировали три отдельных кластера.
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 набор данных. The 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' | Создайте и используйте K d-дерево, чтобы найти ближайших соседей.
|
'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' | Расстояние Махаланобиса, вычисленное с помощью положительной определенной ковариационной матрицы C. Значение по умолчанию C - выборочная ковариационная матрица X, в расчете на cov(X,'omitrows'). Чтобы задать другое значение для C, используйте 'Cov' аргумент пары "имя-значение". |
'cityblock' | Расстояние между блоками. |
'minkowski' | Расстояние Минковского. Экспонента по умолчанию 2. Чтобы задать другую экспоненту, используйте 'P' аргумент пары "имя-значение". |
'chebychev' | Расстояние Чебычева (максимальное различие координат). |
'cosine' | Один минус косинус включенного угла между наблюдениями (обрабатывается как векторы). |
'correlation' | Один минус выборка линейной корреляции между наблюдениями (рассматривается как последовательности значений). |
'hamming' | Расстояние Хемминга, процент разных координат. |
'jaccard' | Один минус коэффициент Жаккара, процент ненулевых координат, которые различаются. |
'spearman' | Один минус выборки корреляции ранга Спирмана между наблюдениями (рассматриваются как последовательности значений). |
| Пользовательский указатель на функцию расстояния. Функция расстояния имеет вид function D2 = distfun(ZI,ZJ) % calculation of distance ...
|
Для получения дополнительной информации см. «Метрики расстояния».
Пример: 'Distance','minkowski'
'P' - Экспонента для метрики расстояния Минковского2 (по умолчанию) | положительная скалярная величинаЭкспонента для метрики расстояния Минковского, заданная как разделенная разделенными запятой парами, состоящая из 'P' и положительная скалярная величина. Этот аргумент действителен только в том случае, если 'Distance' является 'minkowski'.
Пример: 'P',4
Типы данных: single | double
'Cov' - Ковариационная матрица для метрики расстояния Махаланобисаcov(X,'omitrows') (по умолчанию) | положительно определенную матрицуКовариационная матрица для метрики расстояния Махаланобиса, заданная как разделенная разделенными запятой парами, состоящая из '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' - Максимальное количество точек данных в конечном узле K d-дерева50 (по умолчанию) | положительный целочисленный скалярМаксимальное количество точек данных в конечном узле K d-дерева, заданное как разделенная разделенными запятой парами, состоящая из '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
Типы данных: logical
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.
Обзор алгоритма k d-дерева см. в разделе k-Ближайший Соседний Поиск с использованием Kd-дерева.
Алгоритм исчерпывающего поиска находит расстояние от каждой точки в X в каждую точку Y.
Если вы устанавливаете rangesearch функциональные 'NSMethod' Аргумент пары "имя-значение" к соответствующему значению ('exhaustive' для исчерпывающего алгоритма поиска или 'kdtree' для K алгоритма d-tree), тогда результаты поиска эквивалентны результатам, полученным путем проведения поиска на расстоянии с помощью rangesearch функция объекта. В отличие от rangesearch функции, rangesearch функция объекта требует ExhaustiveSearcher или KDTreeSearcher объект модели.
Указания и ограничения по применению:
Если X является длинный массив, тогда Y не может быть длинный массив. Точно так же, если Y является длинный массив, тогда X не может быть длинный массив.
Для получения дополнительной информации см. Раздел «Длинные массивы»
Указания и ограничения по применению:
Для генерации кода, значение по умолчанию для 'NSMethod' Аргумент пары "имя-значение" 'exhaustive' когда количество столбцов в X больше 7.
Значение 'Distance' аргумент пары "имя-значение" должен быть константой времени компиляции и не может быть пользовательской функцией расстояния.
The 'SortIndices' аргумент пары "имя-значение" не поддерживается. Выходные аргументы всегда сортируются.
Имена в аргументах пары "имя-значение" должны быть константами во время компиляции. Для примера, чтобы разрешить заданную пользователем степень для расстояния Минковского в сгенерированном коде, включите {coder.Constant('Distance'),coder.Constant('Minkowski'),coder.Constant('P'),0} в -args значение codegen (MATLAB Coder).
Отсортированный порядок связанных расстояний в сгенерированном коде может отличаться от порядка в MATLAB® из-за численной точности.
Когда rangesearch использует алгоритм поиска kd-дерева, и тип сборки генерации кода является MEX-функцией, codegen (MATLAB Coder) генерирует MEX-функцию с помощью Intel® Многопоточные базовые блоки (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. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.