Генерация кода для поиска по ближайшему соседу

Функции объекта 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). Задайте тип данных и размерность входного параметра при помощи coder.typeof (MATLAB Coder), так что сгенерированный код принимает массив переменного размера.

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 возвращают те же результаты.

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

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

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

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

Чтобы сгенерировать код, который принимает объект модели, а также данные запроса, обозначите объект модели как константу времени компиляции при помощи coder.Constant (MATLAB Coder) и включить постоянный свернутый объект модели в -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 который принимает объект модели, данные запроса и аргументы пары "имя-значение". Можно разрешить использование необязательных аргументов имя-значение путем определения вараргина в качестве входного параметра. Для получения дополнительной информации смотрите Генерацию кода для списков аргументов переменной длины (MATLAB Coder).

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 Coder), поскольку имя аргумента пары "имя-значение" должно быть константой времени компиляции.

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 CODER)

Похожие темы