此示例显示如何使用MATLAB®Coder™应用程序生成用于预测分类和回归模型对象的C / C ++代码。您还可以使用命令行生成代码Codegen.
(MATLAB编码器).看命令行中机器学习模型预测的代码生成获取详细信息。
某些分类和回归模型对象具有一个预测
或者随机
支持代码生成的功能。金宝app使用这些对象函数预测需要训练的分类或回归模型对象,但代码生成的入口点函数不能将这些对象作为输入变量。通过使用解决这个限制的工作Savelarnerforcoder.
和loadlearnerforcoder
如本例中所述。
此流程图显示了分类和回归模型对象的对象函数的代码生成工作流。
在此示例中,您使用分类集合模型使用k- 最邻居弱学习者并通过使用保存训练的模型Savelarnerforcoder.
.然后,定义通过使用加载保存的模型的入口点函数loadlearnerforcoder
并调用对象函数。编写脚本以测试入口点函数。最后,通过使用MATLAB编码器应用程序生成代码并验证生成的代码。
加载电离层
数据集。此数据集具有34个预测器和351雷达返回的二进制响应,无论是坏的吗('B'
)或好('G'
).
负载电离层
培训分类集合模型k-最近邻弱学习器,利用随机子空间方法。关于使用随机子空间集合的分类的详细信息,请参见随机子空间分类.
RNG('默认')再现性的百分比学习者= templateknn(“NumNeighbors”,2);mdl = fitcensemble(x,y,'方法','子空间','npredtosample',5,......“学习者”学习者,'numlearnicalnicycle',13);
Savelarnerforcoder.
将培训的合奏模型保存到名为的文件knnEnsemble.mat
在您当前的文件夹中。
SavelAlnerForCoder(MDL,“knnEnsemble”)
Savelarnerforcoder.
制定完整分类模型MDL.
紧凑,然后将其保存到Matlab二进制文件knnEnsemble.mat
作为当前文件夹中的结构阵列。
一个入口点函数,又称顶级或者基本的函数,是您为代码生成定义的函数。您必须定义一个入门点函数,可调用启用代码生成的函数,并从入口点函数生成C / C ++代码。入口点函数中的所有功能必须支持代码生成。金宝app
在当前文件夹中的一个新文件中,定义命名的入口点函数myknnensemblepredict
它的作用如下:
接受输入数据(X
),所保存模型的文件名(文档名称
)和有效的名称 - 值对参数预测
功能 (varargin.
).
使用培训的集合模型loadlearnerforcoder
.
从加载模型预测标签和相应的分数。
您可以通过指定允许可选的名称 - 值参数varargin.作为输入参数。有关详细信息,请参见可变长度参数列表的代码生成(MATLAB编码器).
类型myknnensemblepredict.m.显示myknnEnsemblePredict的内容。m文件。
函数[标签,分数] = myknnensemblepredict(x,filename,varargin)%#codegen compactmdl = loadlearnerforcoder(文件名);[标签,得分] =预测(CompactMDL,X,Varargin {:});结尾
添加%#codegen.
编译器指令(或Pragma)到函数签名后的入学点函数,指示您打算为Matlab算法生成代码。添加此指令指示MATLAB代码分析仪帮助您诊断和修复在代码生成期间导致错误的违规。看使用代码分析仪检查代码(MATLAB编码器).
笔记:如果单击此页面的右上角的按钮,请在MATLAB中打开此示例,然后MATLAB打开示例文件夹。此文件夹包含入口点函数文件(myknnensemblepredict.m.
)和测试文件(test_myknnensemblepredict.m.
,后来描述)。
要生成C / C ++代码,您必须可以访问正确配置的C / C ++编译器。MATLAB编码器定位并使用支持的安装编译器。金宝app您可以使用梅克斯
设置
查看和更改默认编译器。有关详细信息,请参见更改默认编译器.
编写一个测试脚本来调用myknnensemblepredict
函数。在测试脚本中,指定在生成的代码中使用的输入参数和名称-值对参数。在使用MATLAB Coder应用程序生成代码时,可以使用此测试脚本自动定义输入类型。
在本例中,创建test_myknnensemblepredict.m.
文件,如所示。
类型test_myknnensemblepredict.m.显示test_myknnEnsemblePredict的内容。m文件。
%% load样本数据载荷电离层%% test myknnensemblepredict [标签,得分] = myknnensemblepredict(x,'knnensemble','学习者,1:13);
有关详细信息,请参见使用应用程序自动定义输入类型(MATLAB编码器).
MATLAB编码器应用程序从MATLAB代码生成C或C ++代码。基于工作流的用户界面通过代码生成过程步骤。以下步骤描述了MATLAB编码器应用程序的简要工作流程。有关详细信息,请参见Matlab编码器(MATLAB编码器)和使用MATLAB Coder App生成C代码(MATLAB编码器).
1.打开MATLAB编码器应用程序,选择入口点函数文件。
在这方面应用标签,在应用部分,单击显示更多箭头打开应用程序库。在下面代码生成, 点击Matlab编码器.该应用程序打开了选择源文件页面。输入或选择入口点函数的名称,myknnensemblepredict
.
点击下一个去定义输入类型页面。
2.定义输入类型
因为C使用静态类型,MATLAB编码器必须在编译时确定MATLAB文件中所有变量的属性。因此,您需要指定入口点函数输入的属性。
输入或选择测试脚本test_myknnensemblepredict.
然后点击Autodefine输入类型.
Matlab编码器应用程序识别输入类型myknnensemblepredict
函数基于测试脚本。
修改输入类型:
X
- 应用程序的InfersX
是双(351x34)
.必须将预测器的数量固定为与训练模型中的预测器数量相同。但是,您可以对预测具有不同的观察。如果观察数未知,则变化双(351x34)
到双(:351x34)
或者双(:INFX34)
.设置双(:351x34)
允许最多351的观察数,以及设置双(:INFX34)
允许无限数量的观察。在本例中,指定双(:INFX34)
通过点击351.
并选择:正
.
文档名称
- 点击char
, 选择定义常量,用单引号输入文件名,“knnEnsemble”
.
变长度输入宗量{1}
- 名称 - 值对参数中的名称必须是编译时常量。点击char
, 选择定义常量和类型“学习者”
.
变长度输入宗量{2}
-在生成的代码中允许用户自定义索引多达13个弱学习者,更改双(1x13)
到双(1x:13)
.
点击下一个去检查运行时问题页面。这个可选步骤生成一个MEX文件,运行MEX函数,并报告问题。点击下一个去生成代码页面。
3.生成C代码
集构建类型,单击产生.该应用程序生成一个MEX函数,myknnensemblepredict_mex.
.MEX函数是一个来自MATLAB可执行的C / C ++程序。您可以使用MEX功能来加速MATLAB算法并测试生成的功能和运行时问题的代码。有关详细信息,请参见MATLAB算法加速(MATLAB编码器)和为什么在Matlab中测试MEX函数?(MATLAB编码器).
根据指定的构建类型,MATLAB编码器生成编译到静态库,动态链接库或可执行文件的MEX函数或独立C / C ++代码。有关设置构建类型的详细信息,请参阅配置构建设置(MATLAB编码器).
点击下一个去完成工作流程页面。
4.查看完成工作流程页面
的完成工作流程页表示代码生成成功。此页面还提供了项目摘要和到生成的输出的链接。
在定义输入类型之后,您可以将MATLAB Coder项目转换为MATLAB命令的等效脚本。然后运行脚本生成代码。有关详细信息,请参见将MATLAB编码器项目转换为MATLAB脚本(MATLAB编码器).
在MATLAB编码器应用程序工具栏上,单击打开动作菜单按钮:
选择转换为脚本,然后单击节省.该应用程序创建文件myknnensemblepredict_script.m.
,它在配置对象中重新生成项目,并运行Codegen.
(MATLAB编码器)函数。
显示文件的内容myknnensemblepredict_script.m.
.
类型myknnensemblepredict_script.m.
从myknnEnsemblePredict生成MEX-function myknnEnsemblePredict_mex %。% %从项目“myknnEnsemblePredict”生成的脚本。撮合下2017年- 11月17日。% %参见CODER, CODER。配置,编码器。TYPEOF CODEGEN。%%创建类'coder.MexCodeConfig'的配置对象。cfg = coder.config(墨西哥人);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
运行脚本。
myknensemblepredict_script.
代码生成成功:要查看报告,打开('codegen/mex/myknnEnsemblePredict/html/report.mldatx')
测试MEX功能以验证生成的代码是否提供与原始MATLAB代码相同的功能。要执行此测试,请使用您用于运行原始MATLAB代码的相同输入运行MEX函数,然后比较结果。在生成独立代码之前在MATLAB中运行MEX函数也使您可以检测和修复在生成的独立代码中诊断的运行时错误。有关详细信息,请参见为什么在Matlab中测试MEX函数?(MATLAB编码器).
传递一些预测数据以验证myknnensemblepredict
MEX函数返回相同的结果。
[label1, score1] =预测(Mdl X,“学习者”,1:10);[label2,得分2] = myknensemblepredict(x,“knnEnsemble”,“学习者”,1:10);[label3,score3] = myknensemblepredict_mex(x,“knnEnsemble”,“学习者”,1:10);
相比标签1
,标签2.
, 和标签3.
通过使用isequal
.
isequal (label1 label2 label3)
ans =逻辑1
isequal
返回逻辑1(真的
),这意味着所有输入都是相等的。
的得分3.
MEX功能的输出可能包括与来自的输出相比的圆截止差异预测
函数。在这种情况下,比较得分1
和得分3.
,允许小的宽容。
查找(ABS(Score1-Score3)> 1E-12)
ans = 0x1空双列向量
找
如果元素 - 明智的绝对差异,则返回空向量得分1
和得分3.
不大于指定的公差1E-12
.比较证实了这一点myknnensemblepredict
MEX函数返回相同的结果。
Codegen.
(MATLAB编码器)|Savelarnerforcoder.
|loadlearnerforcoder
|LearnerCoderConfigurer