数学建模社区-数学中国

标题: 支持向量机(SVM)分类器(matlab实现) [打印本页]

作者: 2744557306    时间: 2023-8-19 16:41
标题: 支持向量机(SVM)分类器(matlab实现)
支持向量机(Support Vector Machine,SVM)是一种常用的监督学习算法,广泛应用于模式识别、分类和回归分析等领域。SVM 的主要目标是找到一个最优的超平面来对数据进行划分,并实现在非线性情况下的高效分类。
通俗地说,我们可以想象 SVM 是一个将不同类别的数据点分隔开的分割线(二维平面)或超平面(高维空间)。SVM基于训练集中的样本点,通过寻找最优的分割线或超平面来实现分类。这里的最优意味着,将不同类别的样本点分隔得尽可能宽,以提高对新样本的泛化能力。分割线或超平面两侧的数据点被称为支持向量,它们对分类决策起到重要作用。
: T+ v$ N! M+ R2 p( t& c
这段代码是一个简单的支持向量机(SVM)分类器的示例。代码使用了名为 "heart_scale" 的数据集,首先将数据集分为训练集和测试集,然后利用SVM模型对测试集进行分类,并将结果与实际标签进行对比。为了可视化高维数据,代码还使用了多维缩放(MDS)将数据从13维降低到2维。
: A6 r0 P" v0 A& t首先,代码读取 "heartscale" 数据集,其中包括标签(heartscalelabel)和特征向量(heartscale_inst)。然后确定训练集和测试集的索引,并将数据分成相应的部分。' y, k0 P* E2 n! M- f$ E
接下来,代码使用训练集数据(trainData)和标签(trainLabel)训练SVM模型。然后使用训练好的模型对测试集数据(testData)进行分类,得到预测标签(predictlabel)、准确率(accuracy)和类别概率值(probvalues)。
! C- M# a6 V# ^: i# [% [代码的下一部分是为每个类别分配颜色。根据数据集标签的值,将其转换为类别索引,然后使用预先定义的颜色列表(colorList)为每个类别确定颜色。
0 I" e- t; A- A通过多维缩放(MDS),代码将原始的13维特征向量降低到2维。首先,通过计算特征向量间的欧氏距离(distanceMatrix),得到距离矩阵。然后,将距离矩阵作为输入,使用MDS将特征向量降低到2维,得到新的坐标(newCoor)。0 t1 f( L$ k+ S5 Z
最后,代码使用散点图展示结果。首先,在整个数据集上绘制散点图,并根据真实类别(colorTrueClass)为每个数据点上色。然后,绘制测试集的散点图,并根据真实类别(colorTrueClassPlot)和预测类别(colorResultClass)分别为数据点上色。最后,绘制训练集的散点图,并根据真实类别(colorTrueClassPlot)为数据点上色。
3 F6 N8 E! ^5 b! W5 A3 Q: m2 {# g
8 O5 x/ @* ?  Z5 h5 {当然,我会逐行解释以下代码的功能和作用。
' j! o( {$ k$ n2 s2 eclear% O1 b3 P5 o; U& z
clc
6 M: Y+ N' _+ H- yclose all
6 F/ T- A- f8 U7 [* j/ ?
2 N4 w+ w/ s; H( d, x. O# n: O这些行代码用于清除MATLAB工作区域中的变量,清除命令行窗口上的内容,并关闭所有打开的图形窗口。4 y( G4 H' d) d, j
[heart_scale_label, heart_scale_inst] = libsvmread('heart_scale');
0 M" p6 G# }" \; W6 h5 C- ]2 z[N,D] = size(heart_scale_inst);
& P' U) N. P: v( g! P) M0 }6 _! i& e% y) y! |
这两行代码读取文件 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 是每个数据点的特征维度。
) \; U0 ]) f0 J5 x+ b2 K, JtrainIndex = zeros(N,1); trainIndex(1:200) = 1;
2 ]8 i" O$ T1 I( L: CtestIndex = zeros(N,1); testIndex(201:N) = 1;5 z# A; S2 D' K# z1 d4 \) b; n
trainData = heart_scale_inst(trainIndex==1,;
2 x% T! e$ r% W* XtrainLabel = heart_scale_label(trainIndex==1,;
5 h1 g7 |9 q$ l8 A1 l; {, }4 ftestData = heart_scale_inst(testIndex==1,;
; E' p' K3 c8 _3 ]# z7 @. TtestLabel = heart_scale_label(testIndex==1,;
4 \. Y! C3 f( M! V8 v' m
6 O( J9 b* s% h: @% i! g$ q/ J这部分代码定义了训练集和测试集的索引,并使用这些索引将数据划分为相应的部分。首先,通过创建一个大小为 N 的零向量 trainIndex 和 testIndex,将训练集和测试集的索引位置标记为1。然后,使用这些索引从 heart_scale_inst 和 heart_scale_label 中选择相应的数据点和标签,形成训练集数据 (trainData)、训练集标签 (trainLabel)、测试集数据 (testData) 和测试集标签 (testLabel)。  @+ O. D2 ^6 S4 W, R) T: U* u
model = svmtrain(trainLabel, trainData, '-c 1 -g 0.07 -b 1');
8 }; b% O8 |; O- e+ |7 N$ E[predict_label, accuracy, prob_values] = svmpredict(testLabel, testData, model, '-b 1');
: g/ a) d+ x: @  ~  Q3 Y) }( P9 J# w- q
这部分代码使用支持向量机 (SVM) 进行训练和测试。首先,使用 svmtrain 函数训练一个SVM模型,其中训练集标签 (trainLabel) 和训练集数据 (trainData) 作为输入。额外的参数 -c 1 -g 0.07 -b 1 是SVM的参数设置,其中 -c 是惩罚项系数,-g 是高斯核函数的参数,-b 启用概率输出。训练完成后,得到一个训练好的模型 (model)。
- J& l; _( ^9 C( a# [# Z8 d% C然后,使用 svmpredict 函数根据 model 对测试集数据 (testData) 进行预测,并将预测标签 (predict_label)、准确率 (accuracy) 和类别概率值 (prob_values) 分别赋值给相应的变量。
$ h- Y4 ?3 l) McolorList = prism(100);, u1 r; E8 g, y
trueClassIndex = zeros(N,1);: r- a5 @0 l, I  d9 s8 g! i$ M
trueClassIndex(heart_scale_label==1) = 1;
* o5 G& ~7 X7 E" @trueClassIndex(heart_scale_label==-1) = 2;* Y: F3 ]" ^" _  }) C( S
colorTrueClass = colorList(trueClassIndex,;
7 d0 ^2 C! P) ^. CresultClassIndex = zeros(length(predict_label),1);
, j  [6 Z+ I0 S& |# n, yresultClassIndex(predict_label==1) = 1;" v' m8 L: u+ p* A3 X# I
resultClassIndex(predict_label==-1) = 2;$ @1 k( q; R. O: ^6 ]5 n
colorResultClass = colorList(resultClassIndex,;! C0 o$ k+ c5 `, `" f2 Z2 P
5 J$ G# b4 n5 T6 ~, k- t
这部分代码用于为每个类别分配颜色。通过 prism(100) 函数创建一个颜色映射列表 colorList。然后,根据原始数据的标签 (heart_scale_label),将标签为1的数据点的索引标记为1,标签为-1的数据点的索引标记为2。根据这些索引,从 colorList 中选择相应的颜色,得到真实类别的颜色 (colorTrueClass)。类似地,使用预测标签 (predict_label) 创建结果类别的颜色 (colorResultClass)。
$ G: X* v; }! W( udistanceMatrix = pdist(heart_scale_inst,'euclidean');; e; |9 Z0 Z0 d2 d
newCoor = mdscale(distanceMatrix,2);
/ C4 N8 K: H6 ~  {6 ~" F- N
/ @" `4 s& q1 C1 ?8 \/ s' Y这部分代码计算了原始数据点之间的欧氏距离矩阵 (distanceMatrix),并将其作为输入传递给 mdscale 函数。mdscale 函数将高维特征向量 (13D) 降维到2维,并返回新的二维坐标 (newCoor)。
# D9 S9 {7 P) x) g5 ox = newCoor(:,1);
& }7 _& N7 z' gy = newCoor(:,2);6 S5 z6 Q% e* ]9 V3 t0 B. s' V# |
patchSize = 30;
, C, z) H2 ^/ `$ i6 A9 HcolorTrueClassPlot = colorTrueClass;
# ~6 d& x! o4 f+ \1 `/ [& Ffigure; scatter(x,y,patchSize,colorTrueClassPlot,'filled');' O! ?) m9 [9 e; {. g2 c
title('whole data set');+ o0 M4 L' a9 l6 `( a
3 L" f* o1 q( K
这部分代码用于绘制整个数据集的散点图。首先,将新的坐标中的第一列 (x) 和第二列 (y) 分别赋值给变量。然后,根据真实类别的颜色 (colorTrueClassPlot),使用 scatter 函数绘制散点图,并设置散点的大小为 patchSize。最后,通过 title 函数给图像添加标题。
2 q7 d6 ~* ~- j+ e8 Hx = newCoor(testIndex==1,1);
# i  F4 {, y2 W- x& ?y = newCoor(testIndex==1,2);4 X4 Z# A* @  n3 C4 [
patchSize = 80*max(prob_values,[],2);- l$ ?5 H0 H! U' j* r6 a
colorTrueClassPlot = colorTrueClass(testIndex==1,;
& ]; g! g. n9 H$ }; F9 Zfigure; hold on;
: e! P$ l3 A9 o# Escatter(x,y,2*patchSize,colorTrueClassPlot,'o','filled');( w8 h# Y. _; A  F' x9 l8 T4 B
scatter(x,y,patchSize,colorResultClass,'o','filled');
: e% W# R' D7 R1 k) ix = newCoor(trainIndex==1,1);" b1 `' o6 r2 n4 Y: [( K( T
y = newCoor(trainIndex==1,2);
; |6 S9 K5 D! ppatchSize = 30;! ]9 C5 \) R% ?2 E: H3 d; C6 m
colorTrueClassPlot = colorTrueClass(trainIndex==1,;7 X1 o' c( _5 d9 E1 ?0 Z
scatter(x,y,patchSize,colorTrueClassPlot,'o');
, ~9 _( {, N: V0 O6 {title('classification results');6 H6 n" n, M! c; W1 f5 I
" ^6 ~2 Y: D% y) U( i  O( d
这部分代码用于绘制分类结果的散点图。首先,将测试集的新坐标 (newCoor) 中仅包含测试数据的部分的第一列 (x) 和第二列 (y) 赋值给 x 和 y 变量。然后,根据真实类别的颜色 (colorTrueClassPlot) 使用 scatter 函数绘制测试数据的散点图,设置散点的大小为 patchSize 的2倍,并使用真实类别的颜色填充。接下来,再次使用 scatter 函数绘制测试数据的散点图,散点的大小为 patchSize,颜色根据预测的类别 (colorResultClass) 填充。最后,将训练集数据的散点图绘制在图像上,同样使用真实类别的颜色填充。通过 title 函数给图像添加标题。* T1 g; g/ Y) J( M- b9 h
希望这些逐行解释能够帮助您理解代码的功能和作用。如果还有其他问题,请随时提问。  M- z1 S! W' {
  |' Q: t/ G/ J4 z) m5 |8 x1 w
+ ]+ g# u: k" @- q6 I; T5 {

* [1 V' c) ~% u" C

SVM.rar

6.37 KB, 下载次数: 0, 下载积分: 体力 -2 点

售价: 3 点体力  [记录]  [购买]






欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5