rangesearch

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

Описание

Idx = rangesearch(X,Y,r) находит весь X точки, которые являются на расстоянии r из Y 'points'. Строки 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
    {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

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

свернуть все

Входные данные в виде 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'

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

  • 'chebychev'

  • 'cityblock'

  • 'euclidean'

  • 'minkowski'

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

'kdtree' значение по умолчанию когда количество столбцов в X меньше чем или равно 10X не разреженно, и метрика расстояния является одним из допустимого '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.

Алгоритмы

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

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

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

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