这个示例展示了如何使用支持向量机(SVM)模型生成对数据进行分类的代码。万博1manbetx使用数字和范畴预测器训练模型。
因为代码生成不支持范畴谓词,所以使用万博1manbetxdummyvar
在拟合SVM分类器之前,将分类预测器转换为数字虚拟变量。在向训练过的模型传递新数据时,必须以类似的方式预处理数据。
加载病人
属性创建一个表舒张压
和收缩压
数值变量。表中的每一行对应一个不同的患者。
负载病人台=表(舒张压、收缩压);头(台)
ans =8×2表舒张压收缩压_____ ________ 93 124 77 109 83 125 75 117 80 122 70 121 88 130 82 115
转换性别
变量,分类
变量。类别的顺序categoricalGender
很重要,因为它决定了预测器数据中列的顺序。使用dummyvar
将分类变量转换为0和1的矩阵,其中a1
的价值(i, j)
第项表明我
病人属于j
类别。
categoricalGender =分类(性别);orderGender =类别(categoricalGender)
orderGender =2 x1细胞{'女'}{‘男性’}
dummyGender = dummyvar (categoricalGender);
注意:由此产生的dummyGender
矩阵是秩亏的。根据您所训练的模型的类型,这种等级缺陷可能会产生问题。例如,在训练线性模型时,去掉虚拟变量的第一列。
创建一个包含哑变量的表dummyGender
与相应的变量标题。组合这个新表资源描述
。
tblGender = array2table (dummyGender,“VariableNames”,orderGender);tbl =;头(台)
ans =8×4表________ ________舒张收缩女性男性____ ____ 93 124 0 1 77 109 0 0 1 83 125 75 117 0 1 0 80 122 70 121 0 1 0 88 130 82 115 0 1
转换SelfAssessedHealthStatus
变量,分类
变量。请注意目录中类别的顺序categoricalHealth
,并将该变量转换为数值矩阵dummyvar
。
categoricalHealth =分类(SelfAssessedHealthStatus);orderHealth =类别(categoricalHealth)
orderHealth =4 x1细胞{'Excellent'} {'Fair'} {'Good'} {'Poor'}
dummyHealth = dummyvar (categoricalHealth);
创建包含以下内容的表dummyHealth
与相应的变量标题。组合这个新表资源描述
。
tblHealth = array2table (dummyHealth,“VariableNames”,orderHealth);tbl = [tbl];头(台)
ans =8×8表舒张收缩女性男性优秀的公平好可怜的_____ ________ ________ ___ _____ _____上93 124 0 1 1 0 0 0 77 109 0 1 0 1 0 0 0 0 0 1 0 83 125 75 117 1 0 0 1 0 0 0 0 0 1 0 80 122 70 121 1 0 0 0 0 0 0 0 1 0 88 130 82 115 0 1 0 0 1 0
第三行资源描述
例如,患者具有以下特征:舒张压83,收缩压125,女性,自我评价健康状况良好。
因为所有的值资源描述
是数值的,可以将表转换为矩阵吗X
。
X = table2array(台);
训练一个SVM分类器使用X
。指定吸烟者
变量作为响应。
Y =吸烟者;Mdl = fitcsvm (X, Y);
生成加载SVM分类器的代码,将新的预测器数据作为输入参数,然后对新数据进行分类。
保存SVM分类器到文件使用saveLearnerForCoder
。
saveLearnerForCoder (Mdl“SVMClassifier”)
saveLearnerForCoder
保存分类器到MATLAB®二进制文件SVMClassifier.mat
作为当前文件夹中的结构数组。
定义入口点函数mySVMPredict
,它将新的预测器数据作为输入参数。在函数内,通过使用加载SVM分类器loadLearnerForCoder
,然后将加载的分类器传递给预测
。
类型mySVMPredict.m%显示mySVMPredict的内容。m文件
codegen Mdl = loadLearnerForCoder('SVMClassifier');标签=预测(Mdl X);结束
注意:如果单击该页右上方的按钮,并在MATLAB中打开此示例,MATLAB将打开示例文件夹。这个文件夹包含了入口函数文件mySVMPredict.m
。
生成的代码mySVMPredict
通过使用codegen
。使用指定新预测器数据的数据类型和维度coder.typeof
以便生成的代码接受大小可变的数组。
codegenmySVMPredictarg游戏{编码器。类型of(X,[Inf 8],[1 0])}
验证mySVMPredict
而MEX文件对训练数据返回相同的结果。
标签=预测(Mdl X);mylabel = mySVMPredict (X);mylabel_mex = mySVMPredict_mex (X);verifyMEX = isequal(标签、mylabel mylabel_mex)
verifyMEX =逻辑1
要预测新数据的标签,必须首先对新数据进行预处理。如果在MATLAB环境中运行生成的代码,就可以执行本节中描述的预处理步骤。如果在MATLAB环境之外部署生成的代码,预处理步骤可能会有所不同。无论哪种情况,都必须确保新数据具有与训练数据相同的列X
。
在本例中,以第3、第4和第5个病人为例病人
对这些患者的数据进行预处理,使得到的数字矩阵与训练数据的形式匹配。
将分类变量转换为虚拟变量。因为新的观察值可能不包括来自所有类别的值,所以需要指定与训练期间使用的类别相同的类别,并维护相同的类别顺序。在MATLAB中,传递与相应训练数据变量(在本例中,orderGender
性别价值观和orderHealth
用于自我评估健康状况值)。
newcategoricalGender =分类(性别(3:5),orderGender);newdummyGender = dummyvar (newcategoricalGender);newcategoricalHealth =分类(SelfAssessedHealthStatus (3:5), orderHealth);newdummyHealth = dummyvar (newcategoricalHealth);
将所有的新数据合并成一个数字矩阵。
[舒张(3:5)收缩压(3:5)]
newX =3×80 75 117 83 125 1 0 0 0 1 1 0 0 1 0 0 80 122 1 0 0 0 1 0
请注意,newX
正好对应于矩阵的第三,第四和第五行X
。
验证mySVMPredict
而MEX文件对新数据返回相同的结果。
newX newlabel =预测(Mdl);newmylabel = mySVMPredict (newX);newmylabel_mex = mySVMPredict_mex (newX);newverifyMEX = isequal (newlabel newmylabel newmylabel_mex)
newverifyMEX =逻辑1
ClassificationSVM
|分类
|codegen
|coder.Constant
|coder.typeof
|dummyvar
|loadLearnerForCoder
|saveLearnerForCoder