Генерация кода для самого близкого соседнего искателя

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

Обучите исчерпывающего самого близкого соседнего искателя

Загрузите ирисовый набор данных Фишера.

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

Сгенерируйте код Используя saveCompactModel и loadCompactModel

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

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

saveCompactModel(Mdl,'searcherModel')

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

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

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

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

Сгенерируйте код для myknnsearch1 при помощи codegen. Задайте тип данных и размерность входного параметра при помощи coder.typeof так, чтобы сгенерированный код принял массив переменного размера.

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

Для более подробного примера генерации кода, который использует saveCompactModel и loadCompactModel, смотрите Генерацию кода для Прогноза Модели Машинного обучения в Командной строке. Для получения дополнительной информации об определении аргументов переменного размера, смотрите, Задают Аргументы Переменного Размера для Генерации кода.

Передайте данные о запросе (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 возвращает логическую единицу (true), если все входные параметры равны. Это сравнение подтверждает, что myknnsearch1 и файл MEX возвращают те же результаты.

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

Самые близкие соседние объекты искателя могут быть входным параметром функции, которую вы задаете для генерации кода. Опция -args codegen принимает время компиляции постоянный объект искателя.

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

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

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

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

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

Проверьте, что myknnsearch2 и файл MEX возвращают те же результаты.

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

Сгенерируйте код с Аргументами в виде пар имя-значение

Задайте функцию точки входа myknnsearch3, который берет объект модели, данные о запросе и аргументы пары "имя-значение". Можно допускать дополнительные аргументы значения имени путем определения varargin как входного параметра. Для получения дополнительной информации смотрите Генерацию кода для Списков аргументов Переменной длины (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, потому что имя аргумента пары "имя-значение" должно быть постоянным временем компиляции.

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

Проверьте, что 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

Смотрите также

| | | | | |

Похожие темы