knnsearch

Найдите k - самые близкие соседи, использующие объект искателя

Синтаксис

Idx = knnsearch(Mdl,Y)
Idx = knnsearch(Mdl,Y,Name,Value)
[Idx,D] = knnsearch(___)

Описание

пример

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

Загрузите ирисовый набор данных Фишера.

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-nearest соседей данных о запросе для этих двух моделей.

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

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');

Увеличьте масштаб интересных мест.

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

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

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

свернуть все

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

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

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

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

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

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

Укажите необязательные аргументы в виде пар ""имя, значение"", разделенных запятыми. Имя (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'Один минус коэффициент Jaccard, который является процентом ненулевых координат, которые отличаются.
'mahalanobis'Расстояние Mahalanobis, вычисленное использование положительной определенной ковариационной матрицы. Чтобы изменить значение ковариационной матрицы, используйте аргумент пары "имя-значение" 'Cov'.
'seuclidean'Стандартизированное Евклидово расстояние. Каждое координатное различие между строками в Mdl.X и матрице запроса масштабируется путем деления на соответствующий элемент стандартного отклонения, вычисленного из Mdl.X. Чтобы задать другое масштабирование, используйте аргумент пары "имя-значение" 'Scale'.
'spearman'Один минус порядковая корреляция демонстрационного Копьеносца между наблюдениями (обработанный как последовательности значений).

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

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

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

    • 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 th наименьшее расстояние в выходных аргументах, где 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

Для d-дерева K самые близкие соседние искатели

свернуть все

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

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

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

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

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

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

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

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

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

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

свернуть все

Ковариационная матрица для метрики расстояния Mahalanobis, заданной как пара, разделенная запятой, состоящая из '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] Фридман, J. H. Bentely, J. и Finkel, R. A. (1977). “Алгоритм для Нахождения Лучших Соответствий в Логарифмическое Ожидаемое Время”. Транзакции ACM на Издании 3 Mathematical Software, Выпуске 3, сентябрь 1977, стр 209–226.

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

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