使用状态流预测类标签
这个例子展示了如何使用Stateflow®图表进行标签预测。实例对Fisher虹膜数据集训练判别分析模型fitcdiscr
,并定义了一个用于代码生成的函数,该函数加载训练好的模型并预测新数据的标签。本例中的Stateflow图表接受流数据,并使用您定义的函数预测标签。
Fisher的虹膜数据集,包括在统计和机器学习工具箱™,包含物种(物种
)及测量(量
)对150份鸢尾花标本的萼片长度、萼片宽度、花瓣长度和花瓣宽度进行分析。数据集包含来自三个物种的各50个标本:濑鱼、维珍鱼和维珍鱼。
加载Fisher虹膜数据集。
负载fisheriris
转换物种
到一个索引向量,其中1、2和3分别对应setosa、versicolor和virginica。
物种= grp2idx(物种);
将数据划分为训练集和测试集。
rng (“默认”)%用于再现性Idx1 = randperm(150,75)';Idx2 = setdiff((1:150)',idx1);X = meas(idx1,:);Y = species(idx1,:);trainX = meas(idx2,:);trainY = species(idx2,:);
使用trainX
和trainY
训练一个模型,并使用X
和Y
对训练好的模型进行测试。
训练二次判别分析模型。
Mdl = fitcdiscr(trainX,trainY,“DiscrimType”,“二次”);
Mdl
是一个ClassificationDiscriminant
模型。在命令行中,可以使用Mdl
对新的观测结果进行预测。但是,您不能使用Mdl
作为代码生成函数中的输入参数。准备Mdl
在函数中加载saveLearnerForCoder
.
saveLearnerForCoder (Mdl“DiscrIris”);
saveLearnerForCoder
契约Mdl
并保存在mat文件中DiscrIris.mat
.
要在statflow模型的显示框中显示预测的物种,可以使用classdef
块在MATLAB®文件IrisSpecies.m
.
classdefIrisSpecies < Simulink。IntEnumType枚举Setosa(1) Versicolor(2) Virginica(3)结束结束
关于枚举数据的详细信息,请参见定义枚举数据类型(Stateflow).
定义一个名为mypredict.m
利用训练后的模型,从新的测量数据中预测出虹膜的种类。函数应该:
包括代码生成指令
% # codegen
在函数的某个地方。接受虹膜测量数据。除行数外,其他数据必须与X一致。
负载
DiscrIris.mat
使用loadLearnerForCoder
.返回预测的虹膜品种。
函数标签= mypredict(X)% # codegen利用判别模型预测鸢尾花的种类% mypredict预测品种的鸢尾花使用紧凑%鉴别模型在文件discriminis .mat。X行对应于%观测值和列对应预测变量。标签是%预测的物种。mdl = loadLearnerForCoder(“DiscrIris”);labelTemp =预测(mdl,X);label = IrisSpecies(labelTemp);结束
打开Simulink®模型sf_countflowers.slx
.
sfName =“sf_countflowers”;open_system (sfName);
这些图形显示了包含在状态流程图中的Simulink模型和流图。当输入节点检测到测量数据时,它将数据引导到图表中。然后,该图表预测了鸢尾花的种类,并计算了每个物种的花的数量。该图表将预测的物种返回到工作空间,并在模型中显示物种,一次显示一个。数据存储内存块NumFlowers
存储每个物种的花的数量。
图表期望接收作为结构数组的输入数据fisheririsInput
包含这些字段:
时间
-观测数据进入模型的时间点。在本例中,持续时间包括0到74之间的整数。的定位时间
必须与预测器数据中的观测值相对应。在这个例子中,时间
一定是列向量。信号
—一个1乘1的结构数组,描述输入数据并包含字段值
和维
.的值
Field是一个预测器数据的矩阵。的维
Field是预测变量的个数。
创建一个合适的鸢尾花测量结构数组。
fisheririsInput。时间= (0:74)';fishirisinput .signals.dimensions = 4;fishirisinput .signals.values = X;
您可以从更改名称fisheririsInput
,然后在模型中指定新名称。然而,Stateflow期望结构数组包含所描述的字段名。详情请参见将数据结构加载到根级输入(模型).
模拟模型。
sim (sfName)
图中显示了在处理所有观测后的模型fisheririsInput
,一次一个。预测的物种X(75年:)
virginica。濑濑、百花、维珍的数量X
分别是22 22 31。
的变量logsout
显示在工作区中。logsout
是一个SimulinkData。数据集
对象,其中包含预测的物种。从模拟日志中提取预测物种数据。
labelSF = logsout.getElement(1).Values.Data;
在命令行中使用预测物种预测
.
labelCMD = predict(Mdl,X);
比较返回的预测物种sf_countflowers
给那些召唤回来的人预测
在命令行。
isequal (labelCMD labelSF)
ans =逻辑1
isequal
返回逻辑1 (真正的
)如果所有输入都相等。这一比较证实了sf_countflowers
返回预期的结果。
如果您还拥有Simulink Coder™许可证,则可以从sf_countflowers.slx
在Simulink或从命令行使用rtwbuild
(仿真软件编码器).详情请参见为模型生成C代码(仿真软件编码器).
另请参阅
loadLearnerForCoder
|saveLearnerForCoder
|预测
|slbuild
(模型)