knnsearch

Найдите k - ближайших соседей, использующих объект searcher

Описание

пример

Idx = knnsearch(Mdl,Y) ищет ближайшего соседа (т.е. ближайшую точку, строку или наблюдение) в Mdl.X каждой точке (т.е. строке или наблюдению) в данных запроса Y использование исчерпывающего поиска или K d-дерева. knnsearch возвращает Idx, который является вектором-столбцом индексов в Mdl.X представляющий ближайших соседей.

пример

Idx = knnsearch(Mdl,Y,Name,Value) возвращает индексы ближайших точек в Mdl.X на Y с дополнительными опциями, заданными одним или несколькими Name,Value аргументы в виде пар. Например, укажите количество ближайших соседей для поиска, метрику расстояния, отличную от метрики, сохраненной в Mdl.Distance. Можно также задать, какое действие предпринять, если привязаны ближайшие расстояния.

пример

[Idx,D] = knnsearch(___) дополнительно возвращает матрицу D использование любого из входных параметров в предыдущих синтаксисах. D содержит расстояния между каждым наблюдением в Y которые соответствуют ближайшим наблюдениям в Mdl.X. По умолчанию функция упорядочивает столбцы D в порядке возрастания по близости, относительно метрики расстояния.

Примеры

свернуть все

knnsearch принимает ExhaustiveSearcher или KDTreeSearcher моделировать объекты для поиска обучающих данных для ближайших соседей к данным запроса. Система координат ExhaustiveSearcher модель вызывает исчерпывающий алгоритм поиска, и KDTreeSearcher модель задает Kd-дерево, которое knnsearch используется для поиска ближайших соседей.

Загрузите набор данных радужки Фишера. Случайным образом резервируйте пять наблюдений из данных для данных запроса.

load fisheriris
rng(1); % For reproducibility
n = size(meas,1);
idx = randsample(n,5);
X = meas(~ismember(1:n,idx),:); % Training data
Y = meas(idx,:);                % Query data

Переменная meas содержит 4 предиктора.

Вырастите четырехмерное Kd-дерево по умолчанию.

MdlKDT = KDTreeSearcher(X)
MdlKDT = 
  KDTreeSearcher with properties:

       BucketSize: 50
         Distance: 'euclidean'
    DistParameter: []
                X: [145x4 double]

MdlKDT является KDTreeSearcher объект модели. Изменить его свойства можно с помощью записи через точку.

Подготовим исчерпывающий ближайший соседний поисковик.

MdlES = ExhaustiveSearcher(X)
MdlES = 
  ExhaustiveSearcher with properties:

         Distance: 'euclidean'
    DistParameter: []
                X: [145x4 double]

MdlKDT является ExhaustiveSearcher объект модели. Он содержит опции, такие как метрика расстояния, которая используется для поиска ближайших соседей.

Также можно вырастить Kd-дерево или подготовить исчерпывающий ближайший соседний поисковик с помощью createns.

Поиск обучающих данных по индексам ближайших соседей, которые соответствуют каждому наблюдению запроса. Выполните оба типа поиска с помощью настроек по умолчанию. По умолчанию количество соседей, которые будут искать за наблюдение запроса, 1.

IdxKDT = knnsearch(MdlKDT,Y);
IdxES = knnsearch(MdlES,Y);
[IdxKDT IdxES]
ans = 5×2

    17    17
     6     6
     1     1
    89    89
   124   124

При этом результаты поиска те же.

Вырастите объект Kd-дерева, ближайший к соседу, используя createns функция. Передайте объект и запросите данные в knnsearch функция для поиска k-ближайших соседей.

Загрузите набор данных радужки Фишера.

load fisheriris

Удалите пять ирисов случайным образом из данных предиктора для использования в качестве набора запросов.

rng(1);                     % For reproducibility
n = size(meas,1);           % Sample size
qIdx = randsample(n,5);     % Indices of query data
tIdx = ~ismember(1:n,qIdx); % Indices of training data
Q = meas(qIdx,:);
X = meas(tIdx,:);

Вырастите четырехмерное Kd-дерево с помощью обучающих данных. Задайте расстояние Минковского для нахождения ближайших соседей.

Mdl = createns(X,'Distance','minkowski')
Mdl = 
  KDTreeSearcher with properties:

       BucketSize: 50
         Distance: 'minkowski'
    DistParameter: 2
                X: [145x4 double]

Потому что X имеет четыре столбца, и метрика расстояния Минковский, createns создает KDTreeSearcher объект модели по умолчанию. Показатель расстояния Минковского 2 по умолчанию.

