Функции объекта 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
ExhaustiveSearcher
| KDTreeSearcher
| knnsearch
| loadLearnerForCoder
| rangesearch
| saveLearnerForCoder
| codegen
(MATLAB CODER)