主要内容

使用MATLAB Coder App生成机器学习模型预测代码

这个例子展示了如何使用MATLAB®Coder™应用程序生成分类和回归模型对象的预测C/ c++代码codegen(MATLAB编码器).看到机器学习模型在命令行预测的代码生成详情请参阅。

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

该流程图展示了分类和回归模型对象的对象函数的代码生成流程。

在本例中,您使用以下方法训练分类集成模型K-最近邻弱学习者,使用保存训练模型saveLearnerForCoder.然后,定义一个入口点函数,通过使用loadLearnerForCoder并调用对象函数。编写一个脚本来测试入口点函数。最后使用MATLAB Coder应用程序生成代码,并对生成的代码进行验证。

训练分类模型

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

负载电离层

用。训练分类集成模型K-采用随机子空间方法对最近邻弱学习者进行学习。有关使用随机子空间集合的分类的详细信息,请参见随机子空间分类

rng (“默认”)%的再现性学习者= templateKNN (“纽曼尼斯堡”,2); Mdl=fitcensemble(X,Y,“方法”,“子”,“NPredToSample”5,...“学习者”学习者“NumLearningCycles”13);

使用保存模型saveLearnerForCoder

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

saveLearnerForCoder (Mdl“knensemble”)

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

定义入口点函数

入口点函数,也称为顶级函数,是为代码生成而定义的函数。您必须定义一个入口点函数来调用支持代码生成的函数,并从入口点函数生成C/ c++代码。入口点函数中的所有函数必须支持代码生成。金宝app

在当前文件夹的新文件中,定义一个名为myknnEnsemblePredict这样做的目的如下:

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

  • 使用。加载训练过的集成模型loadLearnerForCoder

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

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

类型myknnEnsemblePredict.m%显示MyKNensemblePredict.m文件的内容。
function [label,score] = myknnEnsemblePredict(X,fileName,varargin) %#codegen CompactMdl = loadLearnerForCoder(fileName);(标签,分数)=预测(CompactMdl X,变长度输入宗量{:});结束

添加% # 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_myknensemblePredict.m文件的内容。
%%加载样本数据加载电离层%%Test MyKNensemblePredict[标签,分数]=MyKNensemblePredict(X,'KNensemble','Learners',1:13);

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

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

MATLAB Coder应用程序从MATLAB代码生成C或c++代码。基于工作流的用户界面引导您完成代码生成过程。下面的步骤描述了MATLAB Coder应用程序的简短工作流MATLAB编码器(MATLAB编码器)使用MATLAB Coder应用程序生成C代码(MATLAB编码器)

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

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

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

2.定义输入类型

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

输入或选择测试脚本test_myknnEnsemblePredict并点击自动定义输入类型

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

修改输入类型:

  • X-应用程序推断输入X双(351 x34).预测器的数量必须固定为与训练模型中的预测器数量相同。然而,你可以有不同数量的观测来进行预测。如果观测次数未知,则改变双(351 x34)双(x34: 351)双(infx34):. 背景双(x34: 351)允许观察次数达351次,且设置双(infx34):允许无限数量的观察。在本例中,指定双(infx34):通过点击351选择:inf

  • 文件名——点击字符中,选择定义常数,并用单引号键入文件名,“knensemble”

  • varargin{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.检查完成工作流页面

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

使用脚本生成代码

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

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

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

显示文件的内容myknnEnsemblePredict_script.m

类型myknnEnsemblePredict_script.m
%MyKNensemblePredict_脚本从MyKNensemblePredict生成MEX函数MyKNensemblePredict_MEX%。%%脚本从2017年11月17日的项目“MyKNensemblePredict.prj”生成。%%另请参见CODER、CODER.CONFIG、CODER.TYPEOF、CODEGEN。%%创建类“CODER.mexcodecodeconfig”.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('knensemble');ARGS{1}{3}=coder.Constant('Learners');ARGS{1}=typer(0]),[1]);%%调用MATLAB Coder.codegen-config cfg myknensemblePredict-args args{1}-nargout 2

运行脚本。

myknnEnsemblePredict_script
代码生成成功:要查看报告,请打开('codegen/mex/myknensembleprodict/html/report.mldatx')

验证生成的代码

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

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

[label1,score1]=预测(Mdl,X,“学习者”、1:10);[label2, score2] = myknnEnsemblePredict (X,“knensemble”,“学习者”、1:10);[label3, score3] = myknnEnsemblePredict_mex (X,“knensemble”,“学习者”、1:10);

比较label1,label2,label3利用等质量

等质量(label1、label2、label3)
ans=必然的1.

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

这个score3的输出可能包含舍入差值预测函数。在本例中,比较score1score3,允许有一个小的公差。

找到(abs (score1-score3) > 1 e-12)
Ans = 0x1空双列向量

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

另见

(MATLAB编码器)|||

相关的话题