Найдите индексы обучающих данных (Mdl.X), которые являются двумя ближайшими соседями каждой точки в данных запроса (Q).

IdxNN = knnsearch(Mdl,Q,'K',2)
IdxNN = 5×2

    17     4
     6     2
     1    12
    89    66
   124   100

Каждая строка IdxNN соответствует наблюдению данных запроса, и порядок столбца соответствует порядку ближайших соседей относительно возрастающего расстояния. Например, на основе расстояния Минковского, второго ближайшего соседа Q(3,:) является X(12,:).

Загрузите набор данных радужки Фишера.

load fisheriris

Удалите пять ирисов случайным образом из данных предиктора для использования в качестве набора запросов.

rng(4);                     % For reproducibility
n = size(meas,1);           % Sample size
qIdx = randsample(n,5);     % Indices of query data
X = meas(~ismember(1:n,qIdx),:);
Y = meas(qIdx,:);

Вырастите четырехмерное Kd-дерево с помощью обучающих данных. Задайте расстояние Минковского для нахождения ближайших соседей.

Mdl = KDTreeSearcher(X);

Mdl является KDTreeSearcher объект модели. По умолчанию метрика расстояния для нахождения ближайших соседей является евклидовой метрикой.

Найдите индексы обучающих данных (X), которые являются семью ближайшими соседями каждой точки в данных запроса (Y).

[Idx,D] = knnsearch(Mdl,Y,'K',7,'IncludeTies',true);

Idx и D являются пятиэлементными массивами ячеек векторов, причем каждый вектор имеет по меньшей мере семь элементов.

Отобразите длины векторов в Idx.

cellfun('length',Idx)
ans = 5×1

     8
     7
     7
     7
     7

Потому что камера 1 содержит вектор с длиной больше k = 7, наблюдение запроса 1 (Y(1,:)) одинаково близко по крайней мере к двум наблюдениям в X.

Отображение индексов ближайших соседей к Y(1,:) и их расстояния.

nn5 = Idx{1}
nn5 = 1×8

    91    98    67    69    71    93    88    95

nn5d = D{1}
nn5d = 1×8

    0.1414    0.2646    0.2828    0.3000    0.3464    0.3742    0.3873    0.3873

Обучающие наблюдения 88 и 95 находится на расстоянии 0,3873 см от наблюдения за запросами 1.

Обучите два KDTreeSearcher моделирует, используя различные метрики расстояния, и сравнивает k-ближайшие соседи данных запросов для этих двух моделей.

Загрузите набор данных радужки Фишера. Рассмотрим измерения лепестка как предикторы.

load fisheriris
X = meas(:,3:4); % Predictors
Y = species;     % Response

Обучите KDTreeSearcher моделировать объект при помощи предикторов. Задайте расстояние Минковского с показателем 5.

KDTreeMdl = KDTreeSearcher(X,'Distance','minkowski','P',5)
KDTreeMdl = 
  KDTreeSearcher with properties:

       BucketSize: 50
         Distance: 'minkowski'
    DistParameter: 5
                X: [150x2 double]

Найдите 10 ближайших соседей из X в точку запроса (newpoint), сначала используя метрики расстояния Минковского, затем Чебычева. Точка запроса должна иметь ту же размерность столбца, что и данные, используемые для обучения модели.

newpoint = [5 1.45];
[IdxMk,DMk] = knnsearch(KDTreeMdl,newpoint,'k',10);
[IdxCb,DCb] = knnsearch(KDTreeMdl,newpoint,'k',10,'Distance','chebychev');

IdxMk и IdxCb представляют собой матрицы 1 на 10, содержащие индексы строк X соответствует ближайшим соседям по newpoint использование дистанций Минковского и Чебычева, соответственно. Элемент (1,1) является ближайшим, элемент (1,2) является следующим ближайшим и так далее.

Постройте график обучающих данных, точки запроса и ближайших соседей.

figure;
gscatter(X(:,1),X(:,2),Y);
title('Fisher''s Iris Data -- Nearest Neighbors');
xlabel('Petal length (cm)');
ylabel('Petal width (cm)');
hold on
plot(newpoint(1),newpoint(2),'kx','MarkerSize',10,'LineWidth',2);   % Query point 
plot(X(IdxMk,1),X(IdxMk,2),'o','Color',[.5 .5 .5],'MarkerSize',10); % Minkowski nearest neighbors
plot(X(IdxCb,1),X(IdxCb,2),'p','Color',[.5 .5 .5],'MarkerSize',10); % Chebychev nearest neighbors
legend('setosa','versicolor','virginica','query point',...
   'minkowski','chebychev','Location','Best');

