为代码生成指定适应可变参数
这个例子显示了如何指定适应输入参数生成代码的对象时的功能分类和回归模型对象。适应可变数据在运行时数据的大小可能会改变。指定适应输入参数方便当你在编译时数据和一个未知的大小。这个例子还描述了如何在一个入口点函数包含名称-值对参数以及如何指定在生成代码。
更详细的代码生成工作流示例,请参阅机器学习模型的代码生成预测在命令行和代码生成的预测使用MATLAB编码器应用机器学习模型。
训练分类模型
加载费雪的虹膜数据集。标签转换为一个字符矩阵。
负载fisheriris物种= char(物种);
使用整个数据集训练一个分类树。
Mdl = fitctree(量、种类);
Mdl
是一个ClassificationTree
模型。
保存模型使用saveLearnerForCoder
训练有素的分类树保存到文件命名ClassTreeIris.mat
通过在当前文件夹saveLearnerForCoder
。
MdlName =“ClassTreeIris”;saveLearnerForCoder (Mdl MdlName);
定义入口点函数
在当前文件夹中,定义一个入口点函数命名mypredictTree.m
做以下几点:
接受与列对应于测量
量
并接受有效的参数名称-值对。加载一个训练有素的分类树使用
loadLearnerForCoder
。预测标签和相应的分数,节点数量,分类树加载的类的数量。
你可以允许通过指定可选的名称-值对参数变长度输入宗量作为输入参数。有关详细信息,请参见可变长度参数列表的代码生成(MATLAB编码器)。
类型mypredictTree.m%显示mypredictTree内容。m文件
函数[标签,分数、节点cnum] = mypredictTree (x, savedmdl变长度输入宗量)% # codegen % mypredictTree预测虹膜物种使用分类树% mypredictTree预测虹膜物种的n观察% n-by-4矩阵x使用分类树存储在MAT-file savedmdl %的名字,然后返回的预言%数组标签。x的每一行包含长度和宽度的花瓣%和花萼虹膜(见fisheriris数据集)。对于其他输出%参数描述,看到预测参考页面。CompactMdl = loadLearnerForCoder (savedmdl);[标签,分数、节点cnum] =预测(CompactMdl x,变长度输入宗量{:});结束
注意:如果单击按钮位于这个页面的右上角部分并在MATLAB®开设这个例子,然后用MATLAB®打开示例文件夹。这个文件夹包含的入口点函数文件。
生成代码
指定适应可变参数
因为C和c++静态类型语言中,您必须确定所有变量的属性在一个入口点函数在编译时使用arg游戏
选择codegen
。
使用coder.Constant
(MATLAB编码器)指定一个编译时常量输入。
coder.Constant (v)
coder.Constant (v)
创建一个coder.Constant
类型变量的值是恒定的,一样的v
在代码生成。
使用coder.typeof
(MATLAB编码器)指定一个适应输入。
coder.typeof(example_value, size_vector, variable_dims)
的值example_value
,size_vector
,variable_dims
指定的属性输入数组生成的代码可以接受。
输入数组具有相同数据类型的示例值
example_value
。size_vector
输入数组的数组大小如果相应的variable_dims
值是假
。size_vector
是数组大小的上限,如果对应的吗variable_dims
值是真正的
。variable_dims
指定是否每个维度的数组变量大小或一个固定的大小。的值真正的
(逻辑1)意味着相应的维度有一个变量的大小;的值假
(逻辑0)意味着相应的维度有一个固定的大小。
的入口点函数mypredictTree
接受预测数据,MAT-file名称包含训练模型对象,和可选的参数名称-值对。假设您想生成代码,预测数据和接受一个适应可变数组“子树”
名称-值对参数适应可变向量的值。你有四个输入参数:预测数据,MAT-file名称,名称和值“子树”
名称-值对的论点。
定义一个4-by-1单元阵列和分配每个输入参数类型的每个单元的入口点函数。
ARGS =细胞(4,1);
第一输入使用coder.typeof
指定的双精度预测数据变量相同数量的列作为预测数据用于训练模型,但是观察的数量(行)是任意的。
p =元素个数(Mdl.PredictorNames);ARGS {1} = coder.typeof(0[正无穷,p] [1,0]);
0
为example_value
值意味着数据类型双
因为双
是默认的数值数据类型的MATLAB。(正,p)
为size_vector
价值和(1,0)
为variable_dims
值意味着第一维的大小是可变的和无限,和第二个维度的大小是固定的p
。
第二个输入MAT-file名称,必须是一个编译时常量。使用coder.Constant
指定第二个输入的类型。
ARGS {2} = coder.Constant (MdlName);
最后两个输入的名称和值“子树”
名称-值对的论点。名称-值对参数的名称必须是编译时常量。
ARGS {3} = coder.Constant (“子树”);
使用coder.typeof
指定的值“子树”
是一个双精度行向量,行向量大小的上限马克斯(Mdl.PrunedList)
。
m = max (Mdl.PruneList);ARGS {4} = coder.typeof (0, 1, m], [0,1]);
再一次,0
为example_value
值意味着数据类型双
因为双
是默认的数值数据类型的MATLAB。(1米)
为size_vector
价值和[0,1]
为variable_dims
值意味着第一维的大小是固定的1
,第二个维度是变量的大小和它的上界米
。
使用生成代码codegen
生成一个墨西哥人从入口点函数的函数mypredictTree
使用单元阵列arg游戏
,其中包括输入参数类型mypredictTree
。指定输入参数类型使用arg游戏
选择。指定的输出参数生成的入口点函数使用-nargout
选择。生成代码包含指定数量的输出参数的顺序出现在入口点函数的定义。
codegenmypredictTreearg游戏arg游戏-nargout2
代码生成成功。
codegen
生成墨西哥人的功能mypredictTree_mex
与平台相关的扩展在当前文件夹。
的预测
函数接受单精度值、双精度值,“所有”
为“子树”
名称-值对的论点。不过,您可以只指定双精度值时使用的墨西哥人函数预测,因为指定的数据类型ARGS {4}
是两倍。
验证生成的代码
预测标签随机选择的15个值使用生成的墨西哥人从训练数据功能和修剪一级的子树。比较标签从墨西哥人与预测的功能预测
。
rng (“默认”);%的再现性Xnew = datasample(量、15);[labelMEX, scoreMEX] = mypredictTree_mex (Xnew MdlName,“子树”1);[labelPREDICT, scorePREDICT] =预测(Mdl Xnew,“子树”1);labelPREDICT
labelPREDICT =15 x10 char数组‘virginica’‘virginica’‘setosa’‘virginica’的杂色的“setosa”“setosa”“杂色的”“virginica”“virginica”“setosa”“virginica”“virginica”“杂色的”“virginica”
labelMEX
labelMEX =15 x1细胞{' virginica} {‘virginica} {‘setosa} {‘virginica}{“癣”}{‘setosa} {‘setosa}{“癣”}{‘virginica} {‘virginica} {‘setosa} {‘virginica} {‘virginica}{“癣”}{' virginica '}
预测的标签是一样的墨西哥人函数标签除了数据类型。当响应数据类型字符
和codegen
不能确定的价值子树
是一个标量,那么生成的代码的输出单元阵列的特征向量。
的比较,您可以转换labelsPREDICT
一个单元阵列和使用isequal
。
cell_labelPREDICT = cellstr (labelPREDICT);verifyLabel = isequal (labelMEX cell_labelPREDICT)
verifyLabel =逻辑1
isequal
返回逻辑1 (真正的
),这意味着所有的输入都是平等的。
比较第二个输出。scoreMex
相比之下,可能包括舍入差异scorePREDICT
。在这种情况下,比较scoreMEX
和scorePREDICT
,允许一个小宽容。
找到(abs (scorePREDICT-scoreMEX) > 1 e-8)
ans = 0 x1空双列向量
找到
返回一个空向量如果element-wise绝对的区别scorePREDICT
和scoreMEX
不超过指定的公差1 e-8
。比较证实,scorePREDICT
和scoreMEX
宽容是相等的1 e-8
。
另请参阅
codegen
(MATLAB编码器)|coder.typeof
(MATLAB编码器)|loadLearnerForCoder
|coder.Constant
(MATLAB编码器)|saveLearnerForCoder
|learnerCoderConfigurer