主要内容

基于MATLAB编码器的机器学习模型预测代码生成

此示例演示如何使用MATLAB®编码器生成用于预测分类和回归模型对象的C/C++代码™ 你也可以在命令行中使用编码基因(MATLAB编码器)看见基于命令行的机器学习模型预测代码生成获取详细信息。

某些分类和回归模型对象具有预测随机支持代码生成的函数。使用这些金宝app对象函数进行预测需要经过训练的分类或回归模型对象,但代码生成的入口点函数不能将这些对象作为输入变量。通过使用saveLearnerForCoderloadLearnerForCoder如本例所述。

此流程图显示分类和回归模型对象的对象函数的代码生成工作流。

在本例中,将使用k-最近邻弱学习者,并使用saveLearnerForCoder。然后,定义一个入口点函数,使用loadLearnerForCoder并调用对象函数。编写一个脚本来测试入口点函数。最后,使用MATLAB Coder应用程序生成代码,并对生成的代码进行验证。

列车分类模型

加载电离层数据集。这个数据集有34个预测器和351个雷达回波的二进制响应,或者是坏的(“b”)还是好(“g”).

负载电离层

用遗传算法训练分类集成模型k-最近邻弱学习器,利用随机子空间方法。关于使用随机子空间集合的分类的详细信息,请参见随机子空间分类

rng(“默认”%为了再现性学习者=模板KNN(“NumNeighbors”,2); Mdl=fitcensemble(X,Y,“方法”“子空间”“NPredToSample”5....“学习者”学习者,“NumLearningCycles”,13);

保存模型使用saveLearnerForCoder

将经过训练的集成模型保存到名为knnEnsemble.mat在当前文件夹中。

saveLearnerForCoder(Mdl,“knnEnsemble”

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

定义入口点函数

一个入口点函数,又称顶级主要的,重要的函数,是为生成代码而定义的函数。必须定义一个入口点函数,该函数调用启用代码生成的函数,并从入口点函数生成C/C++代码。入口点函数中的所有函数都必须支持代码生成。金宝app

在当前文件夹中的新文件中,定义一个名为麦肯刺它的作用如下:

  • 接受输入数据(X),所保存模型的文件名(文件名),以及的有效名称-值对参数预测作用(瓦拉金).

  • 使用loadLearnerForCoder

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

您可以通过指定瓦拉金作为输入参数。有关详细信息,请参见可变长度参数列表的代码生成(MATLAB编码器)

类型Myknensemble.m显示myknnEnsemblePredict的内容。m文件。
函数[label,score]=myknensembleprotect(X,fileName,varargin)%#codegen CompactMdl=loadLearnerForCoder(fileName);[label,score]=predict(CompactMdl,X,varargin{:});终止

添加%#编码基因编译器指令(或pragma)指向函数签名后的入口点函数,以指示您打算为MATLAB算法生成代码。添加此指令将指示MATLAB代码分析器帮助您诊断和修复在代码生成过程中可能导致错误的冲突。看见使用代码分析器检查代码(MATLAB编码器)

注:如果单击此页面右上角的按钮并在MATLAB中打开此示例,则MATLAB将打开示例文件夹。此文件夹包括入口点函数文件(Myknensemble.m)和测试文件(测试_myknensemble.m,后来描述)。

设置编译器

要生成C/C++代码,您必须能够访问正确配置的C/C++编译器。MATLAB编码器定位并使用受支持的、已安装的编译器。你可以用金宝app墨西哥设置查看和更改默认编译器。有关详细信息,请参见更改默认编译器

创建测试文件

编写一个测试脚本来调用麦肯刺函数。在测试脚本中,指定在生成的代码中使用的输入参数和名称-值对参数。在使用MATLAB Coder应用程序生成代码时,可以使用此测试脚本自动定义输入类型。

在本例中,创建测试_myknensemble.m文件,如所示。

类型测试_myknensemble.m显示test_myknnEnsemblePredict的内容。m文件。
%% Load样本数据负载电离层%% Test myknnEnsemblePredict [label,score] = myknnEnsemblePredict(X,'knnEnsemble','学习者',1:13);

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

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

MATLAB编码器APP从MATLAB代码生成C或C++代码。基于工作流的用户界面使您通过代码生成过程。下面的步骤描述MATLAB编码器应用程序的简要流程。MATLAB编码器(MATLAB编码器)使用MATLAB Coder App生成C代码(MATLAB编码器)

1.打开MATLAB编码器应用程序,选择入口点函数文件。

应用程序选项卡,在应用程序部分,单击显示更多箭头打开应用程序库。在代码生成点击MATLAB编码器。应用程序将打开选择源文件第页。输入或选择入口点函数的名称,麦肯刺

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

2.定义输入类型

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

输入或选择测试脚本测试MYKNNENSEMBLE点击Autodefine输入类型

MATLAB编码器应用程序可识别麦肯刺函数基于测试脚本。

修改输入类型:

  • X-该应用程序推断出该输入X双人床(351x34)。预测值的数量必须固定为与训练模型中预测值的数量相同。但是,您可以有不同数量的观测值进行预测。如果观测值的数量未知,请更改双人床(351x34)双人床(:351x34)双人(:infx34).设置双人床(:351x34)允许最多351次观察,以及双人(:infx34)允许无限数量的观察。在本例中,指定双人(:infx34)点击351并选择:正

  • 文件名-点击烧焦选择定义常量,用单引号输入文件名,“knnEnsemble”

  • 变长度输入宗量{1}-名称-值对参数中的名称必须是编译时常量。单击烧焦选择定义常量和类型“学习者”

  • 变长度输入宗量{2}-在生成的代码中允许用户自定义索引多达13个弱学习者,更改双(1x13)双人(1x:13)

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

3.生成C代码

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

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

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

4.查看“完成工作流”页面

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

使用脚本生成代码

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

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

选择转换为脚本,然后单击拯救。应用程序将创建该文件myknensembleu script.m,它在配置对象中重新生成项目,并运行编码基因(MATLAB编码器)函数。

显示文件的内容myknensembleu script.m

类型myknensembleu 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

运行脚本。

Myknensembleu脚本
代码生成成功:要查看报告,打开('codegen/mex/myknnEnsemblePredict/html/report.mldatx')

验证生成的代码

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

传递一些预测数据以验证麦肯刺和MEX函数返回相同的结果。

[label1, score1] =预测(Mdl X,“学习者”,1:10);[label2,score2]=myknensemble(X,“knnEnsemble”“学习者”,1:10);[label3,score3]=myknensemex(X,“knnEnsemble”“学习者”,1:10);

比较标签1标签2标签3通过使用isequal

isequal (label1 label2 label3)
ans =逻辑1

isequal返回逻辑1(符合事实的),这意味着所有输入都相等。

得分3与MEX函数的输出相比,MEX函数的输出可能包含舍入差异预测函数。在这种情况下,比较得分1得分3,允许较小的公差。

查找(abs(评分1-3)>1e-12)
ans=0x1空双列向量

发现如果得分1得分3不大于规定的公差1e-12.这些比较证实了这一点麦肯刺和MEX函数返回相同的结果。

另请参阅

(MATLAB编码器)|||

相关话题