代码生成的预测使用MATLAB编码器应用机器学习模型
这个例子展示了如何生成C / c++代码的分类和回归模型预测对象通过使用MATLAB®编码器™应用程序。你也可以在命令行中使用生成代码codegen
(MATLAB编码器)。看到机器学习模型的代码生成预测在命令行获取详细信息。
有一个特定的分类和回归模型对象预测
或随机
支持代码生成功能。万博1manbetx预测使用这些对象函数需要一个训练有素的分类或回归模型对象,但对代码生成一个入口点函数不能有这些对象作为输入变量。解决这种限制使用saveLearnerForCoder
和loadLearnerForCoder
如这个例子所示。
这个流程图显示对象的代码生成工作流的功能分类和回归模型对象。
在这个例子中,你训练一个分类整体模型使用k最近邻弱学习者通过使用并保存训练模型saveLearnerForCoder
。然后,定义一个入口点函数加载已保存的模型通过使用loadLearnerForCoder
并调用对象的函数。写一个脚本测试的入口点函数。最后,通过使用MATLAB生成代码编码器应用和验证所生成的代码。
训练分类模型
加载电离层
数据集。这个数据集有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
作为一个结构数组在当前文件夹。
定义入口点函数
一个入口点函数,也称为顶级或主函数是一个函数定义为代码生成。您必须定义一个入口点函数,调用code-generation-enabled功能和生成C / c++代码的入口点函数。内的所有函数的入口点函数必须支持代码生成。万博1manbetx
在一个新文件在当前文件夹中,定义一个入口点函数命名myknnEnsemblePredict
做以下几点:
接受输入数据(
X
),文件名保存模型(文件名
),有效的名称-值对的观点预测
函数(变长度输入宗量
)。通过使用加载一个训练有素的整体模型
loadLearnerForCoder
。
从加载的模型预测标签和对应的分数。
你可以通过指定允许可选名称参数变长度输入宗量作为输入参数。有关详细信息,请参见可变长度参数列表的代码生成(MATLAB编码器)。
类型myknnEnsemblePredict.m%显示myknnEnsemblePredict的内容。m文件。
函数(标签,分数)= myknnEnsemblePredict (X,文件名,变长度输入宗量)% # codegen CompactMdl = loadLearnerForCoder(文件名);(标签,分数)=预测(CompactMdl X,变长度输入宗量{:});结束
添加% # codegen
编译器指令(或编译指示)的入口点函数函数签名后,表明您打算为MATLAB算法生成代码。添加这个指令指示MATLAB代码分析器来帮助您诊断和解决违规,将导致错误在代码生成。看到检查代码的代码分析器(MATLAB编码器)。
注意:如果单击按钮位于这个页面的右上角部分并在MATLAB中打开这个例子,然后用MATLAB打开示例文件夹。这个文件夹包含的入口点函数文件(myknnEnsemblePredict.m
)和测试文件(test_myknnEnsemblePredict.m
稍后描述)。
设置编译器
生成C / c++代码,您必须访问一个C / c++编译器配置正确。MATLAB编码器定位和使用支持,安装编译器。万博1manbetx您可以使用墨西哥人
设置
查看和更改默认编译器。更多细节,请参阅改变默认的编译器。
创建测试文件
编写一个测试脚本,该脚本调用myknnEnsemblePredict
函数。在测试脚本中,指定输入参数和参数名称-值对,你在生成的代码中使用。你使用这个测试脚本定义输入类型时自动生成代码使用MATLAB编码器应用。
在这个示例中,创建的test_myknnEnsemblePredict.m
文件在当前文件夹,如图所示。
类型test_myknnEnsemblePredict.m%显示test_myknnEnsemblePredict的内容。m文件。
% %样本数据加载负载电离层% %测试myknnEnsemblePredict[标签,分数]= myknnEnsemblePredict (X,“knnEnsemble”,“学习者”,1:13);
有关详细信息,请参见自动定义输入类型通过使用应用程序(MATLAB编码器)。
使用MATLAB编码器应用生成代码
MATLAB编码器应用从MATLAB代码生成C或c++代码。workflow-based用户界面通过代码生成过程步骤。以下步骤描述一个简单的工作流的MATLAB编码器应用。更多细节,明白了MATLAB编码器(MATLAB编码器)和通过使用MATLAB编码器应用生成C代码(MATLAB编码器)。
1。开放的MATLAB编码器的应用和选择的入口点函数文件。
在应用程序选项卡,应用程序部分,单击显示更多画廊箭头打开应用程序。下代码生成,点击MATLAB编码器。应用程序打开选择源文件页面。输入或选择的入口点函数的名称,myknnEnsemblePredict
。
点击下一个去定义输入类型页面。
2。定义输入类型
因为C使用静态类型,MATLAB编码器必须确定所有变量的属性在MATLAB文件在编译时。因此,您需要指定入口点函数输入的属性。
输入或选择测试脚本test_myknnEnsemblePredict
并点击Autodefine输入类型。
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)
。
点击下一个去检查运行时问题页面。这个可选步骤文件生成一个墨西哥人,墨西哥人功能,运行和报告问题。点击下一个去生成代码页面。
3所示。生成C代码
集构建类型墨西哥人,点击生成。应用程序生成一个墨西哥人功能,myknnEnsemblePredict_mex
。一个墨西哥人的函数是一个C / c++程序,从MATLAB是可执行的。您可以使用一个墨西哥人功能加速MATLAB算法和测试生成的代码的功能和运行时的问题。有关详细信息,请参见MATLAB算法加速(MATLAB编码器)和为什么测试墨西哥人在MATLAB函数吗?(MATLAB编码器)。
根据指定的构建类型,MATLAB编码器生成一个墨西哥人函数或独立的C / c++代码编译成静态库,动态链接库,或可执行文件。设置一个构建类型的详细信息,请参见配置构建设置(MATLAB编码器)。
点击下一个去完成工作流程页面。
4所示。检查页面完成工作流
的完成工作流程页面显示代码生成成功。这个页面还提供了一个生成项目总结和链接输出。
使用脚本生成代码
你能将一个MATLAB编码器项目相当于MATLAB命令的脚本在你定义的输入类型。然后运行脚本生成的代码。有关详细信息,请参见MATLAB编码器项目转换为MATLAB脚本(MATLAB编码器)。
在MATLAB编码器应用工具栏,点击开放操作菜单按钮:
选择转换为脚本,然后单击保存。应用程序创建的文件myknnEnsemblePredict_script.m
繁殖项目在一个配置对象和运行codegen
(MATLAB编码器)函数。
显示文件的内容myknnEnsemblePredict_script.m
。
类型myknnEnsemblePredict_script.m
从myknnEnsemblePredict % MYKNNENSEMBLEPREDICT_SCRIPT生成MEX-function myknnEnsemblePredict_mex %。从项目”myknnEnsemblePredict % %脚本生成。撮合下2017年- 11月17日。% %参见编码器,编码器。配置,编码器。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
运行脚本。
myknnEnsemblePredict_script
代码生成成功:查看报告,打开(“codegen /墨西哥人/ myknnEnsemblePredict / html / report.mldatx”)
验证生成的代码
测试一个墨西哥人函数来验证生成的代码提供了相同的功能与原始MATLAB代码。执行这个测试,运行墨西哥人使用相同的输入函数用于运行最初的MATLAB代码,然后比较结果。运行墨西哥人在MATLAB函数生成独立的代码还可以检测并修复运行时错误,更难诊断在生成独立的代码。更多细节,请参阅为什么测试墨西哥人在MATLAB函数吗?(MATLAB编码器)。
通过一些预测数据来验证myknnEnsemblePredict
和墨西哥人函数返回相同的结果。
[label1, score1] =预测(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
,允许一个小宽容。
找到(abs (score1-score3) > 1 e-12)
ans = 0 x1空双列向量
找到
返回一个空向量如果element-wise绝对的区别score1
和score3
不超过指定的公差1 e-12
。比较确认myknnEnsemblePredict
和墨西哥人函数返回相同的结果。
另请参阅
codegen
(MATLAB编码器)|saveLearnerForCoder
|loadLearnerForCoder
|learnerCoderConfigurer