Figure contains an axes. The axes with title Fisher's Iris Data -- Nearest Neighbors contains 6 objects of type line. These objects represent setosa, versicolor, virginica, query point, minkowski, chebychev.

Изменение масштаба точек интереса.

h = gca; % Get current axis handle.
h.XLim = [4.5 5.5];
h.YLim = [1 2];
axis square;

Figure contains an axes. The axes with title Fisher's Iris Data -- Nearest Neighbors contains 6 objects of type line. These objects represent setosa, versicolor, virginica, query point, minkowski, chebychev.

Несколько наблюдений равны, из-за чего на графике идентифицируются только восемь ближайших соседей.

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

свернуть все

Ближайший соседний искатель, заданный как ExhaustiveSearcher или KDTreeSearcher объект модели, соответственно.

Если Mdl является ExhaustiveSearcher модель, затем knnsearch ищет ближайших соседей с помощью исчерпывающего поиска. В противном случае, knnsearch использует выросшее K d-дерево для поиска ближайших соседей .

Запрос данных, заданный как числовая матрица.

Y является m -by - K матрицей. Строки Y соответствуют наблюдениям (то есть примерам), а столбцы соответствуют предикторам (то есть переменным или функциям). Y должны иметь одинаковое число столбцов в качестве обучающих данных, хранящихся в Mdl.X.

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

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

Задайте необязательные разделенные разделенными запятой парами Name,Value аргументы. Name - имя аргумента и Value - соответствующее значение. Name должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN.

Пример: 'K',2,'Distance','minkowski' задает, чтобы найти двух ближайших соседей Mdl.X в каждую точку Y и использовать метрику расстояния Минковского.
Для обоих ближайших соседних искателей

свернуть все

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

Для обоих типов ближайших соседних искателей, knnsearch поддерживает эти метрики расстояния.

ЗначениеОписание
'chebychev'Расстояние Чебычева (максимальное различие координат).
'cityblock'Расстояние между блоками.
'euclidean'Евклидово расстояние.
'minkowski'Расстояние Минковского. Экспонента по умолчанию является 2. Чтобы задать другую экспоненту, используйте 'P' аргумент пары "имя-значение".

Если Mdl является ExhaustiveSearcher объект модели, затем knnsearch также поддерживает эти метрики расстояния.

ЗначениеОписание
'correlation'Один минус выборка линейной корреляции между наблюдениями (рассматривается как последовательности значений).
'cosine'Один минус косинус включенного угла между наблюдениями (рассматривается как векторы-строки).
'hamming'Расстояние Хемминга, которое является процентом различий координат.
'jaccard'Один минус коэффициент Жаккара, который является процентом ненулевых координат, которые различаются.
'mahalanobis'Расстояние Махаланобиса, вычисленное с помощью положительной определенной ковариационной матрицы. Чтобы изменить значение ковариационной матрицы, используйте 'Cov' аргумент пары "имя-значение".
'seuclidean'Стандартизированное евклидово расстояние. Каждая координата различия между строками в Mdl.X и матрица запросов масштабируется путем деления на соответствующий элемент стандартного отклонения, вычисленного из Mdl.X. Чтобы задать другое масштабирование, используйте 'Scale' аргумент пары "имя-значение".
'spearman'Один минус выборки корреляции ранга Спирмана между наблюдениями (рассматриваются как последовательности значений).

Если Mdl является ExhaustiveSearcher объект модели, затем можно также задать указатель на функцию для пользовательской метрики расстояния при помощи @ (например, @distfun). Функция пользовательского расстояния должна:

  • Иметь форму function D2 = distfun(ZI,ZJ).

  • Примите за аргументы:

    • Вектор A 1 K байта ZI содержащий одну строку из Mdl.X или Y, где K - количество столбцов Mdl.X.

    • Матрица m -by K ZJ содержит несколько строк Mdl.X или Y, где m является положительным целым числом.

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

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

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

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

Если IncludeTies является true, затем:

  • knnsearch включает всех ближайших соседей, чьи расстояния равны k-му наименьшему расстоянию в выходных аргументах, где k - количество искомых ближайших соседей, заданное 'K' аргумент пары "имя-значение".

  • Idx и D m -by- 1 массивы ячеек, такие что каждая камера содержит вектор, по меньшей мере, k индексов и расстояний, соответственно. Каждый вектор в D содержит расположенные расстояния в порядке возрастания. Каждая строка в Idx содержит индексы ближайших соседей, соответствующие расстояниям в D.

