Поиск всех соседей на указанном расстоянии с помощью входных данных
Найти X точки, находящиеся в пределах евклидова расстояния 1.5 каждого из Y точка. Оба X и Y являются выборками пятимерных нормально распределенных переменных.
rng('default') % For reproducibility X = randn(100,5); Y = randn(10,5); [Idx,D] = rangesearch(X,Y,1.5)
Idx=10×1 cell array
{[ 25 62 33 99 87 92 16]}
{[ 92 25]}
{[ 93 42 31 73 60 28 78 83 48 89 85]}
{[ 92 41]}
{[44 7 28 78 75 42 69 31 1 26 83 93]}
{[ 15 31 89 41 27 17 29 60 34]}
{[ 89]}
{1x0 double }
{1x0 double }
{1x0 double }
D=10×1 cell array
{[ 0.9546 1.0987 1.2730 1.3981 1.4140 1.4249 1.4822]}
{[ 1.4203 1.4558]}
{1x11 double }
{[ 1.1244 1.4672]}
{1x12 double }
{[1.2824 1.2843 1.3342 1.3469 1.4154 1.4237 1.4625 1.4626 1.4744]}
{[ 1.1739]}
{1x0 double }
{1x0 double }
{1x0 double }
При этом последние три Y баллов больше, чем 1.5 расстояние от любого X точка. X(89,:) является 1.1739 расстояние от Y(7,:), и никаких других X точка находится в пределах расстояния 1.5 из Y(7,:). X содержит 12 точки в пределах расстояния 1.5 из Y(5,:).
Создайте 5000 случайных точек из каждого из трех различных многомерных нормальных распределений. Переместите средства распределений так, чтобы случайно сгенерированные точки, вероятно, образовали три отдельных кластера.
rng('default') % For reproducibility N = 5000; dist = 10; X = [mvnrnd([0 0],eye(2),N); mvnrnd(dist*[1 1],eye(2),N); mvnrnd(dist*[-1 -1],eye(2),N)];
Для каждой точки в X, найдите точки в X которые находятся в радиусе dist вдали от точки. Для ускорения вычислений укажите, чтобы индексы ближайших соседей не были отсортированы. Выберите первую точку в X и найдите ее ближайшие соседи.
Idx = rangesearch(X,X,dist,'SortIndices',false);
x = X(1,:);
nearestPoints = X(Idx{1},:);Найти значения в X которые не являются ближайшими соседями x. Отображение этих точек одним цветом и ближайшими соседями x другого цвета. Маркировка точки x с черным, заполненным кругом.
nonNearestIdx = true(size(X,1),1);
nonNearestIdx(Idx{1}) = false;
scatter(X(nonNearestIdx,1),X(nonNearestIdx,2))
hold on
scatter(nearestPoints(:,1),nearestPoints(:,2))
scatter(x(1),x(2),'black','filled')
hold off
Найдите пациентов в patients набор данных, которые находятся в пределах определенного возраста и диапазона веса пациентов в Y.
Загрузить patients набор данных. Age значения в годах, и Weight значения в фунтах.
load patients X = [Age Weight]; Y = [20 162; 30 169; 40 168]; % New patients
Создание пользовательской функции расстояния distfun это определяет расстояние между пациентами с точки зрения возраста и веса. Например, согласно distfunДва пациента, которые разнесены на один год по возрасту и имеют одинаковый вес, находятся на одном расстоянии друг от друга. Аналогично, два пациента, которые имеют одинаковый возраст и отделены по весу на пять фунтов, также находятся на одном расстоянии друг от друга.
type distfun.m % Display contents of distfun.m file
function D2 = distfun(ZI,ZJ) ageDifference = abs(ZI(1)-ZJ(:,1)); weightDifference = abs(ZI(2)-ZJ(:,2)); D2 = ageDifference + 0.2*weightDifference; end
Примечание.Если нажать кнопку, расположенную в правой верхней части этого примера, и открыть пример в MATLAB ®, то MATLAB откроет папку примеров. Эта папка содержит файл функцииdistfun.m.
Найти пациентов в X которые находятся в пределах расстояния 2 пациентов в Y.
[Idx,D] = rangesearch(X,Y,2,'Distance',@distfun)Idx=3×1 cell array
{1x0 double}
{1x0 double}
{[ 41]}
D=3×1 cell array
{1x0 double}
{1x0 double}
{[ 1.8000]}
Третий пациент в Y является единственным, у которого есть пациент в X в пределах расстояния 2.
Отображение Age и Weight значения для ближайшего пациента в X к пациенту с возрастом 40 и вес 168.
X(Idx{3},:)ans = 1×2
39 164
X - Входные данныеВходные данные, определенные как числовая матрица mx-by-n, где каждая строка представляет одну n-мерную точку. Число столбцов n должно равняться числу столбцов в Y.
Типы данных: single | double
Y - Точки запросаТочки запроса, заданные в виде цифровой матрицы my-by-n, где каждая строка представляет одну n-мерную точку. Число столбцов n должно равняться числу столбцов в X.
Типы данных: single | double
r - Радиус поискаУкажите дополнительные пары, разделенные запятыми Name,Value аргументы. Name является именем аргумента и Value - соответствующее значение. Name должен отображаться внутри кавычек. Можно указать несколько аргументов пары имен и значений в любом порядке как Name1,Value1,...,NameN,ValueN.
rangesearch(X,Y,1.4,'Distance','seuclidean','Scale',iqr(X)) определяет поиск всех наблюдений в X в пределах расстояния 1.4 каждого наблюдения в Y, используя стандартизированное евклидово расстояние, масштабированное межквартильным диапазоном X.'NSMethod' - метод поиска ближайшего соседа'kdtree' | 'exhaustive'Метод поиска ближайшего соседа, заданный как разделенная запятыми пара, состоящая из 'NSMethod' и одно из этих значений.
| Стоимость | Описание |
|---|---|
'kdtree' | Создайте и используйте дерево Kd для поиска ближайших соседей.
|
'exhaustive' | Используйте исчерпывающий алгоритм поиска. Программное обеспечение вычисляет расстояния от всех X точки на каждый Y указать, чтобы найти ближайших соседей. |
'kdtree' является значением по умолчанию, если количество столбцов в X меньше или равно 10, X не разрежен, а метрика расстояния является одной из допустимых 'kdtree' метрики. В противном случае значением по умолчанию является 'exhaustive'.
Пример: 'NSMethod','exhaustive'
'Distance' - Метрика расстояния'euclidean' (по умолчанию) | 'seuclidean' | 'mahalanobis' | 'cityblock' | 'minkowski' | 'chebychev' | дескриптор функции |...Метрика расстояния, rangesearch использует, указанный как пара, разделенная запятыми, состоящая из 'Distance' и одно из значений в этой таблице.
| Стоимость | Описание |
|---|---|
'euclidean' | Евклидово расстояние. |
'seuclidean' | Стандартизированное евклидово расстояние. Каждая разность координат между строками в X и точка запроса масштабируется путем деления на соответствующий элемент стандартного отклонения, вычисленного из X, std(X,'omitnan'). Чтобы задать другое масштабирование, используйте 'Scale' аргумент пары имя-значение. |
'mahalanobis' | Расстояние Махаланобиса, вычисленное с использованием положительной определенной ковариационной матрицы C. Значение по умолчанию C - выборка ковариационной матрицы X, как вычислено cov(X,'omitrows'). Задание другого значения для C, используйте 'Cov' аргумент пары имя-значение. |
'cityblock' | Расстояние между городскими кварталами. |
'minkowski' | Минковская дистанция. Показатель по умолчанию: 2. Чтобы указать другую степень, используйте 'P' аргумент пары имя-значение. |
'chebychev' | Расстояние Чебычева (максимальная разность координат). |
'cosine' | Один минус косинус включенного угла между наблюдениями (рассматривается как векторы). |
'correlation' | Один минус выборочная линейная корреляция между наблюдениями (обрабатываемая как последовательности значений). |
'hamming' | Расстояние взлома, процент различающихся координат. |
'jaccard' | Один минус коэффициент Джаккарда, процент отличных от нуля координат. |
'spearman' | Один минус выборка ранговой корреляции Спирмена между наблюдениями (обрабатываемыми как последовательности значений). |
@ | Пользовательский дескриптор функции расстояния. Функция расстояния имеет вид function D2 = distfun(ZI,ZJ) % calculation of distance ...
|
Дополнительные сведения см. в разделе Метрики расстояния.
Пример: 'Distance','minkowski'
'P' - Показатель для метрики расстояния Минковского2 (по умолчанию) | положительный скалярЭкспонента для метрики расстояния Минковского, заданная как разделенная запятыми пара, состоящая из 'P' и положительный скаляр. Этот аргумент допустим только в том случае, если 'Distance' является 'minkowski'.
Пример: 'P',4
Типы данных: single | double
'Cov' - Ковариационная матрица для метрики расстояния Махаланобисаcov(X,'omitrows') (по умолчанию) | положительная определенная матрицаКовариационная матрица для метрики расстояния Махаланобиса, заданная как разделенная запятыми пара, состоящая из 'Cov' и положительная определенная матрица. Этот аргумент допустим только в том случае, если 'Distance' является 'mahalanobis'.
Пример: 'Cov',eye(4)
Типы данных: single | double
'Scale' - Значение параметра шкалы для стандартизированной евклидовой метрики расстоянияstd(X,'omitnan') (по умолчанию) | неотрицательный векторЗначение параметра масштабирования для стандартизированной евклидовой метрики расстояния, определяемой как разделенная запятыми пара, состоящая из 'Scale' и неотрицательный вектор. Scale имеет длину, равную количеству столбцов в X. Каждая разность координат между строками в X и точка запроса масштабируется соответствующим элементом Scale. Этот аргумент допустим только в том случае, если 'Distance' является 'seuclidean'.
Пример: 'Scale',iqr(X)
Типы данных: single | double
'BucketSize' - Максимальное количество точек данных в конечном узле Kd-дерева50 (по умолчанию) | целочисленный скалярМаксимальное количество точек данных в конечном узле Kd-дерева, указанное как разделенная запятыми пара, состоящая из 'BucketSize' и положительный целочисленный скаляр. Этот аргумент допустим только в том случае, если NSMethod является 'kdtree'.
Пример: 'BucketSize',20
Типы данных: single | double
'SortIndices' - Флаг для сортировки возвращенных индексов по расстояниюtrue (1) (по умолчанию) | false (0)Флаг для сортировки возвращаемых индексов по расстоянию, указанному как разделенная запятыми пара, состоящая из 'SortIndices' и либо true (1) или false (0).
Для более высокой производительности при Y содержит много наблюдений, которые имеют много ближайших точек в X, можно установить SortIndices кому false. В этом случае rangesearch возвращает индексы ближайших точек без определенного порядка. Когда SortIndices является true, функция упорядочивает индексы ближайших точек в порядке возрастания по расстоянию.
Пример: 'SortIndices',false
Типы данных: logical
Idx - Индексы ближайших точекИндексы ближайших точек, возвращаемые в виде массива ячеек числовых векторов.
Idx является my-by-1 массив ячеек, где my - количество строк в Y. Вектор Idx{j} содержит индексы точек (строк) в X чьи расстояния до Y(j,:) не более r. Если SortIndices является true, то rangesearch упорядочивает индексы в порядке возрастания по расстоянию.
D - Расстояния между ближайшими точками и точками запросаРасстояния ближайших точек до точек запроса, возвращаемые в виде массива ячеек числовых векторов.
D является my-by-1 массив ячеек, где my - количество строк в Y. D{j} содержит значения расстояния между Y(j,:) и точки (строки) в X(Idx{j},:). Если SortIndices является true, то rangesearch упорядочивает расстояния в порядке возрастания.
Для фиксированного положительного реального значения r, rangesearch находит все X точки, находящиеся на некотором расстоянии r каждого из Y точка. Чтобы найти k точек в X которые являются ближайшими к каждому Y точка, для фиксированного положительного целого числа k, используйте knnsearch.
rangesearch не сохраняет объект поиска. Чтобы создать объект поиска, используйте createns.
Обзор алгоритма kd-tree см. в разделе k-Ближайший поиск соседей с использованием Kd-дерева.
Алгоритм исчерпывающего поиска находит расстояние от каждой точки в X к каждой точке в Y.
Если установить rangesearch функция 'NSMethod' аргумент пары имя-значение к соответствующему значению ('exhaustive' для исчерпывающего алгоритма поиска или 'kdtree' для алгоритма Kd-tree), то результаты поиска эквивалентны результатам, полученным при выполнении поиска расстояния с использованием rangesearch объектная функция. В отличие от rangesearch функция, rangesearch для функции объекта требуется ExhaustiveSearcher или KDTreeSearcher объект модели.
Примечания и ограничения по использованию:
Если X является высоким массивом, то Y не может быть массивом высокого уровня. Аналогично, если Y является высоким массивом, то X не может быть массивом высокого уровня.
Дополнительные сведения см. в разделе Массивы Tall.
Примечания и ограничения по использованию:
Для создания кода используется значение по умолчанию 'NSMethod' аргумент пары имя-значение 'exhaustive' когда количество столбцов в X больше 7.
Значение 'Distance' аргумент пары имя-значение должен быть константой времени компиляции и не может быть пользовательской функцией расстояния.
'SortIndices' аргумент пары имя-значение не поддерживается. Выходные аргументы всегда сортируются.
Имена в аргументах пары имя-значение должны быть константами времени компиляции. Например, чтобы разрешить определяемую пользователем степень для расстояния Минковского в создаваемом коде, включите {coder.Constant('Distance'),coder.Constant('Minkowski'),coder.Constant('P'),0} в -args значение codegen (Кодер MATLAB).
Порядок сортировки связанных расстояний в сгенерированном коде может отличаться от порядка в MATLAB ® из-за числовой точности .
Когда rangesearch использует алгоритм поиска kd-tree, а тип построения генерации кода является функцией MEX, codegen (MATLAB Coder) генерирует функцию MEX с использованием Intel ® Threading Building Blocks (TBB) для параллельных вычислений. В противном случае codegen генерирует код с помощью parfor (Кодер MATLAB).
Функция MEX для алгоритма поиска kd-tree - codegen создает оптимизированную функцию MEX с использованием Intel TBB для параллельных вычислений на многоядерных платформах. Функцию MEX можно использовать для ускорения алгоритмов MATLAB. Подробные сведения о TBB Intel см. в разделе https://software.intel.com/en-us/intel-tbb.
При создании функции MEX для тестирования созданного кода parfor версия, вы можете отключить использование Intel TBB. Установите ExtrinsicCalls свойства объекта конфигурации MEX для false. Для получения более подробной информации см. coder.MexCodeConfig (Кодер MATLAB).
Функция MEX для алгоритма исчерпывающего поиска и автономного C/C + + кода для обоих алгоритмов - сгенерированный код rangesearch использование parfor (MATLAB Coder) для создания циклов, которые выполняются параллельно на поддерживаемых многоядерных платформах с общей памятью в сгенерированном коде. Если компилятор не поддерживает интерфейс приложения Open Multiprocessing (OpenMP) или вы отключаете библиотеку OpenMP, MATLAB Coder™ обрабатывает parfor-закольцовывает как for-контуры. Чтобы найти поддерживаемые компиляторы, см. раздел Поддерживаемые компиляторы. Чтобы отключить библиотеку OpenMP, установите EnableOpenMP свойства объекта конфигурации для false. Для получения более подробной информации см. coder.CodeConfig (Кодер MATLAB).
Начиная с R2020a, rangesearch возвращает целочисленный тип (int32) индексов, а не индексов двойной точности, в сгенерированном автономном коде C/C + +. Поэтому функция обеспечивает строгую поддержку с одной точностью при использовании входов с одной точностью. Для генерации кода MEX функция по-прежнему возвращает индексы двойной точности, соответствующие поведению MATLAB.
Дополнительные сведения о создании кода см. в разделах Введение в создание кода и Общий рабочий процесс создания кода.
createns | ExhaustiveSearcher | KDTreeSearcher | knnsearch | pdist2 | rangesearch
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.