使用 ClassificationDiscriminant Predict 模块预测类标签
此示例说明如何在 Simulink® 中使用 ClassificationDiscriminant Predict 模块进行标签预测。该模块接受观测值(预测变量数据)并使用经过训练的判别分析分类模型返回该观测值的预测类标签、类分数和预期分类代价。要完成此示例,您可以使用提供的 Simulink 模型,或创建一个新模型。
训练分类模型
加载 humanactivity 数据集。此数据集包含 24,075 个五种人类身体活动的观测值:坐、站、走、跑和跳舞。每个观测值有 60 个特征,这些特征是从智能手机加速度计传感器测量的加速数据中提取的。
load humanactivity创建预测变量 X 作为数值矩阵,其中包含 24,075 个观测值的 60 个特征。创建类标签 Y 作为数值向量,其中包含活动 ID(整数):1、2、3、4 和 5 分别表示坐、站、走、跑和跳舞。
X = feat; Y = actid;
根据 Y 中的类信息对观测值随机分区,分为训练集和测试集,并进行分层。使用大约 80% 的观测值来训练判别分析模型,使用 20% 的观测值来测试训练模型在新数据上的性能。
rng(0,"twister") % For reproducibility of the partition cv = cvpartition(Y,"Holdout",0.20);
提取训练索引和测试索引。
trainingInds = training(cv); testInds = test(cv);
指定训练数据集和测试数据集。
XTrain = X(trainingInds,:); YTrain = Y(trainingInds); XTest = X(testInds,:); YTest = Y(testInds);
通过将训练数据 XTrain 和 YTrain 传递给 fitcdiscr 函数来训练判别分析分类模型。
daMdl = fitcdiscr(XTrain,YTrain);
daMdl 是经过训练的 ClassificationDiscriminant 模型。您可以使用圆点表示法访问 daMdl 的属性。例如,您可以输入 daMdl.ModelParameters 以获取有关训练模型参数的详细信息。
打开提供的 Simulink 模型
此示例提供 Simulink 模型 slexClassificationDAPredictExample.slx,其中包含 ClassificationDiscriminant Predict 模块。您可以打开该 Simulink 模型或按照下一节所述创建一个新模型。
打开 Simulink 模型 slexClassificationDAPredictExample.slx。
open_system("slexClassificationDAPredictExample")
当您打开 Simulink 模型时,软件会在加载模型之前运行 PreLoadFcn 回调函数中的代码。slexClassificationDAPredictExample 的 PreLoadFcn 回调函数包含代码,用于检查您的工作区是否包含训练模型的 daMdl 变量。如果工作区不包含该变量,PreLoadFcn 会加载样本数据,训练判别分析分类模型,并为 Simulink 模型创建输入信号。要查看回调函数,请在建模选项卡的设置部分中,点击模型设置并选择模型属性。然后,在回调选项卡的模型回调窗格中选择 PreLoadFcn 回调函数。
创建 Simulink 模型
要新建一个 Simulink 模型,请打开空白模型模板,并从 Statistics and Machine Learning Toolbox™ 库的 Classification 部分添加 ClassificationDiscriminant Predict 模块。
双击 ClassificationDiscriminant Predict 模块以打开“模块参数”对话框。通过指定包含该对象的工作区变量的名称,将经过训练的 ClassificationDiscriminant 模型导入该模块中。默认变量名称为 daMdl,这是您在命令行中创建的对象。
选中为预测类分数添加输出端口复选框以添加第二个输出端口 score,并选中为预期分类代价添加输出端口复选框以添加第三个输出端口 cost。点击确定。
点击刷新按钮以刷新对话框中训练模型的设置。对话框的经过训练的机器学习模型部分显示用于训练模型 daMdl 的选项。

添加一个 Inport 模块和三个 Outport 模块,并将它们连接到 ClassificationDiscriminant Predict 模块。
ClassificationDiscriminant Predict 模块期望包含 60 个预测变量值的观测值,因为模型是使用具有 60 个预测变量的数据集训练的。双击 Inport 模块,并将信号属性选项卡的端口维度设置为 60。要指定输出信号与输入信号具有相同的长度,请在 Inport 对话框的执行选项卡上将采样时间设置为 1。点击确定。
在命令行中,为 Simulink 模型创建一个结构体数组形式的输入信号。该结构体数组必须包含以下字段:
time- 观测值进入模型的时间点。其方向必须对应于预测变量数据中的观测值。在此示例中,time必须为列向量。signals- 1×1 结构体数组,用于描述输入数据并包含字段values和dimensions,其中values是预测变量数据矩阵,dimensions是预测变量数目。
为将来的预测创建一个合适的结构体数组。
modelInput.time = (0:length(YTest)-1)'; modelInput.signals(1).values = XTest; modelInput.signals(1).dimensions = size(XTest,2);
从工作区导入信号数据:
在 Simulink 中打开“配置参数”对话框。在建模选项卡的设置部分中,点击模型设置按钮的上半部分。
在数据导入/导出窗格中,选中输入复选框,并在旁边的文本框中输入
modelInput。在求解器窗格的仿真时间下,将停止时间设置为
modelInput.time(end)。在求解器选择下,将类型设置为Fixed-step,并将求解器设置为discrete (no continuous states)。这些设置使模型能够为modelInput中的每个查询点运行仿真。点击确定。
有关详细信息,请参阅加载用于仿真的信号数据 (Simulink)。
在 Simulink 中将模型保存为 slexClassificationDAPredictExample.slx。
仿真模型
仿真 Simulink 模型并将仿真输出导出到工作区。当 Inport 模块检测到观测值时,它会将观测值放入 ClassificationDiscriminant Predict 模块中。您可以使用仿真数据检查器 (Simulink)查看 Outport 模块的记录数据。
simOut = sim("slexClassificationDAPredictExample");确定仿真的分类标签。
outputs = simOut.yout;
sim_label = outputs.get("label").Values.Data;根据真实标签 (YTest) 和 Simulink 模型预测的标签 (sim_label) 创建一个混淆矩阵图。
confusionchart(string(YTest),string(sim_label))

对角线上的较大值表示相应类的预测准确。