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