主要内容

使用状态流预测类标签

这个例子展示了如何使用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,:);

使用trainXtrainY训练一个模型,并使用XY对训练好的模型进行测试。

训练二次判别分析模型。

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);

sf_countflowers_sim_open_system.png

这些图形显示了包含在状态流程图中的Simulink模型和流图。当输入节点检测到测量数据时,它将数据引导到图表中。然后,该图表预测了鸢尾花的种类,并计算了每个物种的花的数量。该图表将预测的物种返回到工作空间,并在模型中显示物种,一次显示一个。数据存储内存块NumFlowers存储每个物种的花的数量。

图表期望接收作为结构数组的输入数据fisheririsInput包含这些字段:

  • 时间-观测数据进入模型的时间点。在本例中,持续时间包括0到74之间的整数。的定位时间必须与预测器数据中的观测值相对应。在这个例子中,时间一定是列向量。

  • 信号—一个1乘1的结构数组,描述输入数据并包含字段.的Field是一个预测器数据的矩阵。的Field是预测变量的个数。

创建一个合适的鸢尾花测量结构数组。

fisheririsInput。时间= (0:74)';fishirisinput .signals.dimensions = 4;fishirisinput .signals.values = X;

您可以从更改名称fisheririsInput,然后在模型中指定新名称。然而,Stateflow期望结构数组包含所描述的字段名。详情请参见将数据结构加载到根级输入(模型)

模拟模型。

sim (sfName)

sf_countflowers_sim.png

图中显示了在处理所有观测后的模型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代码(仿真软件编码器)

另请参阅

|||(模型)

相关的话题

Baidu
map