数学建模社区-数学中国
标题: 支持向量机(SVM)分类器(matlab实现) [打印本页]
作者: 2744557306 时间: 2023-8-19 16:41
标题: 支持向量机(SVM)分类器(matlab实现)
支持向量机(Support Vector Machine,SVM)是一种常用的监督学习算法,广泛应用于模式识别、分类和回归分析等领域。SVM 的主要目标是找到一个最优的超平面来对数据进行划分,并实现在非线性情况下的高效分类。
通俗地说,我们可以想象 SVM 是一个将不同类别的数据点分隔开的分割线(二维平面)或超平面(高维空间)。SVM基于训练集中的样本点,通过寻找最优的分割线或超平面来实现分类。这里的最优意味着,将不同类别的样本点分隔得尽可能宽,以提高对新样本的泛化能力。分割线或超平面两侧的数据点被称为支持向量,它们对分类决策起到重要作用。
" @& A: }6 A/ l. L7 R+ K+ A) F
这段代码是一个简单的支持向量机(SVM)分类器的示例。代码使用了名为 "heart_scale" 的数据集,首先将数据集分为训练集和测试集,然后利用SVM模型对测试集进行分类,并将结果与实际标签进行对比。为了可视化高维数据,代码还使用了多维缩放(MDS)将数据从13维降低到2维。
# x+ O8 z* j5 O1 C, L: r/ n首先,代码读取 "heartscale" 数据集,其中包括标签(heartscalelabel)和特征向量(heartscale_inst)。然后确定训练集和测试集的索引,并将数据分成相应的部分。
2 H6 t' M o) D& {! f接下来,代码使用训练集数据(trainData)和标签(trainLabel)训练SVM模型。然后使用训练好的模型对测试集数据(testData)进行分类,得到预测标签(predictlabel)、准确率(accuracy)和类别概率值(probvalues)。3 M1 o" p7 g/ s, _2 W" K3 @! J
代码的下一部分是为每个类别分配颜色。根据数据集标签的值,将其转换为类别索引,然后使用预先定义的颜色列表(colorList)为每个类别确定颜色。7 O* ]( s9 L, v; ]
通过多维缩放(MDS),代码将原始的13维特征向量降低到2维。首先,通过计算特征向量间的欧氏距离(distanceMatrix),得到距离矩阵。然后,将距离矩阵作为输入,使用MDS将特征向量降低到2维,得到新的坐标(newCoor)。0 N. m1 C* c6 v; u; K& g
最后,代码使用散点图展示结果。首先,在整个数据集上绘制散点图,并根据真实类别(colorTrueClass)为每个数据点上色。然后,绘制测试集的散点图,并根据真实类别(colorTrueClassPlot)和预测类别(colorResultClass)分别为数据点上色。最后,绘制训练集的散点图,并根据真实类别(colorTrueClassPlot)为数据点上色。7 A. \3 A6 \7 S
- f4 F7 h# K* o+ |( r当然,我会逐行解释以下代码的功能和作用。! V& s) Y6 ?8 P+ X. y4 p( ?5 f4 j
clear( M4 `9 g2 W+ q8 X3 ]
clc: g2 g( y) ^2 t7 B: p1 ?4 d
close all( w% h, ?+ b0 w, E& W: J8 g4 n
+ d, u! G" c3 z$ @. W
这些行代码用于清除MATLAB工作区域中的变量,清除命令行窗口上的内容,并关闭所有打开的图形窗口。
2 |' y, y0 A% m0 K[heart_scale_label, heart_scale_inst] = libsvmread('heart_scale');& N; H3 S* y, ?1 F x
[N,D] = size(heart_scale_inst);8 `6 K/ j/ H% f6 {
z6 R! ^# j: I& j; b4 G
这两行代码读取文件 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 是每个数据点的特征维度。& N9 }$ n. R* X& j$ S! ^+ Z
trainIndex = zeros(N,1); trainIndex(1:200) = 1;4 q9 a5 |* ?2 A8 ?9 E
testIndex = zeros(N,1); testIndex(201:N) = 1;- [ a: f/ v* q s& U) _
trainData = heart_scale_inst(trainIndex==1,
;9 E0 w3 ], E, H% p, H8 q; ]
trainLabel = heart_scale_label(trainIndex==1,
;
/ R) U5 q- Z3 I- m5 h# A" ItestData = heart_scale_inst(testIndex==1,
;
& L) ~7 n8 Q5 ~ [0 M# JtestLabel = heart_scale_label(testIndex==1,
;8 j0 G: ~. w/ u3 V& U5 x4 Y+ G
/ U q* W2 P, l5 o
这部分代码定义了训练集和测试集的索引,并使用这些索引将数据划分为相应的部分。首先,通过创建一个大小为 N 的零向量 trainIndex 和 testIndex,将训练集和测试集的索引位置标记为1。然后,使用这些索引从 heart_scale_inst 和 heart_scale_label 中选择相应的数据点和标签,形成训练集数据 (trainData)、训练集标签 (trainLabel)、测试集数据 (testData) 和测试集标签 (testLabel)。* {9 R" k6 x0 N9 d
model = svmtrain(trainLabel, trainData, '-c 1 -g 0.07 -b 1');
: G, ?4 u k2 F( w[predict_label, accuracy, prob_values] = svmpredict(testLabel, testData, model, '-b 1');
3 S" |0 \& M* Y0 P' u( i! P/ N5 m# O a% R `/ F' a8 ^
这部分代码使用支持向量机 (SVM) 进行训练和测试。首先,使用 svmtrain 函数训练一个SVM模型,其中训练集标签 (trainLabel) 和训练集数据 (trainData) 作为输入。额外的参数 -c 1 -g 0.07 -b 1 是SVM的参数设置,其中 -c 是惩罚项系数,-g 是高斯核函数的参数,-b 启用概率输出。训练完成后,得到一个训练好的模型 (model)。
4 Z6 X" w6 k. [9 @6 z: H$ ^' F然后,使用 svmpredict 函数根据 model 对测试集数据 (testData) 进行预测,并将预测标签 (predict_label)、准确率 (accuracy) 和类别概率值 (prob_values) 分别赋值给相应的变量。
: ?, ^) ~ s* o: N4 P/ RcolorList = prism(100);
V. u0 ?' Z/ P! k. c$ W/ qtrueClassIndex = zeros(N,1);
# [0 C) j5 v' q, rtrueClassIndex(heart_scale_label==1) = 1;0 U4 g4 j+ \ h
trueClassIndex(heart_scale_label==-1) = 2;2 [' _2 [5 O; c: D
colorTrueClass = colorList(trueClassIndex,
;
9 V. d: d; M' s" v" S5 gresultClassIndex = zeros(length(predict_label),1);
% K' N, K2 X; n* _1 d, eresultClassIndex(predict_label==1) = 1;
& |* H2 j4 U! X9 E" E5 g: S- tresultClassIndex(predict_label==-1) = 2;
2 k" v- P, F( N3 G4 t( ]2 pcolorResultClass = colorList(resultClassIndex,
;. e$ Z \. y0 V, _3 c% }6 P
: X% w" q! \+ H, e2 T F6 `9 y3 |- w这部分代码用于为每个类别分配颜色。通过 prism(100) 函数创建一个颜色映射列表 colorList。然后,根据原始数据的标签 (heart_scale_label),将标签为1的数据点的索引标记为1,标签为-1的数据点的索引标记为2。根据这些索引,从 colorList 中选择相应的颜色,得到真实类别的颜色 (colorTrueClass)。类似地,使用预测标签 (predict_label) 创建结果类别的颜色 (colorResultClass)。* H' R9 S; g) w3 ^
distanceMatrix = pdist(heart_scale_inst,'euclidean');
( Z3 R# V+ o7 [+ M) WnewCoor = mdscale(distanceMatrix,2);
9 }6 X& Q$ p" d$ [! `/ c0 e. D' N) W, L+ Z
这部分代码计算了原始数据点之间的欧氏距离矩阵 (distanceMatrix),并将其作为输入传递给 mdscale 函数。mdscale 函数将高维特征向量 (13D) 降维到2维,并返回新的二维坐标 (newCoor)。5 Y) ^0 m/ l; P- Q. [( f+ x
x = newCoor(:,1);1 X' ?1 `7 `3 c% k6 @$ t6 F
y = newCoor(:,2);
7 ~' s: {( S0 F8 ^& s5 [& G) _, spatchSize = 30;$ T! A* `0 ?% _* S5 l: Z. N" u
colorTrueClassPlot = colorTrueClass;
2 N! X. N; e& ^5 C/ c7 Jfigure; scatter(x,y,patchSize,colorTrueClassPlot,'filled');! v8 Q" x' Y2 K+ y4 @- J
title('whole data set');
% C; l2 h" k8 `; p
2 t+ d2 X' `! d9 X5 \这部分代码用于绘制整个数据集的散点图。首先,将新的坐标中的第一列 (x) 和第二列 (y) 分别赋值给变量。然后,根据真实类别的颜色 (colorTrueClassPlot),使用 scatter 函数绘制散点图,并设置散点的大小为 patchSize。最后,通过 title 函数给图像添加标题。! d4 g! A/ F! h; ] V
x = newCoor(testIndex==1,1);
, @1 Z9 _: |. j$ S2 dy = newCoor(testIndex==1,2);: L$ S+ _" t# S4 Z4 D7 y/ m& _/ z
patchSize = 80*max(prob_values,[],2);( z! w0 G3 G# }2 o4 @# k( Z& m
colorTrueClassPlot = colorTrueClass(testIndex==1,
;
$ N+ e3 I. @, O- v$ G0 ffigure; hold on;
6 i- c" {' |* K! @$ x' {scatter(x,y,2*patchSize,colorTrueClassPlot,'o','filled');
2 X7 a; x, T7 H+ j8 O( `scatter(x,y,patchSize,colorResultClass,'o','filled');
/ H6 f) b$ h& {x = newCoor(trainIndex==1,1);& u6 z, s- s& N' ]
y = newCoor(trainIndex==1,2);
. }% Y. C4 g, `& bpatchSize = 30;( u* E; t- H! a5 U$ o/ h8 t
colorTrueClassPlot = colorTrueClass(trainIndex==1,
;+ F7 k: Y) g8 d; c& z+ z) F
scatter(x,y,patchSize,colorTrueClassPlot,'o');9 X B! U4 z3 x; H @6 I3 @
title('classification results');% I, O4 k) `% X3 q, Y% X, m' x
7 K E) a9 Y& q, e5 s" r
这部分代码用于绘制分类结果的散点图。首先,将测试集的新坐标 (newCoor) 中仅包含测试数据的部分的第一列 (x) 和第二列 (y) 赋值给 x 和 y 变量。然后,根据真实类别的颜色 (colorTrueClassPlot) 使用 scatter 函数绘制测试数据的散点图,设置散点的大小为 patchSize 的2倍,并使用真实类别的颜色填充。接下来,再次使用 scatter 函数绘制测试数据的散点图,散点的大小为 patchSize,颜色根据预测的类别 (colorResultClass) 填充。最后,将训练集数据的散点图绘制在图像上,同样使用真实类别的颜色填充。通过 title 函数给图像添加标题。2 ]! \, {+ ^0 j" W; T
希望这些逐行解释能够帮助您理解代码的功能和作用。如果还有其他问题,请随时提问。' V! l/ S5 g- P: ~) T
* I+ K5 G; F- M) Q9 `( P: f4 t2 u# p
- t5 j% d' J( [
-
-
SVM.rar
6.37 KB, 下载次数: 0, 下载积分: 体力 -2 点
售价: 3 点体力 [记录]
[购买]
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) |
Powered by Discuz! X2.5 |