exponenta event banner

knnsearch

Поиск k-ближайших соседей с помощью объекта поиска

Описание

пример

Idx = knnsearch(Mdl,Y) ищет ближайшего соседа (т.е. ближайшую точку, строку или наблюдение) в Mdl.X каждой точке (т.е. строке или наблюдению) в данных запроса Y с использованием исчерпывающего поиска или Kd-дерева. 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 использует выращенное Kd-дерево для поиска ближайших соседей.

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

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).

  • Взять в качестве аргументов:

    • Вектор 1-by-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

Для поисковиков ближайших соседей Kd-Tree

свернуть все

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

Для повышения производительности можно установить SortIndices кому false если выполняются следующие условия:

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

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

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

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

SortIndices является true по умолчанию. Когда Mdl является ExhaustiveSearcher объект модели или IncludeTies является 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-на-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-на-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.

Ссылки

Фридман, Дж. Х., Бентели, Дж. и Финкель, Р. А. (1977). «Алгоритм поиска наилучших совпадений за логарифмическое ожидаемое время». ACM Transactions on Mathematical Software Vol. 3, Issue 3, Sept. 1977, pp. 209-226.

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

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