exponenta event banner

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 набор данных. 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'

Создайте и используйте дерево Kd для поиска ближайших соседей. '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 является вектором 1 на n, содержащим одну строку X или Y.

  • ZJ - матрица m-на-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

Максимальное количество точек данных в конечном узле Kd-дерева, указанное как разделенная запятыми пара, состоящая из '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' для алгоритма Kd-tree), то результаты поиска эквивалентны результатам, полученным при выполнении поиска расстояния с использованием rangesearch объектная функция. В отличие от rangesearch функция, rangesearch для функции объекта требуется ExhaustiveSearcher или KDTreeSearcher объект модели.

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

.
Представлен в R2011b