Найдите k - ближайших соседей, использующих входные данные
возвращает Idx = knnsearch(X,Y,Name,Value)Idx с дополнительными опциями, заданными с помощью одного или нескольких аргументов пары "имя-значение". Для примера можно задать количество ближайших соседей для поиска и метрику расстояния, используемую в поиске.
Найти пациентов в hospital набор данных, который наиболее сильно похож на пациентов в Y, в зависимости от возраста и веса.
Загрузите hospital набор данных.
load hospital; X = [hospital.Age hospital.Weight]; Y = [20 162; 30 169; 40 168; 50 170; 60 171]; % New patients
Выполните knnsearch между X и Y для поиска индексов ближайших соседей.
Idx = knnsearch(X,Y);
Найти пациентов в X самый близкий по возрасту и весу к тем, кто в Y.
X(Idx,:)
ans = 5×2
25 171
25 171
39 164
49 170
50 172
Найдите 10 ближайших соседей в X в каждую точку Y, сначала с помощью метрики расстояния Минковского, а затем с помощью метрики расстояния Чебычева.
Загрузите набор данных радужки Фишера.
load fisheriris X = meas(:,3:4); % Measurements of original flowers Y = [5 1.45;6 2;2.75 .75]; % New flower data
Выполните knnsearch между X и точки запроса Y используя дистанционные метрики Минковского и Чебычева.
[mIdx,mD] = knnsearch(X,Y,'K',10,'Distance','minkowski','P',5); [cIdx,cD] = knnsearch(X,Y,'K',10,'Distance','chebychev');
Визуализируйте результаты двух ближайших соседних поисков. Постройте график обучающих данных. Постройте график точек запроса с помощью маркера X. Используйте круги, чтобы обозначить ближайших соседей Минковского. Используйте пентаграммы для обозначения ближайших соседей по Чебычеву.
gscatter(X(:,1),X(:,2),species) line(Y(:,1),Y(:,2),'Marker','x','Color','k',... 'Markersize',10,'Linewidth',2,'Linestyle','none') line(X(mIdx,1),X(mIdx,2),'Color',[.5 .5 .5],'Marker','o',... 'Linestyle','none','Markersize',10) line(X(cIdx,1),X(cIdx,2),'Color',[.5 .5 .5],'Marker','p',... 'Linestyle','none','Markersize',10) legend('setosa','versicolor','virginica','query point',... 'minkowski','chebychev','Location','best')

