数学建模社区-数学中国
标题: 支持向量机(SVM)分类器(matlab实现) [打印本页]
作者: 2744557306 时间: 2023-8-19 16:41
标题: 支持向量机(SVM)分类器(matlab实现)
支持向量机(Support Vector Machine,SVM)是一种常用的监督学习算法,广泛应用于模式识别、分类和回归分析等领域。SVM 的主要目标是找到一个最优的超平面来对数据进行划分,并实现在非线性情况下的高效分类。
通俗地说,我们可以想象 SVM 是一个将不同类别的数据点分隔开的分割线(二维平面)或超平面(高维空间)。SVM基于训练集中的样本点,通过寻找最优的分割线或超平面来实现分类。这里的最优意味着,将不同类别的样本点分隔得尽可能宽,以提高对新样本的泛化能力。分割线或超平面两侧的数据点被称为支持向量,它们对分类决策起到重要作用。
H& Z' I+ e8 ~
这段代码是一个简单的支持向量机(SVM)分类器的示例。代码使用了名为 "heart_scale" 的数据集,首先将数据集分为训练集和测试集,然后利用SVM模型对测试集进行分类,并将结果与实际标签进行对比。为了可视化高维数据,代码还使用了多维缩放(MDS)将数据从13维降低到2维。
& ~* {5 o" s0 |首先,代码读取 "heartscale" 数据集,其中包括标签(heartscalelabel)和特征向量(heartscale_inst)。然后确定训练集和测试集的索引,并将数据分成相应的部分。5 N I- p# u, e4 r- M
接下来,代码使用训练集数据(trainData)和标签(trainLabel)训练SVM模型。然后使用训练好的模型对测试集数据(testData)进行分类,得到预测标签(predictlabel)、准确率(accuracy)和类别概率值(probvalues)。4 ^1 p3 \ I: w |. K C
代码的下一部分是为每个类别分配颜色。根据数据集标签的值,将其转换为类别索引,然后使用预先定义的颜色列表(colorList)为每个类别确定颜色。( V" O0 `7 X: r0 q0 p
通过多维缩放(MDS),代码将原始的13维特征向量降低到2维。首先,通过计算特征向量间的欧氏距离(distanceMatrix),得到距离矩阵。然后,将距离矩阵作为输入,使用MDS将特征向量降低到2维,得到新的坐标(newCoor)。2 \& N9 G3 L/ Q- i% I3 y
最后,代码使用散点图展示结果。首先,在整个数据集上绘制散点图,并根据真实类别(colorTrueClass)为每个数据点上色。然后,绘制测试集的散点图,并根据真实类别(colorTrueClassPlot)和预测类别(colorResultClass)分别为数据点上色。最后,绘制训练集的散点图,并根据真实类别(colorTrueClassPlot)为数据点上色。, O3 T' S% R. N. u, H& P" z
# ^1 U* \% g- c5 Q4 p当然,我会逐行解释以下代码的功能和作用。
8 k) {6 ]; P/ y4 G* j& k, }clear
" R0 }7 b0 W( f- fclc
1 {- T% F$ |% F4 ~close all+ f( N1 t( E" `3 c8 P
. u8 T4 K: s/ y6 z+ X, c
这些行代码用于清除MATLAB工作区域中的变量,清除命令行窗口上的内容,并关闭所有打开的图形窗口。5 Z" j% }, s/ p
[heart_scale_label, heart_scale_inst] = libsvmread('heart_scale');
0 L1 Q9 h* L* [5 J+ d, \" ~[N,D] = size(heart_scale_inst);
. K, S* @; O$ z% ?5 [" w
) L+ w1 h; V3 N( G2 T$ I这两行代码读取文件 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 是每个数据点的特征维度。. }7 J( d+ ^, {
trainIndex = zeros(N,1); trainIndex(1:200) = 1;( ? N* a' ?2 _/ a3 r$ h6 l3 F' S
testIndex = zeros(N,1); testIndex(201:N) = 1;
3 |7 y& ~2 j0 L! F. }4 ?6 @trainData = heart_scale_inst(trainIndex==1,
;
, x2 U4 d% K2 C3 f4 j2 O+ FtrainLabel = heart_scale_label(trainIndex==1,
;
* N1 {" n) {+ @' w8 [testData = heart_scale_inst(testIndex==1,
;
; q* G" M* d1 v1 o9 ]testLabel = heart_scale_label(testIndex==1,
;
j6 {% m! ]$ I3 n# n# l1 ]) Y6 k0 q9 {
这部分代码定义了训练集和测试集的索引,并使用这些索引将数据划分为相应的部分。首先,通过创建一个大小为 N 的零向量 trainIndex 和 testIndex,将训练集和测试集的索引位置标记为1。然后,使用这些索引从 heart_scale_inst 和 heart_scale_label 中选择相应的数据点和标签,形成训练集数据 (trainData)、训练集标签 (trainLabel)、测试集数据 (testData) 和测试集标签 (testLabel)。% o& s9 | W4 \* R
model = svmtrain(trainLabel, trainData, '-c 1 -g 0.07 -b 1');
8 F4 @8 {+ {; Z( i J. n[predict_label, accuracy, prob_values] = svmpredict(testLabel, testData, model, '-b 1');
* i7 L% _5 U- y) [
' S6 I, t. d$ M9 A: m这部分代码使用支持向量机 (SVM) 进行训练和测试。首先,使用 svmtrain 函数训练一个SVM模型,其中训练集标签 (trainLabel) 和训练集数据 (trainData) 作为输入。额外的参数 -c 1 -g 0.07 -b 1 是SVM的参数设置,其中 -c 是惩罚项系数,-g 是高斯核函数的参数,-b 启用概率输出。训练完成后,得到一个训练好的模型 (model)。
1 n, P4 o) \9 B/ ~6 g然后,使用 svmpredict 函数根据 model 对测试集数据 (testData) 进行预测,并将预测标签 (predict_label)、准确率 (accuracy) 和类别概率值 (prob_values) 分别赋值给相应的变量。
4 W- r& i! j. ?# O& ^colorList = prism(100);; I, o1 |- w8 N, k8 `; f B& m
trueClassIndex = zeros(N,1);
2 b: p8 D7 a2 Z: d/ `# k0 v* q ntrueClassIndex(heart_scale_label==1) = 1;
4 L# b, ~" S# ^1 w+ C1 r) JtrueClassIndex(heart_scale_label==-1) = 2;
5 q: h, G2 X- WcolorTrueClass = colorList(trueClassIndex,
;
7 O4 q2 ]. v R4 O/ a4 DresultClassIndex = zeros(length(predict_label),1);, \9 S- I. k1 E% b8 u& P
resultClassIndex(predict_label==1) = 1;- I4 P! o7 W: {8 g8 \
resultClassIndex(predict_label==-1) = 2;6 B" n9 |1 Q6 f% z
colorResultClass = colorList(resultClassIndex,
;
$ X" n+ y! G+ i. r5 `! ^, X+ k
1 J( U3 N v, e* [+ j% K% D& j这部分代码用于为每个类别分配颜色。通过 prism(100) 函数创建一个颜色映射列表 colorList。然后,根据原始数据的标签 (heart_scale_label),将标签为1的数据点的索引标记为1,标签为-1的数据点的索引标记为2。根据这些索引,从 colorList 中选择相应的颜色,得到真实类别的颜色 (colorTrueClass)。类似地,使用预测标签 (predict_label) 创建结果类别的颜色 (colorResultClass)。1 C" V$ J+ I* N+ R( B3 {- G
distanceMatrix = pdist(heart_scale_inst,'euclidean'); p* ]. N1 o N5 X: f3 U2 T
newCoor = mdscale(distanceMatrix,2);
! ?0 d: ~: E( s9 J7 V! x! y+ t( F r5 ]/ o
这部分代码计算了原始数据点之间的欧氏距离矩阵 (distanceMatrix),并将其作为输入传递给 mdscale 函数。mdscale 函数将高维特征向量 (13D) 降维到2维,并返回新的二维坐标 (newCoor)。' w; O ^9 h2 D; B( z1 C* p1 ^
x = newCoor(:,1);
6 B6 A' G4 T4 O7 `y = newCoor(:,2);3 s8 C% ?+ e o0 r! G+ z
patchSize = 30;
, q5 G9 V' d4 Z+ D! fcolorTrueClassPlot = colorTrueClass;# Q* V" u. y% p6 q- G: [
figure; scatter(x,y,patchSize,colorTrueClassPlot,'filled'); b- X# z# x! i) o' _; P) q
title('whole data set');
( [+ H5 b( V4 R& X* N4 `$ l7 }+ p+ E( ]; T9 w- H4 o. `
这部分代码用于绘制整个数据集的散点图。首先,将新的坐标中的第一列 (x) 和第二列 (y) 分别赋值给变量。然后,根据真实类别的颜色 (colorTrueClassPlot),使用 scatter 函数绘制散点图,并设置散点的大小为 patchSize。最后,通过 title 函数给图像添加标题。+ a- E: ]1 g3 ?2 M, `8 n
x = newCoor(testIndex==1,1);) o- M: T9 b3 }8 f. Q# v+ `; U9 }
y = newCoor(testIndex==1,2);
# x+ N+ n& R5 Z7 h& p; |+ l% TpatchSize = 80*max(prob_values,[],2);
" f% {: p1 B2 g5 Z+ `3 [0 L# Y$ fcolorTrueClassPlot = colorTrueClass(testIndex==1,
;0 D% r7 X+ Z; O4 O: u2 H' t
figure; hold on;
+ C6 \* t' {5 U. a8 i+ `4 o. A: U6 ?# Vscatter(x,y,2*patchSize,colorTrueClassPlot,'o','filled');
: X; }& ?1 k7 }6 ^8 T' Q0 ]scatter(x,y,patchSize,colorResultClass,'o','filled');
5 U. I$ m& ^' G. ?; T* g* Rx = newCoor(trainIndex==1,1);
' ^- p- ~ i9 y# |7 ]$ S& Ty = newCoor(trainIndex==1,2);; @4 Y' i$ J2 V
patchSize = 30;. f( V- s9 d$ U/ v6 i
colorTrueClassPlot = colorTrueClass(trainIndex==1,
;# G8 f( g. ~3 Y4 ]4 D# ?! E
scatter(x,y,patchSize,colorTrueClassPlot,'o');
P- M+ w9 L; d. f( xtitle('classification results');
+ p6 [ Z/ ~6 a; ]6 u. J& p2 r, h" T) s; j) t& D- ~
这部分代码用于绘制分类结果的散点图。首先,将测试集的新坐标 (newCoor) 中仅包含测试数据的部分的第一列 (x) 和第二列 (y) 赋值给 x 和 y 变量。然后,根据真实类别的颜色 (colorTrueClassPlot) 使用 scatter 函数绘制测试数据的散点图,设置散点的大小为 patchSize 的2倍,并使用真实类别的颜色填充。接下来,再次使用 scatter 函数绘制测试数据的散点图,散点的大小为 patchSize,颜色根据预测的类别 (colorResultClass) 填充。最后,将训练集数据的散点图绘制在图像上,同样使用真实类别的颜色填充。通过 title 函数给图像添加标题。1 ^% n- A( q4 M$ [, i
希望这些逐行解释能够帮助您理解代码的功能和作用。如果还有其他问题,请随时提问。/ p3 [& n: F0 q8 O: T" e. Z- p
, p) _. S+ E& c* ^( M" W. [9 W
1 C. f# v+ B$ _2 q
1 W6 l+ ^8 s) z- _" d2 C
-
-
SVM.rar
6.37 KB, 下载次数: 0, 下载积分: 体力 -2 点
售价: 3 点体力 [记录]
[购买]
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) |
Powered by Discuz! X2.5 |