这个例子展示了如何通过使用MATLAB®Coder™应用程序生成用于预测分类和回归模型对象的C/ c++代码。您还可以在命令行使用codegen
(MATLAB编码器).看到命令行机器学习模型预测的代码生成获取详细信息。
某些分类和回归模型对象具有预测
或随机
支持代码生成的函数。万博1manbetx使用这些对象函数进行预测需要经过训练的分类或回归模型对象,但是用于代码生成的入口点函数不能将这些对象作为输入变量。通过使用saveLearnerForCoder
而且loadLearnerForCoder
如本例所述。
该流程图显示了分类和回归模型对象的对象函数的代码生成工作流程。
在本例中,您使用k-最近邻弱学习器,并保存训练模型使用saveLearnerForCoder
.然后,定义一个入口点函数,通过使用加载保存的模型loadLearnerForCoder
并调用对象函数。编写一个脚本来测试入口点函数。最后,使用MATLAB Coder应用程序生成代码,并验证生成的代码。
加载电离层
数据集。该数据集有34个预测器和351个雷达返回的二进制响应,要么是坏的(“b”
)或好(‘g’
).
负载电离层
训练分类集成模型k-最近邻弱学习器的随机子空间方法。有关使用随机子空间集成的分类的详细信息,请参见随机子空间分类.
rng (“默认”)%用于再现性学习者= templateKNN“NumNeighbors”2);Mdl = fitcensemble(X,Y,“方法”,“子”,“NPredToSample”5,...“学习者”学习者,“NumLearningCycles”13);
saveLearnerForCoder
将训练好的集成模型保存到一个名为knnEnsemble.mat
在当前文件夹中。
saveLearnerForCoder (Mdl“knnEnsemble”)
saveLearnerForCoder
做出完整的分类模型Mdl
压缩,然后保存到MATLAB二进制文件knnEnsemble.mat
作为当前文件夹中的结构数组。
一个入口点函数,也称为顶级或主要的函数,是为代码生成而定义的函数。您必须定义一个入口点函数,该函数调用支持代码生成的函数,并从入口点函数生成C/ c++代码。入口点函数中的所有函数都必须支持代码生成。万博1manbetx
在当前文件夹中的新文件中,定义名为myknnEnsemblePredict
它的作用如下:
接受输入数据(X
),所保存模型的文件名(文件名
的有效名-值对参数预测
函数(变长度输入宗量
).
通过使用加载训练好的集成模型loadLearnerForCoder
.
从加载的模型中预测标签和相应的分数。
您可以通过指定允许可选的名称-值参数变长度输入宗量作为输入参数。详细信息请参见可变长度参数列表的代码生成(MATLAB编码器).
类型myknnEnsemblePredict.m显示myknnEnsemblePredict的内容。m文件。
function [label,score] = myknnEnsemblePredict(X,fileName,varargin) %#codegen CompactMdl = loadLearnerForCoder(fileName);[label,score] = predict(CompactMdl,X,varargin{:});结束
添加% # codegen
编译器指令(或pragma)到函数入口点之后的函数签名,以表明您打算为MATLAB算法生成代码。添加此指令将指导MATLAB代码分析器帮助您诊断和修复在代码生成过程中可能导致错误的违规行为。看到使用代码分析器检查代码(MATLAB编码器).
注意:如果单击该页右上方部分的按钮并在MATLAB中打开此示例,则MATLAB将打开示例文件夹。此文件夹包括入口点函数文件(myknnEnsemblePredict.m
)和测试文件(test_myknnEnsemblePredict.m
,后面有描述)。
要生成C/ c++代码,您必须能够访问配置正确的C/ c++编译器。MATLAB Coder定位并使用支持的,已安装的编译器。万博1manbetx你可以使用墨西哥人
设置
查看和更改默认编译器。详情请参见更改默认编译器.
方法编写测试脚本myknnEnsemblePredict
函数。在测试脚本中,指定您在生成的代码中使用的输入参数和名称-值对参数。使用此测试脚本在使用MATLAB Coder应用程序生成代码时自动定义输入类型。
在本例中,创建test_myknnEnsemblePredict.m
文件在当前文件夹中,如图所示。
类型test_myknnEnsemblePredict.m显示test_myknnEnsemblePredict的内容。m文件。
%% Load样本数据负载电离层%% Test myknnEnsemblePredict [label,score] = myknnEnsemblePredict(X,'knnEnsemble','Learners',1:13);
详细信息请参见使用App自动定义输入类型(MATLAB编码器).
MATLAB Coder应用程序从MATLAB代码生成C或c++代码。基于工作流的用户界面将引导您完成代码生成过程。以下步骤描述了MATLAB Coder应用程序的简要工作流程。有关详细信息,请参见MATLAB编码器(MATLAB编码器)而且使用MATLAB Coder App生成C代码(MATLAB编码器).
1.打开MATLAB编码器App,选择入口点函数文件。
在应用程序选项卡,在应用程序部分,单击显示更多箭头打开应用程序库。下代码生成,点击MATLAB编码器.应用程序打开选择源文件页面。输入或选择入口点函数的名称,myknnEnsemblePredict
.
点击下一个去定义输入类型页面。
2.定义输入类型
因为C使用静态类型,MATLAB Coder必须在编译时确定MATLAB文件中所有变量的属性。因此,您需要指定入口点函数输入的属性。
输入或选择测试脚本test_myknnEnsemblePredict
并点击自动定义输入类型.
的输入类型的MATLAB编码器应用程序识别myknnEnsemblePredict
基于测试脚本的函数。
修改输入类型:
X
-应用程序推断输入X
是双(351 x34)
.预测器的数量必须固定为与训练模型中的预测器数量相同。然而,你可以有不同数量的观测来进行预测。如果观察数未知,则更改双(351 x34)
来双(x34: 351)
或双(infx34):
.设置双(x34: 351)
允许最多351个观测值,并且设置双(infx34):
允许无限数量的观察。在本例中,指定双(infx34):
通过点击351
并选择:正
.
文件名
——点击字符
中,选择定义常量,并以单引号输入文件名,“knnEnsemble”
.
变长度输入宗量{1}
-名称-值对参数中的名称必须是编译时常量。点击字符
中,选择定义常量,和类型“学习者”
.
变长度输入宗量{2}
-允许用户自定义索引生成的代码中最多13个弱学习器,更改双(1 * 13)
来双(1 x: 13)
.
点击下一个去检查运行时问题页面。可选步骤:生成MEX文件、运行MEX功能、报告问题。点击下一个去生成代码页面。
3.生成C代码
集构建类型转到MEX,然后按生成.该应用程序生成一个MEX函数,myknnEnsemblePredict_mex
.MEX函数是一个C/ c++程序,可在MATLAB中执行。您可以使用MEX函数来加速MATLAB算法,并测试生成的代码的功能和运行时问题。详细信息请参见MATLAB算法加速(MATLAB编码器)而且为什么在MATLAB中测试MEX函数?(MATLAB编码器).
根据指定的构建类型,MATLAB Coder生成一个MEX函数或独立的C/ c++代码,编译为静态库、动态链接库或可执行文件。有关设置生成类型的详细信息,请参见配置生成设置(MATLAB编码器).
点击下一个去完成工作流程页面。
4.检查完成工作流页面
的完成工作流程Page表示代码生成成功。此页面还提供了项目摘要和生成输出的链接。
定义输入类型后,可以将MATLAB Coder项目转换为MATLAB命令的等效脚本。然后运行脚本生成代码。详细信息请参见转换MATLAB编码器项目到MATLAB脚本(MATLAB编码器).
在“MATLAB编码器”应用程序工具栏上,单击打开操作菜单按钮:
选择转换为脚本,然后按保存.应用程序创建文件myknnEnsemblePredict_script.m
,它将在配置对象中再现项目并运行codegen
(MATLAB编码器)函数。
显示文件的内容myknnEnsemblePredict_script.m
.
类型myknnEnsemblePredict_script.m
从myknnEnsemblePredict生成mex函数myknnEnsemblePredict_mex %。从项目myknnEnsemblePredict生成的脚本。prj' 2017年11月17日。请参见CODER, CODER。配置,编码器。TYPEOF CODEGEN。创建类'code . mexcodeconfig '的配置对象。CFG = code .config('mex');cfg。GenerateReport = true;cfg。ReportPotentialDifferences = false; %% Define argument types for entry-point 'myknnEnsemblePredict'. ARGS = cell(1,1); ARGS{1} = cell(4,1); ARGS{1}{1} = coder.typeof(0,[Inf 34],[1 0]); ARGS{1}{2} = coder.Constant('knnEnsemble'); ARGS{1}{3} = coder.Constant('Learners'); ARGS{1}{4} = coder.typeof(0,[1 13],[0 1]); %% Invoke MATLAB Coder. codegen -config cfg myknnEnsemblePredict -args ARGS{1} -nargout 2
运行脚本。
myknnEnsemblePredict_script
要查看报告,打开('codegen/mex/myknnEnsemblePredict/html/report.mldatx')。
测试一个MEX函数,以验证生成的代码提供与原始MATLAB代码相同的功能。要执行此测试,请使用与运行原始MATLAB代码相同的输入运行MEX函数,然后比较结果。在生成独立代码之前在MATLAB中运行MEX函数还使您能够检测和修复难以在生成的独立代码中诊断的运行时错误。详情请参见为什么在MATLAB中测试MEX函数?(MATLAB编码器).
传递一些预测数据来验证这一点myknnEnsemblePredict
和MEX函数返回相同的结果。
[label1,score1] = predict(Mdl,X,“学习者”、1:10);[label2,score2] = myknnEnsemblePredict(X,“knnEnsemble”,“学习者”、1:10);[label3,score3] = myknnEnsemblePredict_mex(X,“knnEnsemble”,“学习者”、1:10);
比较label1
,label2
,label3
通过使用isequal
.
isequal (label1 label2 label3)
ans =逻辑1
isequal
返回逻辑1 (真正的
),这意味着所有的输入都是相等的。
的score3
函数的输出可能包含与预测
函数。在这种情况下,比较一下score1
而且score3
,允许一个小的公差。
Find (abs(score1-score3) > 1e-12)
Ans = 0x1空双列向量
找到
之间的绝对差值,则返回空向量score1
而且score3
不大于规定的公差1 e-12
.对比证实了myknnEnsemblePredict
和MEX函数返回相同的结果。
learnerCoderConfigurer
|loadLearnerForCoder
|saveLearnerForCoder
|codegen
(MATLAB编码器)