exponenta event banner

Создание кода для ближайшего соседнего поисковика

Функции объекта knnsearch и rangesearch ближайших соседних объектов поиска, ExhaustiveSearcher и KDTreeSearcher, поддержка генерации кода. В этом примере показано, как создать код для поиска ближайшего соседа с помощью исчерпывающего объекта поиска в командной строке. В примере показаны два различных способа создания кода в зависимости от способа использования объекта: загрузить объект с помощью loadLearnerForCoder в функции точки входа и передать объект константы времени компиляции сгенерированному коду.

Исчерпывающий поиск ближайшего соседа поезда

Загрузите набор данных радужки Фишера.

load fisheriris

Удалить пять ирисов случайным образом из данных предиктора для использования в качестве набора запросов.

rng('default');             % 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,:);

Подготовьте исчерпывающий поиск ближайшего соседа с использованием обучающих данных. Укажите 'Distance' и 'P' аргументы пары имя-значение, чтобы использовать расстояние Минковского с степенью 1 для поиска ближайшего соседа.

Mdl = ExhaustiveSearcher(X,'Distance','minkowski','P',1);

Найти индекс обучающих данных (X), который является ближайшим соседом каждой точки в данных запроса (Y).

Idx = knnsearch(Mdl,Y);

Создать код с помощью saveLearnerForCoder и loadLearnerForCoder

Создайте код, который загружает исчерпывающий поисковик, принимает данные запроса в качестве входного аргумента, а затем находит ближайшего соседа.

Сохранение исчерпывающего поиска в файл с помощью saveLearnerForCoder.

saveLearnerForCoder(Mdl,'searcherModel')

saveLearnerForCoder сохранение модели в двоичном файле MATLAB searcherModel.mat в виде массива структуры в текущей папке.

Определение функции точки входа myknnsearch1 который принимает данные запроса в качестве входного аргумента. В функции загрузите объект поиска с помощью loadLearnerForCoder, а затем передать загруженную модель в knnsearch.

type myknnsearch1.m % Display contents of myknnsearch1.m file
function idx = myknnsearch1(Y) %#codegen
Mdl = loadLearnerForCoder('searcherModel');
idx = knnsearch(Mdl,Y);
end

Примечание.Если нажать кнопку, расположенную в правом верхнем разделе этой страницы, и открыть этот пример в MATLAB ®, то MATLAB ® откроет папку примеров. Эта папка включает файлы функций начального уровня,myknnsearch1.m, myknnsearch2.m, и myknnsearch3.m.

Создать код для myknnsearch1 с помощью codegen (Кодер MATLAB). Укажите тип данных и измерение входного аргумента с помощью coder.typeof (Кодер MATLAB), так что созданный код принимает массив переменного размера.

codegen myknnsearch1 -args {coder.typeof(Y,[Inf,4],[1,0])}
Code generation successful.

Более подробный пример создания кода с использованием saveLearnerForCoder и loadLearnerForCoder, см. Создание кода для прогнозирования модели машинного обучения в командной строке. Дополнительные сведения об указании аргументов переменного размера см. в разделе Указание аргументов переменного размера для создания кода.

Передача данных запроса (Y) для проверки того, что myknnsearch1 и файл MEX возвращает те же индексы.

myIdx1 = myknnsearch1(Y);
myIdx1_mex = myknnsearch1_mex(Y);

Выдержать сравнение myIdx1 и myIdx1_mex с помощью isequal.

verifyMEX1 = isequal(Idx,myIdx1,myIdx1_mex)
verifyMEX1 = logical
   1

isequal возвращает логический 1 (true), если все входы равны. Это сравнение подтверждает, что myknnsearch1 и файл MEX возвращает те же результаты.

Создание кода с постоянным свернутым объектом модели

Ближайшие соседние объекты поиска могут быть входным аргументом функции, определяемой для генерации кода. -args вариант codegen (Кодер MATLAB) принять объект поиска констант времени компиляции.

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

type myknnsearch2.m % Display contents of myknnsearch2.m file
function idx = myknnsearch2(Mdl,Y) %#codegen
idx = knnsearch(Mdl,Y);
end

Чтобы создать код, который принимает объект модели, а также данные запроса, обозначьте объект модели как константу времени компиляции с помощью coder.Constant (Кодер MATLAB) и включить объект модели с постоянным сгибом в -args значение codegen.

codegen myknnsearch2 -args {coder.Constant(Mdl),coder.typeof(Y,[Inf,4],[1,0])}
Code generation successful.

Рабочий процесс создания кода с постоянным свернутым объектом модели следует за общим рабочим процессом создания кода. Дополнительные сведения см. в разделе Общий рабочий процесс создания кода.

Убедитесь, что myknnsearch2 и файл MEX возвращает те же результаты.

myIdx2 = myknnsearch2(Mdl,Y);
myIdx2_mex = myknnsearch2_mex(Mdl,Y);
verifyMEX2 = isequal(Idx,myIdx2,myIdx2_mex)
verifyMEX2 = logical
   1

Создать код с аргументами пары имя-значение

Определение функции точки входа myknnsearch3 используется объект модели, данные запроса и аргументы пары имя-значение. Можно разрешить необязательные аргументы «имя-значение», указав varargin в качестве входного аргумента. Дополнительные сведения см. в разделе Создание кода для списков аргументов переменной длины (кодер MATLAB).

type myknnsearch3.m % Display contents of myknnsearch3.m file
function idx = myknnsearch3(Mdl,Y,varargin) %#codegen
idx = knnsearch(Mdl,Y,varargin{:});
end

Чтобы создать код, позволяющий задать пользовательскую степень для расстояния Минковского, включите {coder.Constant('P'),0} в -args значение codegen. Использовать coder.Constant (Кодер MATLAB), поскольку имя аргумента пары имя-значение должно быть константой времени компиляции.

codegen myknnsearch3 -args {coder.Constant(Mdl),coder.typeof(Y,[Inf,4],[1,0]),coder.Constant('P'),0}
Code generation successful.

Убедитесь, что myknnsearch3 и файл MEX возвращает те же результаты.

newIdx = knnsearch(Mdl,Y,'P',2);
myIdx3 = myknnsearch3(Mdl,Y,'P',2);
myIdx3_mex = myknnsearch3_mex(Mdl,Y,'P',2);
verifyMEX3 = isequal(newIdx,myIdx3,myIdx3_mex)
verifyMEX3 = logical
   1

См. также

| | | | | | (кодер MATLAB)

Связанные темы