rangesearch

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

Синтаксис

Idx = rangesearch(X,Y,r)
[Idx,D] = rangesearch(X,Y,r)
[Idx,D] = rangesearch(X,Y,r,Name,Value)

Описание

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 = 10x1 cell array
    {1x7  double}
    {1x2  double}
    {1x11 double}
    {1x2  double}
    {1x12 double}
    {1x9  double}
    {[       89]}
    {1x0  double}
    {1x0  double}
    {1x0  double}

D = 10x1 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 = 3x1 cell array
    {1x0 double}
    {1x0 double}
    {[      41]}

D = 3x1 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 должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.

Пример: rangesearch(X,Y,1.4,'Distance','seuclidean','Scale',iqr(X)) задает, чтобы найти все наблюдения в X на расстоянии 1.4 каждого наблюдения в Y, с помощью стандартизированного Евклидова расстояния, масштабируемого межквартильным размахом X.

Самый близкий соседний метод поиска, заданный как пара, разделенная запятой, состоящая из 'NSMethod' и одно из этих значений.

ЗначениеОписание
'kdtree'

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

  • 'chebychev'

  • 'cityblock'

  • 'euclidean'

  • 'minkowski'

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

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

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

Метрика расстояния, которую rangesearch использует, заданный как пара, разделенная запятой, состоящая из 'Distance' и одно из значений в этой таблице.

ЗначениеОписание
'euclidean'Евклидово расстояние.
'seuclidean'Стандартизированное Евклидово расстояние. Каждое координатное различие между строкой в X и точкой запроса масштабируется путем деления на соответствующий элемент стандартного отклонения, вычисленного из X, nanstd(X). Чтобы задать другое масштабирование, используйте аргумент пары "имя-значение" 'Scale'.
'mahalanobis'Расстояние Mahalanobis, вычисленное использование положительной определенной ковариационной матрицы C. Значение по умолчанию C является матрицей выборочной ковариации X, как вычислено nancov(X). Чтобы задать различное значение для C, используйте аргумент пары "имя-значение" 'Cov'.
'cityblock'Расстояние городского квартала.
'minkowski'Расстояние Минковскего. Экспонентой по умолчанию является 2. Чтобы задать различную экспоненту, используйте аргумент пары "имя-значение" 'P'.
'chebychev'Расстояние Чебычева (максимум координируют различие).
'cosine'Один минус косинус включенного угла между наблюдениями (обработанный как векторы).
'correlation'Один минус демонстрационная линейная корреляция между наблюдениями (обработанный как последовательности значений).
'hamming'Расстояние Хемминга, процент координат, которые отличаются.
'jaccard'Один минус коэффициент Jaccard, процент ненулевых координат, которые отличаются.
'spearman'Один минус порядковая корреляция демонстрационного Копьеносца между наблюдениями (обработанный как последовательности значений).
@distfun

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

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

  • ZI является 1 n вектором, содержащим одну строку 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

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

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

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

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

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

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

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

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

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

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

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

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

Типы данных: логический

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

свернуть все

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

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.

Алгоритмы

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

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

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

Представленный в R2011b