Найдите 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 th наименьшее расстояние в выходных аргументах. Чтобы задать k, используйте 'K'
аргумент пары "имя-значение".
Idx
и D
m-by-1
массивы ячеек, таким образом, что каждая ячейка содержит вектор, по крайней мере, индексов k и расстояний, соответственно. Каждый вектор в D
содержит расстояния, расположенные в порядке возрастания. Каждая строка в Idx
содержит индексы самых близких соседей, соответствующих расстояниям в D
.
Пример: 'IncludeTies',true
'NSMethod'
— Самый близкий соседний метод поиска'kdtree'
| 'exhaustive'
Самый близкий соседний метод поиска в виде разделенной запятой пары, состоящей из 'NSMethod'
и одно из этих значений.
'kdtree'
— Создает и использует d-дерево K, чтобы найти самых близких соседей. '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' | Расстояние Mahalanobis, вычисленное использование положительной определенной ковариационной матрицы. Чтобы изменить значение ковариационной матрицы, используйте 'Cov' аргумент пары "имя-значение". |
'cosine' | Один минус косинус включенного угла между наблюдениями (обработанный как векторы). |
'correlation' | Один минус демонстрационная линейная корреляция между наблюдениями (обработанный как последовательности значений). |
'spearman' | Один минус порядковая корреляция демонстрационного Копьеносца между наблюдениями (обработанный как последовательности значений). |
'hamming' | Расстояние Хемминга, которое является процентом координат, которые отличаются. |
'jaccard' | Один минус коэффициент Jaccard, который является процентом ненулевых координат, которые отличаются. |
Можно также задать указатель на функцию для пользовательской метрики расстояния при помощи @
(например, @distfun
). Пользовательская функция расстояния должна:
Имейте форму function D2 = distfun(ZI,ZJ)
.
Возьмите в качестве аргументов:
1 n векторным ZI
содержа одну строку от X
или от точек запроса Y
.
m2-by-n матричный ZJ
содержа несколько строк X
или Y
.
Возвратите m2-by-1 вектор расстояний D2
, чей j
элементом th является расстояние между наблюдениями ZI
и ZJ(j,:)
.
Для получения дополнительной информации смотрите Метрики Расстояния.
Пример: 'Distance','chebychev'
'P'
— Экспонента для метрики расстояния Минковскего
(значение по умолчанию) | положительная скалярная величинаЭкспонента для метрики расстояния Минковскего в виде разделенной запятой пары, состоящей из 'P'
и положительная скалярная величина.
Этот аргумент допустим только если 'Distance'
'minkowski'
.
Пример: 'P',3
Типы данных: single
| double
'Cov'
— Ковариационная матрица для метрики расстояния Mahalanobisnancov(X)
(значение по умолчанию) | положительная определенная матрицаКовариационная матрица для метрики расстояния Mahalanobis в виде разделенной запятой пары, состоящей из 'Cov'
и положительная определенная матрица.
Этот аргумент допустим только если 'Distance'
'mahalanobis'
.
Пример: 'Cov',eye(4)
Типы данных: single
| double
'Scale'
— Значение масштабного коэффициента для стандартизированной Евклидовой метрики расстоянияnanstd(X)
(значение по умолчанию) | неотрицательный числовой векторЗначение масштабного коэффициента для стандартизированной Евклидовой метрики расстояния в виде разделенной запятой пары, состоящей из 'Scale'
и неотрицательный числовой вектор. 'Scale'
имеет длину, равную количеству столбцов в X
. Когда knnsearch
вычисляет стандартизированное Евклидово расстояние, каждую координату X
масштабируется соответствующим элементом 'Scale'
, как каждая точка запроса. Этот аргумент допустим только когда 'Distance'
'seuclidean'
.
Пример: 'Scale',quantile(X,0.75) - quantile(X,0.25)
Типы данных: single
| double
'BucketSize'
— Максимальное количество точек данных в вершине d-дерева K
(значение по умолчанию) | положительное целое числоМаксимальное количество точек данных в вершине d-дерева K в виде разделенной запятой пары, состоящей из 'BucketSize'
и положительное целое число. Этот аргумент допустим только когда NSMethod
'kdtree'
.
Пример: 'BucketSize',20
Типы данных: single
| double
'SortIndices'
— Отметьте, чтобы отсортировать возвращенные индексы согласно расстояниюtrue
(1
) (значение по умолчанию) | false
(0
)Отметьте, чтобы отсортировать возвращенные индексы согласно расстоянию в виде разделенной запятой пары, состоящей из 'SortIndices'
и любой true
(1 ) или
false
(0 ).
Для более быстрой производительности можно установить SortIndices
к false
когда следующее верно:
Y
содержит много наблюдений, которые имеют многих самых близких соседей в X
.
NSMethod
'kdtree'
.
IncludeTies
false
.
В этом случае, knnsearch
возвращает индексы самых близких соседей без определенного порядка. Когда SortIndices
true
, функция располагает индексы ближайшего соседа в порядке возрастания расстоянием.
SortIndices
true
по умолчанию. Когда NSMethod
'exhaustive'
или IncludeTies
true
, функция всегда сортирует индексы.
Пример: 'SortIndices',false
Типы данных: логический
Idx
— Индексы входных данных самых близких соседейИндексы входных данных самых близких соседей, возвращенных как числовой матричный или массив ячеек числовых векторов.
Если вы не задаете IncludeTies
ложь
по умолчанию), затем 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
ложь
по умолчанию), затем 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 - ближайших соседей.
Если вы устанавливаете knnsearch
'NSMethod'
функции аргумент пары "имя-значение" соответствующему значению (
'exhaustive'
для алгоритма исчерпывающего поиска или 'kdtree'
для алгоритма d-дерева K), затем результаты поиска эквивалентны результатам, полученным путем проведения поиска расстояния использование knnsearch
объектная функция. В отличие от knnsearch
функция, knnsearch
объектная функция требует ExhaustiveSearcher
или KDTreeSearcher
объект модели.
[1] Фридман, J. H. Дж. Бентели и Р. А. Финкель. “Алгоритм для Нахождения Лучших Соответствий в Логарифмическое Ожидаемое Время”. Транзакции ACM на Mathematical Software 3, № 3 (1977): 209–226.
Указания и ограничения по применению:
Если X
длинный массив, затем Y
не может быть длинный массив. Точно так же, если Y
длинный массив, затем X
не может быть длинный массив.
Для получения дополнительной информации смотрите Длинные массивы (MATLAB).
Указания и ограничения по применению:
Для генерации кода, значения по умолчанию 'NSMethod'
аргументом пары "имя-значение" является 'exhaustive'
когда количество столбцов в X
больше 7.
Значение 'Distance'
аргумент пары "имя-значение" должен быть постоянным временем компиляции и не может быть пользовательской функцией расстояния.
Значение 'IncludeTies'
аргументом пары "имя-значение" должно быть постоянное время компиляции.
'SortIndices'
аргумент пары "имя-значение" не поддержан. Выходные аргументы всегда сортируются.
Имена в аргументах пары "имя-значение" должны быть константами времени компиляции. Например, чтобы позволить пользовательскую экспоненту для расстояния Минковскего в сгенерированном коде, включайте {coder.Constant('Distance'),coder.Constant('Minkowski'),coder.Constant('P'),0}
в -args
значение codegen
.
Когда вы задаете 'IncludeTies'
как true
, отсортированный порядок связанных расстояний в сгенерированном коде может отличаться от порядка в MATLAB® из-за числовой точности.
Когда knnsearch
использует kd-алгоритм-поиска-по-дереву, и типом сборки генерации кода является MEX-функция, codegen
генерирует MEX-функцию с помощью Intel® Threading Building Blocks (TBB) в параллельном расчете. В противном случае, codegen
генерирует код с помощью parfor
.
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
.
MEX-функция для алгоритма исчерпывающего поиска и автономного кода C/C++ для обоих алгоритмов — сгенерированный код knnsearch
использование parfor
создать циклы, которые запускают параллельно на поддерживаемой общей памяти многожильные платформы в сгенерированном коде. Если ваш компилятор не поддерживает интерфейс приложения Open Multiprocessing (OpenMP), или вы отключаете библиотеку OpenMP, MATLAB Coder™ обрабатывает parfor
- циклы как for
- циклы. Чтобы найти поддерживаемые компиляторы, см. Поддерживаемые Компиляторы. Чтобы отключить библиотеку OpenMP, установите EnableOpenMP
свойство настройки возражает против false
. Для получения дополнительной информации смотрите coder.CodeConfig
.
Начиная в R2020a, knnsearch
возвращает целочисленный тип (int32
) индексы, а не индексы с двойной точностью, в сгенерированном автономном коде C/C++. Поэтому функция допускает строгую поддержку с одинарной точностью, когда вы используете входные параметры с одинарной точностью. Для генерации кода MEX функция все еще возвращает индексы с двойной точностью, чтобы совпадать с поведением MATLAB.
Для получения дополнительной информации о генерации кода смотрите Введение в Генерацию кода и Общий Рабочий процесс Генерации кода.
Указания и ограничения по применению:
'IncludeTies'
, 'NSMethod'
, и 'SortIndices'
аргументы пары "имя-значение" не поддержаны.
Для получения дополнительной информации смотрите функции MATLAB Запуска на графическом процессоре (Parallel Computing Toolbox).
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.