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