X - Входные данныеВходные данные, заданные как числовая матрица. Строки X соответствуют наблюдениям, а столбцы - переменным.
Типы данных: single | double
Y - Точки запросаТочки запроса, заданные как числовая матрица. Строки Y соответствуют наблюдениям, а столбцы - переменным. Y должно иметь одинаковое число столбцов как X.
Типы данных: single | double
Задайте необязательные разделенные разделенными запятой парами Name,Value аргументы. Name - имя аргумента и Value - соответствующее значение. Name должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN.
knnsearch(X,Y,'K',10,'IncludeTies',true,'Distance','cityblock') ищет 10 ближайших соседей, включая галстуки и использование городской блочной дистанции.'IncludeTies' - Флаг для включения всех ближайших соседейfalse (0) (по умолчанию) | true (1)Флаг для включения всех ближайших соседей, которые имеют одинаковое расстояние от точек запроса, заданный как разделенная разделенными запятой парами, состоящая из 'IncludeTies' и false (0) или true (1).
Если 'IncludeTies' является false, затем knnsearch выбирает наблюдение с наименьшим индексом среди наблюдений, которые имеют то же расстояние от точки запроса.
Если 'IncludeTies' является true, затем:
knnsearch включает всех ближайших соседей, расстояния которых равны k-му наименьшему расстоянию в выходных аргументах. Чтобы задать k, используйте 'K' аргумент пары "имя-значение".
Idx и D m -by- 1 массивы ячеек, такие что каждая камера содержит вектор, по меньшей мере, k индексов и расстояний, соответственно. Каждый вектор в D содержит расстояния, расположенные в порядке возрастания. Каждая строка в Idx содержит индексы ближайших соседей, соответствующие расстояниям в D.
Пример: 'IncludeTies',true
'NSMethod' - Метод поиска по ближайшему соседу'kdtree' | 'exhaustive'Метод поиска по ближайшему соседу, заданный как разделенная разделенными запятой парами, состоящая из 'NSMethod' и одно из этих значений.
'kdtree' - Создает и использует K d-дерево для поиска ближайших соседей. 'kdtree' является значением по умолчанию, когда количество столбцов в X меньше или равно 10, X не разрежен, и метрика расстояния 'euclidean', 'cityblock', 'chebychev', или 'minkowski'. В противном случае значение по умолчанию является 'exhaustive'.
Значение 'kdtree' действителен только, когда метрика расстояния является одной из четырех метрик, отмеченных выше.
'exhaustive' - Использует алгоритм исчерпывающего поиска путем вычисления значений расстояния от всех точек в X в каждую точку Y.
Пример: 'NSMethod','exhaustive'
'Distance' - Метрика расстояния'euclidean' (по умолчанию) | 'seuclidean' | 'cityblock' | 'chebychev' | 'minkowski' | 'mahalanobis' | указатель на функцию |...Метрика расстояния knnsearch использует, заданный как разделенная разделенными запятой парами, состоящая из 'Distance' и одно из значений в этой таблице или указателе на функцию.
| Значение | Описание |
|---|---|
'euclidean' | Евклидово расстояние. |
'seuclidean' | Стандартизированное евклидово расстояние. Каждая координата различия между строками в X и матрицу запросов Y масштабируется путем деления на соответствующий элемент стандартного отклонения, вычисленного из X. Чтобы задать другое масштабирование, используйте 'Scale' аргумент пары "имя-значение". |
'cityblock' | Расстояние между блоками. |
'chebychev' | Расстояние Чебычева (максимальное различие координат). |
'minkowski' | Расстояние Минковского. Экспонента по умолчанию является 2. Чтобы задать другую экспоненту, используйте 'P' аргумент пары "имя-значение". |
'mahalanobis' | Расстояние Махаланобиса, вычисленное с помощью положительной определенной ковариационной матрицы. Чтобы изменить значение ковариационной матрицы, используйте 'Cov' аргумент пары "имя-значение". |
'cosine' | Один минус косинус включенного угла между наблюдениями (обрабатывается как векторы). |
'correlation' | Один минус выборка линейной корреляции между наблюдениями (рассматривается как последовательности значений). |
'spearman' | Один минус выборки корреляции ранга Спирмана между наблюдениями (рассматриваются как последовательности значений). |
'hamming' | Расстояние Хемминга, которое является процентом различий координат. |
'jaccard' | Один минус коэффициент Жаккара, который является процентом ненулевых координат, которые различаются. |
Можно также задать указатель на функцию для пользовательской метрики расстояния при помощи @ (например, @distfun). Пользовательская функция расстояния должна:
Иметь форму function D2 = distfun(ZI,ZJ).
Примите за аргументы:
Вектор A 1 n байта ZI содержащий одну строку из X или из точек запроса Y.
Матрица m2 -by n ZJ содержит несколько строк X или Y.
Верните вектор m2 -by-1 расстояний D2, чьи jth-й элемент - расстояние между наблюдениями ZI и ZJ(j,:).
Для получения дополнительной информации см. «Метрики расстояния».
Пример: 'Distance','chebychev'
'P' - Экспонента для метрики расстояния Минковского2 (по умолчанию) | положительная скалярная величинаЭкспонента для метрики расстояния Минковского, заданная как разделенная разделенными запятой парами, состоящая из 'P' и положительная скалярная величина.
Этот аргумент действителен только в том случае, если 'Distance' является 'minkowski'.
Пример: 'P',3
Типы данных: single | double
'Cov' - Ковариационная матрица для метрики расстояния Махаланобисаcov(X,'omitrows') (по умолчанию) | положительно определенную матрицуКовариационная матрица для метрики расстояния Махаланобиса, заданная как разделенная разделенными запятой парами, состоящая из 'Cov' и положительно определенную матрицу.
Этот аргумент действителен только в том случае, если 'Distance' является 'mahalanobis'.
Пример: 'Cov',eye(4)
Типы данных: single | double
'Scale' - значение параметров для стандартизированной метрики Евклидова расстоянияstd(X,'omitnan') (по умолчанию) | неотрицательный числовой векторЗначение параметров для стандартизированной метрики Евклидова расстояния, заданное как разделенная разделенными запятой парами, состоящая из 'Scale' и неотрицательный числовой вектор. 'Scale' имеет длину, равную количеству столбцов в X. Когда knnsearch вычисляет стандартизированное евклидово расстояние, каждую координату X масштабируется соответствующим элементом 'Scale', как и каждая точка запроса. Этот аргумент действителен только при 'Distance' является 'seuclidean'.
Пример: 'Scale',quantile(X,0.75) - quantile(X,0.25)
Типы данных: single | double
'BucketSize' - Максимальное количество точек данных в конечном узле K d-дерева50 (по умолчанию) | положительное целое числоМаксимальное количество точек данных в конечном узле K d-дерева, заданное как разделенная разделенными запятой парами, состоящая из 'BucketSize' и положительное целое число. Этот аргумент действителен только при NSMethod является 'kdtree'.
Пример: 'BucketSize',20
Типы данных: single | double
'SortIndices' - Флаг для сортировки возвращенных индексов в соответствии с расстояниемtrue (1) (по умолчанию) | false (0)Флаг для сортировки возвращенных индексов в соответствии с расстоянием, заданный как разделенная разделенными запятой парами, состоящая из 'SortIndices' и любой из них true (1) или false (0).
Для более высокой эффективности можно задать SortIndices на false когда следующее имеет значение true:
Y содержит много наблюдений, которые имеют много ближайших соседей в X.
NSMethod является 'kdtree'.
IncludeTies является false.
В этом случае, knnsearch возвращает индексы ближайших соседей не в определенном порядке. Когда SortIndices является trueфункция упорядочивает индексы ближайшего соседа в порядке возрастания по расстоянию.
SortIndices является true по умолчанию. Когда NSMethod является 'exhaustive' или IncludeTies является trueфункция всегда сортирует индексы.
Пример: 'SortIndices',false
Типы данных: logical
Idx - Входные индексы данных ближайших соседейИндексы входных данных ближайших соседей, возвращенные как числовая матрица или массив ячеек из числовых векторов.
Если вы не задаете IncludeTies (false по умолчанию), затем Idx является m -by k числовой матрицей, где m - количество строк в Y и k количество искомых ближайших соседей. Idx(j,i) указывает, что X(Idx(j,i),:) является одним из k ближайших наблюдений в X к точке запроса Y(j,:).
Если вы задаете 'IncludeTies',true, затем Idx является m -by- 1 массив ячеек такой, что камера j (Idx{j}) содержит вектор, по меньшей мере, k индексов ближайших наблюдений в X к точке запроса Y(j,:).
Если SortIndices является true, затем knnsearch устанавливает индексы в порядке возрастания по расстоянию.
D - Расстояния до ближайших соседейРасстояния ближайших соседей до точек запроса, возвращенные как числовая матрица или массив ячеек из числовых векторов.
Если вы не задаете IncludeTies (false по умолчанию), затем D является m -by k числовой матрицей, где m - количество строк в Y и k количество искомых ближайших соседей. D(j,i) - расстояние между X(Idx(j,i),:) и Y(j,:) относительно метрики расстояния.
Если вы задаете 'IncludeTies',true, затем D является m -by- 1 массив ячеек такой, что камера j (D{j}) содержит вектор не менее k расстояний ближайших наблюдений в X к точке запроса Y(j,:).
Если SortIndices является true, затем knnsearch устанавливает расстояния в порядке возрастания.
Для фиксированного положительного целого k, knnsearch находит k точки в X которые являются ближайшими к каждой точке в Y. Чтобы найти все точки в X в пределах фиксированного расстояния от каждой точки в Y, использование rangesearch.
knnsearch не сохраняет объект поиска. Чтобы создать объект поиска, используйте createns.
Для получения информации об определенном алгоритме поиска смотрите k-ближайших соседей Search и Radius Search.
Если вы устанавливаете knnsearch функции 'NSMethod' Аргумент пары "имя-значение" к соответствующему значению ('exhaustive' для исчерпывающего алгоритма поиска или 'kdtree' для K алгоритма d-tree), тогда результаты поиска эквивалентны результатам, полученным путем проведения поиска на расстоянии с помощью knnsearch функция объекта. В отличие от knnsearch функции, knnsearch функция объекта требует ExhaustiveSearcher или KDTreeSearcher объект модели.
[1] Friedman, J. H., J. Bentely, and R. A. Finkel. «Алгоритм нахождения оптимальных соответствий за логарифмическое ожидаемое время». Транзакции ACM на математическом программном обеспечении 3, № 3 (1977): 209-226.
Указания и ограничения по применению:
Если X является длинный массив, тогда Y не может быть длинный массив. Точно так же, если Y является длинный массив, тогда X не может быть длинный массив.
Для получения дополнительной информации см. Раздел «Длинные массивы»
Указания и ограничения по применению:
Для генерации кода, значение по умолчанию для 'NSMethod' Аргумент пары "имя-значение" 'exhaustive' когда количество столбцов в X больше 7.
Значение 'Distance' аргумент пары "имя-значение" должен быть константой времени компиляции и не может быть пользовательской функцией расстояния.
Значение 'IncludeTies' аргумент пары "имя-значение" должен быть константой времени компиляции.
The 'SortIndices' аргумент пары "имя-значение" не поддерживается. Выходные аргументы всегда сортируются.
Имена в аргументах пары "имя-значение" должны быть константами во время компиляции. Для примера, чтобы разрешить заданную пользователем степень для расстояния Минковского в сгенерированном коде, включите {coder.Constant('Distance'),coder.Constant('Minkowski'),coder.Constant('P'),0} в -args значение codegen (MATLAB Coder).
Когда вы задаете 'IncludeTies' как true, сортированный порядок связанных расстояний в сгенерированном коде может отличаться от порядка в MATLAB® из-за численной точности.
Когда knnsearch использует алгоритм поиска kd-дерева, и тип сборки генерации кода является MEX-функцией, codegen (MATLAB Coder) генерирует MEX-функцию с помощью Intel® Многопоточные базовые блоки (TBB) для параллельных расчетов. В противном случае, codegen генерирует код используя parfor (MATLAB Coder).
MEX-функция для алгоритма поиска kd-дерева - codegen генерирует оптимизированную MEX-функцию, используя Intel TBB для параллельных расчетов на многоядерных платформах. Можно использовать MEX-функцию для ускорения алгоритмов MATLAB. Для получения дополнительной информации о Intel TBB смотрите https://software.intel.com/en-us/intel-tbb.
Если вы генерируете MEX-функцию, чтобы протестировать сгенерированный код parfor версию можно отключить при использовании Intel TBB. Установите ExtrinsicCalls свойство объекта строения MEX, чтобы false. Для получения дополнительной информации смотрите coder.MexCodeConfig (MATLAB Coder).
MEX-функция для алгоритма исчерпывающего поиска и автономный код C/C + + для обоих алгоритмов - Сгенерированный код knnsearch использование parfor (MATLAB Coder), чтобы создать циклы, которые выполняются параллельно на поддерживаемых многоядерных платформах общей памяти в сгенерированном коде. Если ваш компилятор не поддерживает интерфейс приложения Open Multiprocessing (OpenMP) или вы отключаете библиотеку OpenMP, MATLAB Coder™ обрабатывает parfor-циклы как for-циклы. Поиск поддерживаемых компиляторов см. в разделе Поддерживаемые компиляторы. Чтобы отключить библиотеку OpenMP, установите EnableOpenMP свойство объекта строения, чтобы false. Для получения дополнительной информации смотрите coder.CodeConfig (MATLAB Coder).
Начиная с R2020a, knnsearch возвращает целый тип (int32) индексы, а не индексы двойной точности, в сгенерированном автономном коде C/C + +. Поэтому функция допускает строгую поддержку с одной точностью, когда вы используете входы с одной точностью. Для генерации кода MEX функция все еще возвращает индексы двойной точности, чтобы соответствовать поведению MATLAB.
Для получения дополнительной информации о генерации кода смотрите Введение в генерацию кода и Рабочий процесс генерации общего кода.
Указания и ограничения по применению:
The 'IncludeTies', 'NSMethod', и 'SortIndices' аргументы пары "имя-значение" не поддерживаются.
Для получения дополнительной информации смотрите Запуск функций MATLAB на графическом процессоре (Parallel Computing Toolbox).
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.