数学建模社区-数学中国
标题: 支持向量机(SVM)分类器(matlab实现) [打印本页]
作者: 2744557306 时间: 2023-8-19 16:41
标题: 支持向量机(SVM)分类器(matlab实现)
支持向量机(Support Vector Machine,SVM)是一种常用的监督学习算法,广泛应用于模式识别、分类和回归分析等领域。SVM 的主要目标是找到一个最优的超平面来对数据进行划分,并实现在非线性情况下的高效分类。
通俗地说,我们可以想象 SVM 是一个将不同类别的数据点分隔开的分割线(二维平面)或超平面(高维空间)。SVM基于训练集中的样本点,通过寻找最优的分割线或超平面来实现分类。这里的最优意味着,将不同类别的样本点分隔得尽可能宽,以提高对新样本的泛化能力。分割线或超平面两侧的数据点被称为支持向量,它们对分类决策起到重要作用。
, r, s3 f# J" k$ a9 ], L6 l; s这段代码是一个简单的支持向量机(SVM)分类器的示例。代码使用了名为 "heart_scale" 的数据集,首先将数据集分为训练集和测试集,然后利用SVM模型对测试集进行分类,并将结果与实际标签进行对比。为了可视化高维数据,代码还使用了多维缩放(MDS)将数据从13维降低到2维。
% @& a" ~ P; ], r* B! Q首先,代码读取 "heartscale" 数据集,其中包括标签(heartscalelabel)和特征向量(heartscale_inst)。然后确定训练集和测试集的索引,并将数据分成相应的部分。
: Z N' G: ?! i' \" {; G接下来,代码使用训练集数据(trainData)和标签(trainLabel)训练SVM模型。然后使用训练好的模型对测试集数据(testData)进行分类,得到预测标签(predictlabel)、准确率(accuracy)和类别概率值(probvalues)。% S& c( e6 S c0 ~4 ~+ G
代码的下一部分是为每个类别分配颜色。根据数据集标签的值,将其转换为类别索引,然后使用预先定义的颜色列表(colorList)为每个类别确定颜色。2 T: U6 { x. E3 R& ?1 q3 r# S
通过多维缩放(MDS),代码将原始的13维特征向量降低到2维。首先,通过计算特征向量间的欧氏距离(distanceMatrix),得到距离矩阵。然后,将距离矩阵作为输入,使用MDS将特征向量降低到2维,得到新的坐标(newCoor)。4 Z: R( w3 }2 K3 M$ ?) _
最后,代码使用散点图展示结果。首先,在整个数据集上绘制散点图,并根据真实类别(colorTrueClass)为每个数据点上色。然后,绘制测试集的散点图,并根据真实类别(colorTrueClassPlot)和预测类别(colorResultClass)分别为数据点上色。最后,绘制训练集的散点图,并根据真实类别(colorTrueClassPlot)为数据点上色。# y7 p6 t$ u4 v4 c& j( h7 Q
2 D3 d* J; `% N+ V当然,我会逐行解释以下代码的功能和作用。3 {1 d8 f4 Z q5 [. `% u
clear% t9 Z$ T6 ?9 V: K+ e [& M; R
clc" |4 `- J3 O3 c6 r8 p$ \
close all
4 E( S; I. D. Z+ s
! _5 |- v. C3 _; r" W2 [这些行代码用于清除MATLAB工作区域中的变量,清除命令行窗口上的内容,并关闭所有打开的图形窗口。
" z& v# V+ _; S. f! c7 k i: \7 G' A5 C[heart_scale_label, heart_scale_inst] = libsvmread('heart_scale');$ e6 ~, _5 Q: Q% u* D6 y
[N,D] = size(heart_scale_inst); ?, C% R- j% _/ _/ r3 w& e
; o. }8 M+ u7 ~+ W
这两行代码读取文件 heart_scale 中的数据并将其分配给变量 heart_scale_label 和 heart_scale_inst。heart_scale_label 是数据的标签,而 heart_scale_inst 是数据的特征或属性。[N,D] = size(heart_scale_inst) 用于获取 heart_scale_inst 的大小,其中 N 是数据点的数量,D 是每个数据点的特征维度。% F( ?6 Y+ t2 e' L
trainIndex = zeros(N,1); trainIndex(1:200) = 1;8 e% W. B- K9 z/ I+ g
testIndex = zeros(N,1); testIndex(201:N) = 1;
0 d+ V$ R$ P# b, z5 P3 itrainData = heart_scale_inst(trainIndex==1,
;9 ?2 r& x: X0 ?0 f
trainLabel = heart_scale_label(trainIndex==1,
;. X! L+ w8 K; ]: {+ p5 x: Q( e
testData = heart_scale_inst(testIndex==1,
;& O1 Z! S- _, ^, ?/ b7 Y) S
testLabel = heart_scale_label(testIndex==1,
;& w+ j3 x6 H- M; S! Q" X
0 p. M/ L$ s+ y9 g这部分代码定义了训练集和测试集的索引,并使用这些索引将数据划分为相应的部分。首先,通过创建一个大小为 N 的零向量 trainIndex 和 testIndex,将训练集和测试集的索引位置标记为1。然后,使用这些索引从 heart_scale_inst 和 heart_scale_label 中选择相应的数据点和标签,形成训练集数据 (trainData)、训练集标签 (trainLabel)、测试集数据 (testData) 和测试集标签 (testLabel)。
3 f4 I( K8 l# Q) M7 X5 Qmodel = svmtrain(trainLabel, trainData, '-c 1 -g 0.07 -b 1');
$ x/ [5 {$ p; M( M[predict_label, accuracy, prob_values] = svmpredict(testLabel, testData, model, '-b 1');( k8 O/ j7 v. ] B1 o3 K" d8 s1 p2 ]
% _0 a6 w/ b- D
这部分代码使用支持向量机 (SVM) 进行训练和测试。首先,使用 svmtrain 函数训练一个SVM模型,其中训练集标签 (trainLabel) 和训练集数据 (trainData) 作为输入。额外的参数 -c 1 -g 0.07 -b 1 是SVM的参数设置,其中 -c 是惩罚项系数,-g 是高斯核函数的参数,-b 启用概率输出。训练完成后,得到一个训练好的模型 (model)。
6 T- a! k7 f9 B( f4 t" M然后,使用 svmpredict 函数根据 model 对测试集数据 (testData) 进行预测,并将预测标签 (predict_label)、准确率 (accuracy) 和类别概率值 (prob_values) 分别赋值给相应的变量。5 s1 Z( P% F3 e+ H5 H
colorList = prism(100);
4 A' L2 Y: S6 b8 d3 w5 TtrueClassIndex = zeros(N,1);; W8 U8 R9 B* i$ }& u8 G. w' F
trueClassIndex(heart_scale_label==1) = 1;
% M3 x4 n% r- U; x; a; m- v ztrueClassIndex(heart_scale_label==-1) = 2;
4 }4 C5 c! w2 w, i8 ]9 J9 B$ ZcolorTrueClass = colorList(trueClassIndex,
;2 H3 t( J" Y6 p1 q- k. Q- }
resultClassIndex = zeros(length(predict_label),1);+ D! t9 n8 a9 e+ w) d' N
resultClassIndex(predict_label==1) = 1;8 Y& z, w$ q% A
resultClassIndex(predict_label==-1) = 2;
4 a! j: p' N, { w' G5 Z% ecolorResultClass = colorList(resultClassIndex,
;
7 H( B7 C/ Y. W& U! |, V4 h; {, j" [
这部分代码用于为每个类别分配颜色。通过 prism(100) 函数创建一个颜色映射列表 colorList。然后,根据原始数据的标签 (heart_scale_label),将标签为1的数据点的索引标记为1,标签为-1的数据点的索引标记为2。根据这些索引,从 colorList 中选择相应的颜色,得到真实类别的颜色 (colorTrueClass)。类似地,使用预测标签 (predict_label) 创建结果类别的颜色 (colorResultClass)。4 S3 O5 O9 k$ S; V; z
distanceMatrix = pdist(heart_scale_inst,'euclidean');
! r- b% D; ?6 q% d5 ynewCoor = mdscale(distanceMatrix,2);+ j/ \5 w% m' m- x
3 x+ _0 U' |1 D7 E- `这部分代码计算了原始数据点之间的欧氏距离矩阵 (distanceMatrix),并将其作为输入传递给 mdscale 函数。mdscale 函数将高维特征向量 (13D) 降维到2维,并返回新的二维坐标 (newCoor)。
' W' M9 Y4 w2 f+ l; vx = newCoor(:,1);/ i" x0 P" c% F9 u p6 l
y = newCoor(:,2);
+ T; }/ T& ^# r n, EpatchSize = 30;
$ H0 Q( ^! k# I! f4 I) McolorTrueClassPlot = colorTrueClass; _6 N: a/ ^( K! H2 P7 A* t
figure; scatter(x,y,patchSize,colorTrueClassPlot,'filled');
+ g. ?; d% a2 S: O; rtitle('whole data set');- C( @# |, _6 z6 K7 `
; C6 `- L# u" M3 ^9 x; G3 [这部分代码用于绘制整个数据集的散点图。首先,将新的坐标中的第一列 (x) 和第二列 (y) 分别赋值给变量。然后,根据真实类别的颜色 (colorTrueClassPlot),使用 scatter 函数绘制散点图,并设置散点的大小为 patchSize。最后,通过 title 函数给图像添加标题。" ~ _& [4 g3 a4 `8 R5 M5 a, t# m
x = newCoor(testIndex==1,1);
% p) L% m3 o0 W7 a, W1 a3 {. dy = newCoor(testIndex==1,2);
! Y0 h4 \" F# C0 L$ l3 qpatchSize = 80*max(prob_values,[],2);
, a7 ]) [1 r$ p7 I! H4 b- ^colorTrueClassPlot = colorTrueClass(testIndex==1,
; b B- L& ?, s$ V* f
figure; hold on;" w9 c9 ?4 c/ H% Q
scatter(x,y,2*patchSize,colorTrueClassPlot,'o','filled');, l4 J" G# c6 W" A9 A# ?$ R
scatter(x,y,patchSize,colorResultClass,'o','filled');
2 ]6 q; x1 Y# e8 s$ n0 }' Jx = newCoor(trainIndex==1,1);. f/ T/ s) L% a/ k& X
y = newCoor(trainIndex==1,2);
- |5 U8 X( _0 C; _2 x% A' V! p2 BpatchSize = 30;
- N* `9 {: O. }, ucolorTrueClassPlot = colorTrueClass(trainIndex==1,
;
# I9 K% p( Z0 l7 d- h# K0 ?1 cscatter(x,y,patchSize,colorTrueClassPlot,'o');# m5 ^" v) M$ g( m
title('classification results');# `8 F/ j* o F& `
9 y8 Z( _' N; t: [2 X8 {+ O3 ~+ K, ?这部分代码用于绘制分类结果的散点图。首先,将测试集的新坐标 (newCoor) 中仅包含测试数据的部分的第一列 (x) 和第二列 (y) 赋值给 x 和 y 变量。然后,根据真实类别的颜色 (colorTrueClassPlot) 使用 scatter 函数绘制测试数据的散点图,设置散点的大小为 patchSize 的2倍,并使用真实类别的颜色填充。接下来,再次使用 scatter 函数绘制测试数据的散点图,散点的大小为 patchSize,颜色根据预测的类别 (colorResultClass) 填充。最后,将训练集数据的散点图绘制在图像上,同样使用真实类别的颜色填充。通过 title 函数给图像添加标题。 ?& |, w& z! b) z
希望这些逐行解释能够帮助您理解代码的功能和作用。如果还有其他问题,请随时提问。; j8 r7 |& }! c3 P- L* N9 F4 m1 `
1 x) j2 J: X3 k
% r) g% P: H$ ] c) G* f7 l2 T! m* U! E2 D% Q$ E1 w
-
-
SVM.rar
6.37 KB, 下载次数: 0, 下载积分: 体力 -2 点
售价: 3 点体力 [记录]
[购买]
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) |
Powered by Discuz! X2.5 |