主要内容

使用MATLAB编码器应用程序预测机器学习模型的代码生成

此示例显示如何使用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,...'学习者',学习者,“NumLearningCycles”,13);

使用Savelarnerforcoder.

将培训的合奏模型保存到名为的文件knnensemble.mat.在当前文件夹中。

SavelAlnerForCoder(MDL,'knnensemble'

Savelarnerforcoder.建立了完整的分类模型Mdl然后将其保存到MATLAB二进制文件中knnensemble.mat.作为当前文件夹中的结构数组。

定义入口点函数

一个入学点功能,也称为顶级小奖函数,是您为代码生成定义的函数。您必须定义一个入门点函数,可调用启用代码生成的函数,并从入口点函数生成C / C ++代码。入口点函数中的所有功能必须支持代码生成。金宝app

在当前文件夹中的新文件中,定义命名的入口点函数myknnEnsemblePredict这有以下内容:

  • 接受输入数据(X),保存模型的文件名(文件名)和有效的名称 - 值对参数预测函数(变长度输入宗量)。

  • 通过使用加载训练的集合模型loadLearnerForCoder

  • 根据加载的模型预测标签和相应的分数。

通过指定,您可以允许可选的名称值参数变长度输入宗量作为输入参数。有关详细信息,请参阅可变长度参数列表的代码生成(MATLAB编码器)

typemyknnensemblepredict.m.%显示myknensemblepredict.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您可以使用墨西哥人- setup.查看和更改默认编译器。有关更多详细信息,请参阅改变默认的编译器

创建测试文件

写一个调用的测试脚本myknnEnsemblePredict功能。在“测试脚本”中,指定在生成的代码中使用的输入参数和名称值对参数。您使用此测试脚本在使用MATLAB编码器应用程序生成代码时自动定义输入类型。

在此示例中,创建test_myknnensemblepredict.m.如图所示,文件在当前文件夹中。

typetest_myknnensemblepredict.m.%显示test_myknnensemblepredict.m文件的内容。
%% load样本数据加载电离层%% test myknnensemblepredict [标签,得分] = myknnensemblepredict(x,'knnensemble','学习者,1:13);

有关详细信息,请参阅使用应用程序自动定义输入类型(MATLAB编码器)

使用MATLAB编码器应用程序生成代码

MATLAB编码器应用程序从MATLAB®代码生成C或C ++代码。基于工作流的用户界面通过代码生成过程步骤。以下步骤描述了MATLAB代码应用程序的简要工作流程。有关更多详细信息,请参阅MATLAB编码器(MATLAB编码器)使用MATLAB编码器应用程序生成C代码(MATLAB编码器)

1.打开MATLAB代码应用程序并选择入门点函数文件。

应用程序选项卡,应用程序部分,单击展示更多箭头打开应用程序库。下代码生成,点击MATLAB编码器.应用程序打开选择源文件页面。输入或选择入口点函数的名称,myknnEnsemblePredict

点击下一个定义输入类型页面。

2.定义输入类型

因为C使用静态键入,因此MATLAB编码器必须在编译时确定MATLAB文件中所有变量的属性。因此,您需要指定入口点函数输入的属性。

输入或选择测试脚本test_myknnEnsemblePredict然后点击自动杂记输入类型

MATLAB编码器应用程序识别输入类型的myknnEnsemblePredict基于测试脚本的功能。

修改输入类型:

  • X- 应用程序的InfersX双(351x34).预测器的数量必须固定为与训练模型中的预测器数量相同。然而,你可以有不同数量的观测来进行预测。如果观测次数未知,则改变双(351x34)双(:351x34)双(infx34):.环境双(:351x34)允许观察次数达351次,且设置双(infx34):允许无界数的观察数。在此示例中,指定双(infx34):点击351并选择:INF.

  • 文件名——点击char中,选择定义常数,并使用单引号键入文件名,'knnensemble'

  • varargin {1}- 名称 - 值对参数中的名称必须是编译时常量。点击char中,选择定义常数和类型'学习者'

  • varargin {2}- 允许用户定义的指数在生成的代码中最多可达13名较弱的学习者,更改双(1x13)双(1x:13)

点击下一个检查运行时间问题页面。此可选步骤生成MEX文件,运行MEX函数,并报告问题。点击下一个生成代码页面。

3.生成C代码

构建类型到MEX并点击生成.该应用程序生成MEX功能,myknnensemblepredict_mex..MEX函数是可从MATLAB执行的C / C ++程序。您可以使用MEX功能来加速MATLAB算法并测试生成的功能和运行时问题的代码。有关详细信息,请参阅MATLAB算法加速(MATLAB编码器)为什么在MATLAB中测试MEX函数?(MATLAB编码器)

根据指定的构建类型,MATLAB Coder生成一个MEX函数或编译为静态库、动态链接库或可执行文件的独立C/ c++代码。有关设置生成类型的详细信息,请参见配置构建设置(MATLAB编码器)

点击下一个完成工作流程页面。

4.检查完成工作流页面

完成工作流程页面表示代码生成成功。此页面还提供了项目摘要和引导生成输出的链接。

使用脚本生成代码

在定义输入类型后,您可以将MATLAB编码器项目转换为MATLAB命令的等效脚本。然后您运行脚本以生成代码。有关详细信息,请参阅转换MATLAB编码器项目到MATLAB脚本(MATLAB编码器)

在MATLAB编码器应用程序工具栏上,单击开放操作菜单按钮:

选择转换为脚本,然后单击保存.应用程序创建文件myknnensemblepredict_script.m.,它在配置对象中再现项目并运行codegen(MATLAB编码器)功能。

显示文件的内容myknnensemblepredict_script.m.

typemyknnensemblepredict_script.m.
%myknnensemblepredict_script从myknnensemblepredict生成mex函数myknnensemblepredict_mex%。2017年11月17日,从项目'myknensemblepredict.prj'生成%%脚本。%%另见编码器,coder.config,coder.typeof,codegen。%% create'coder.mexcodeConfig'的configuration对象。cfg = coder.config('mex');cfg.generateReport = true;cfg.reportpotentialDifferences = false;%%定义入门点'myknensemblepredict'的参数类型。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 / eport.mldatx')。

验证生成的代码

测试MEX函数,以验证生成的代码是否提供了与原始MATLAB代码相同的功能。要执行此测试,请使用与运行原始MATLAB代码相同的输入运行MEX函数,然后比较结果。在生成独立代码之前在MATLAB中运行MEX函数,还可以检测和修复在生成的独立代码中很难诊断的运行时错误。有关更多详细信息,请参阅为什么在MATLAB中测试MEX函数?(MATLAB编码器)

传递一些预测数据来验证myknnEnsemblePredictMEX函数返回相同的结果。

[标签1,得分1] =预测(mdl,x,'学习者'、1:10);[label2, score2] = myknnEnsemblePredict (X,'knnensemble''学习者'、1:10);[label3, score3] = myknnEnsemblePredict_mex (X,'knnensemble''学习者'、1:10);

比较label1label2,label3通过使用是的

Isequal(Label1,Label2,Label3)
ans =.逻辑1

是的返回逻辑1(真正的),这意味着所有的输入都是相等的。

score3的输出可能包含舍入差值预测功能。在这种情况下,比较score1score3,允许有一个小的公差。

查找(ABS(Score1-Score3)> 1E-12)
Ans = 0x1空双列向量

找到如果元素明智的绝对差异,则返回空向量score1score3是否大于规定的公差1 e-12.比较证实了myknnEnsemblePredictMEX函数返回相同的结果。

另请参阅

|||(MATLAB编码器)

相关的话题