Если IncludeTies является false, затем knnsearch выбирает наблюдение с наименьшим индексом среди наблюдений, которые имеют то же расстояние от точки запроса.

Пример: 'IncludeTies',true

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

Пример: 'K',2

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

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

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

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

Для K d-Tree Ближайших Соседних Искателей

свернуть все

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

Для более высокой эффективности можно задать SortIndices на false когда следующее имеет значение true:

  • Y содержит много наблюдений, которые имеют много ближайших соседей в X.

  • Mdl является KDTreeSearcher объект модели.

  • IncludeTies является false.

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

SortIndices является true по умолчанию. Когда Mdl является ExhaustiveSearcherобъект модели является trueфункция всегда сортирует индексы.

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

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

Для исчерпывающих ближайших соседних поисковиков

свернуть все

Ковариационная матрица для метрики расстояния Махаланобиса, заданная как разделенная разделенными запятой парами, состоящая из 'Cov' и положительно определенную матрицу. Cov является K -by- K матрицей, где K - количество столбцов Mdl.X. Если вы задаете Cov и не указывать 'Distance','mahalanobis', затем knnsearch возвращает сообщение об ошибке.

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

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

Значение параметров для стандартизированной метрики Евклидова расстояния, заданное как разделенная разделенными запятой парами, состоящая из 'Scale' и неотрицательный числовой вектор. Scale имеет K длины, где K - количество столбцов Mdl.X.

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

Пример: 'Scale',quantile(Mdl.X,0.75) - quantile(Mdl.X,0.25)

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

Примечание

Если вы задаете 'Distance', 'Cov', 'P', или 'Scale', затем Mdl.Distance и Mdl.DistParameter не изменяйте значение.

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

свернуть все

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

  • Если вы не задаете IncludeTies (false по умолчанию), затем Idx является m -by k числовой матрицей, где m - количество строк в Y и k количество искомых ближайших соседей, заданное 'K' аргумент пары "имя-значение". Idx(j,i) указывает, что Mdl.X(Idx(j,i),:) является одним из k ближайших наблюдений в Mdl.X в Y(j,:) наблюдения запросов.

  • Если вы задаете 'IncludeTies',true, затем Idx является m -by- 1 массив ячеек такой, что камера j (Idx{j}) содержит вектор, по меньшей мере, k индексов ближайших наблюдений в Mdl.X в Y(j,:) наблюдения запросов.

Если SortIndices является true, затем knnsearch устанавливает индексы в порядке возрастания по расстоянию.

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

  • Если вы не задаете IncludeTies (false по умолчанию), затем D является m -by k числовой матрицей, где m - количество строк в Y и k количество искомых ближайших соседей, заданное 'K' аргумент пары "имя-значение". D(j,i) - расстояние между Mdl.X(Idx(j,i),:) и Y(j,:) наблюдения запросов относительно метрики расстояния.

  • Если вы задаете 'IncludeTies',true, затем D является m -by- 1 массив ячеек такой, что камера j (D{j}) содержит вектор не менее k расстояний ближайших наблюдений в Mdl.X в Y(j,:) наблюдения запросов.

Если SortIndices является true, затем knnsearch устанавливает расстояния в порядке возрастания.

Совет

knnsearch находит k (положительное целое число) точки в Mdl.X которые являются k ближайшими для каждого Y точка. Напротив, rangesearch находит все точки в Mdl.X которые находятся на расстоянии r (положительная скалярная величина) каждого Y точка.

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

  • knnsearch является функцией объекта, которая требует ExhaustiveSearcher или KDTreeSearcher моделировать объект и данные запроса. При эквивалентных условиях, knnsearch объект возвращает те же результаты, что и функция knnsearch функция, когда вы задаете аргумент пары "имя-значение" 'NSMethod','exhaustive' или 'NSMethod','kdtree', соответственно.

  • Для k - ближайшей соседней классификации смотрите fitcknn и ClassificationKNN.

Ссылки

[1] Friedman, J. H., Bentely, J., and Finkel, R. A. (1977). «Алгоритм нахождения оптимальных соответствий за логарифмическое ожидаемое время». Транзакции ACM на математическом программном обеспечении Vol. 3, Issue 3, Sept. 1977, pp. 209-226.

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

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