Найдите 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
, чьи j
th-й элемент - расстояние между наблюдениями 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. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.