rangesearch

Найдите всех соседей на заданном расстоянии с помощью входных данных

Описание

Idx = rangesearch(X,Y,r) находит все X точки, которые находятся в пределах расстояния r от Y точки. Строки X и Y соответствуют наблюдениям, а столбцы соответствуют переменным.

пример

[Idx,D] = rangesearch(X,Y,r) также возвращает расстояния между Y точки и X точки, которые находятся на расстоянии r.

пример

[Idx,D] = rangesearch(X,Y,r,Name,Value) задает дополнительные опции, используя один или несколько аргументы пары "имя-значение". Для примера можно задать метод поиска по ближайшему соседу и метрику расстояния, используемую в поиске.

Примеры

свернуть все

Найдите 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

Figure contains an axes. The axes contains 3 objects of type scatter.

Найти пациентов в 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

Входные параметры

свернуть все

Входные данные, заданные как mx -by n числовая матрица, где каждая строка представляет одну n -мерную точку. Количество n столбцов должно равняться количеству столбцов в Y.

Типы данных: single | double

Точки запроса, заданные как my -by n числовая матрица, где каждая строка представляет одну n -мерную точку. Количество n столбцов должно равняться количеству столбцов в X.

Типы данных: single | double

Радиус поиска вокруг каждой точки запроса, заданный как неотрицательный скаляр. rangesearch находит все X точки (строки), которые находятся в пределах расстояния r каждого Y точка. Смысл расстояния зависит от 'Distance' аргумент пары "имя-значение".

Типы данных: single | double

Аргументы в виде пар имя-значение

Задайте необязательные разделенные разделенными запятой парами 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'

Создайте и используйте K d-дерево, чтобы найти ближайших соседей. 'kdtree' действителен только, когда метрика расстояния является одним из следующих опций:

  • 'chebychev'

  • 'cityblock'

  • 'euclidean'

  • 'minkowski'

'exhaustive'Используйте алгоритм исчерпывающего поиска. Программа вычисляет расстояния от всех X точки на каждый Y указать, чтобы найти ближайших соседей.

'kdtree' является значением по умолчанию, когда количество столбцов в X меньше или равно 10, X не является разреженным, и метрика расстояния является одним из допустимых 'kdtree' метрики. В противном случае значение по умолчанию является 'exhaustive'.

Пример: 'NSMethod','exhaustive'

Метрика расстояния, которая 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'Один минус выборки корреляции ранга Спирмана между наблюдениями (рассматриваются как последовательности значений).
distfun

Пользовательский указатель на функцию расстояния. Функция расстояния имеет вид

function D2 = distfun(ZI,ZJ)
% calculation of distance
...
где

  • ZI вектор с n 1 байт, содержащий одну строку X или Y.

  • ZJ - матрица m -by n, содержащая несколько строк X или Y.

  • D2 является вектором m -by-1 расстояний, и D2(j) - расстояние между наблюдениями ZI и ZJ(j,:).

Для получения дополнительной информации см. «Метрики расстояния».

Пример: 'Distance','minkowski'

Экспонента для метрики расстояния Минковского, заданная как разделенная разделенными запятой парами, состоящая из 'P' и положительная скалярная величина. Этот аргумент действителен только в том случае, если 'Distance' является 'minkowski'.

Пример: 'P',4

Типы данных: single | double

Ковариационная матрица для метрики расстояния Махаланобиса, заданная как разделенная разделенными запятой парами, состоящая из 'Cov' и положительно определенную матрицу. Этот аргумент действителен только при 'Distance' является 'mahalanobis'.

Пример: 'Cov',eye(4)

Типы данных: single | double

Значение параметров для стандартизированной метрики Евклидова расстояния, заданное как разделенная разделенными запятой парами, состоящая из 'Scale' и неотрицательный вектор. Scale имеет длину, равную количеству столбцов в X. Каждое различие координат между строкой в X и точка запроса масштабируется соответствующим элементом Scale. Этот аргумент действителен только при 'Distance' является 'seuclidean'.

Пример: 'Scale',iqr(X)

Типы данных: single | double

Максимальное количество точек данных в конечном узле K d-дерева, заданное как разделенная разделенными запятой парами, состоящая из 'BucketSize' и положительный целочисленный скаляр. Этот аргумент действителен только при NSMethod является 'kdtree'.

Пример: 'BucketSize',20

Типы данных: single | double

Флаг для сортировки возвращенных индексов в соответствии с расстоянием, заданный как разделенная разделенными запятой парами, состоящая из 'SortIndices' и любой из них true (1) или false (0).

Для повышения эффективности при Y содержит много наблюдений, которые имеют много ближайших точек в X, можно задать SortIndices на false. В этом случае, rangesearch возвращает индексы ближайших точек не в определенном порядке. Когда SortIndices является trueфункция упорядочивает индексы ближайших точек в порядке возрастания по расстоянию.

Пример: 'SortIndices',false

Типы данных: logical

Выходные аргументы

свернуть все

Индексы ближайших точек, возвращенные как массив ячеек из числовых векторов.

Idx является my -by- 1 массив ячеек, где my количество строк в Y. Векторная Idx{j} содержит индексы точек (строк) в X чьи расстояния до Y(j,:) не больше r. Если SortIndices является true, затем rangesearch устанавливает индексы в порядке возрастания по расстоянию.

Расстояния между ближайшими точками и точками запроса, возвращенные как массив ячеек из числовых векторов.

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.

Алгоритмы

Альтернативная функциональность

Если вы устанавливаете rangesearch функциональные 'NSMethod' Аргумент пары "имя-значение" к соответствующему значению ('exhaustive' для исчерпывающего алгоритма поиска или 'kdtree' для K алгоритма d-tree), тогда результаты поиска эквивалентны результатам, полученным путем проведения поиска на расстоянии с помощью rangesearch функция объекта. В отличие от rangesearch функции, rangesearch функция объекта требует ExhaustiveSearcher или KDTreeSearcher объект модели.

Расширенные возможности

.
Введенный в R2011b