QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2028|回复: 0
打印 上一主题 下一主题

支持向量机(SVM)分类器(matlab实现)

[复制链接]
字体大小: 正常 放大

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-8-19 16:41 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
支持向量机(Support Vector Machine,SVM)是一种常用的监督学习算法,广泛应用于模式识别、分类和回归分析等领域。SVM 的主要目标是找到一个最优的超平面来对数据进行划分,并实现在非线性情况下的高效分类。
通俗地说,我们可以想象 SVM 是一个将不同类别的数据点分隔开的分割线(二维平面)或超平面(高维空间)。SVM基于训练集中的样本点,通过寻找最优的分割线或超平面来实现分类。这里的最优意味着,将不同类别的样本点分隔得尽可能宽,以提高对新样本的泛化能力。分割线或超平面两侧的数据点被称为支持向量,它们对分类决策起到重要作用。
+ Q7 ]9 w8 n3 ^/ c( V8 v
这段代码是一个简单的支持向量机(SVM)分类器的示例。代码使用了名为 "heart_scale" 的数据集,首先将数据集分为训练集和测试集,然后利用SVM模型对测试集进行分类,并将结果与实际标签进行对比。为了可视化高维数据,代码还使用了多维缩放(MDS)将数据从13维降低到2维。+ ?* V* t- |8 o; I/ k5 K5 A
首先,代码读取 "heartscale" 数据集,其中包括标签(heartscalelabel)和特征向量(heartscale_inst)。然后确定训练集和测试集的索引,并将数据分成相应的部分。
* Q/ X2 \, ^* I+ X, U% t- I- U; r接下来,代码使用训练集数据(trainData)和标签(trainLabel)训练SVM模型。然后使用训练好的模型对测试集数据(testData)进行分类,得到预测标签(predictlabel)、准确率(accuracy)和类别概率值(probvalues)。
; U4 p/ m- G4 c/ s代码的下一部分是为每个类别分配颜色。根据数据集标签的值,将其转换为类别索引,然后使用预先定义的颜色列表(colorList)为每个类别确定颜色。) C7 C' {6 y" l- B, N% N
通过多维缩放(MDS),代码将原始的13维特征向量降低到2维。首先,通过计算特征向量间的欧氏距离(distanceMatrix),得到距离矩阵。然后,将距离矩阵作为输入,使用MDS将特征向量降低到2维,得到新的坐标(newCoor)。
4 m: r& D* Q% O9 A* {2 T  P最后,代码使用散点图展示结果。首先,在整个数据集上绘制散点图,并根据真实类别(colorTrueClass)为每个数据点上色。然后,绘制测试集的散点图,并根据真实类别(colorTrueClassPlot)和预测类别(colorResultClass)分别为数据点上色。最后,绘制训练集的散点图,并根据真实类别(colorTrueClassPlot)为数据点上色。
) E5 @+ i) r" I# {% [' {2 u& }, t7 c0 V( \6 H; H# ?
当然,我会逐行解释以下代码的功能和作用。2 G) }6 G9 j# U& g- e1 d; l) w& H
clear
" t' z; {  U; vclc
1 X# h4 M+ Q" V& l: E9 U6 W8 X3 \close all
8 ?, f! A; `! i2 i% V# c, q. E$ S4 J& U* |
这些行代码用于清除MATLAB工作区域中的变量,清除命令行窗口上的内容,并关闭所有打开的图形窗口。
, }+ Q) c' ^; _2 c& b[heart_scale_label, heart_scale_inst] = libsvmread('heart_scale');; c9 i$ a9 c; m# U
[N,D] = size(heart_scale_inst);
: N; d' q, F) i0 [6 k- _& t4 z2 K3 g- U$ ~* W( V9 }4 P
这两行代码读取文件 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 是每个数据点的特征维度。6 y4 r/ c1 n- c" X" h. P1 K$ L7 J
trainIndex = zeros(N,1); trainIndex(1:200) = 1;7 R( F; ?9 R# D, f9 T, W
testIndex = zeros(N,1); testIndex(201:N) = 1;
* ], l+ a6 i  y( z0 B+ @trainData = heart_scale_inst(trainIndex==1,;  x, k* ]  G, X% T8 d+ a
trainLabel = heart_scale_label(trainIndex==1,;8 ^* i) R8 q6 W+ Q
testData = heart_scale_inst(testIndex==1,;" _1 F, u. S8 w, A" M. C/ y
testLabel = heart_scale_label(testIndex==1,;( J; B; j5 ?7 ^/ k! m$ }! C% X

- Z6 c3 w' ?/ V; }  A8 L这部分代码定义了训练集和测试集的索引,并使用这些索引将数据划分为相应的部分。首先,通过创建一个大小为 N 的零向量 trainIndex 和 testIndex,将训练集和测试集的索引位置标记为1。然后,使用这些索引从 heart_scale_inst 和 heart_scale_label 中选择相应的数据点和标签,形成训练集数据 (trainData)、训练集标签 (trainLabel)、测试集数据 (testData) 和测试集标签 (testLabel)。
8 K* K' j4 B; K) Y, _+ kmodel = svmtrain(trainLabel, trainData, '-c 1 -g 0.07 -b 1');+ _% t7 n( w, N; J1 G0 M
[predict_label, accuracy, prob_values] = svmpredict(testLabel, testData, model, '-b 1');6 q% f+ K3 d, C) [4 {( B9 n
' o9 W. w( h" P
这部分代码使用支持向量机 (SVM) 进行训练和测试。首先,使用 svmtrain 函数训练一个SVM模型,其中训练集标签 (trainLabel) 和训练集数据 (trainData) 作为输入。额外的参数 -c 1 -g 0.07 -b 1 是SVM的参数设置,其中 -c 是惩罚项系数,-g 是高斯核函数的参数,-b 启用概率输出。训练完成后,得到一个训练好的模型 (model)。" F# d6 y6 ?; `' `) L
然后,使用 svmpredict 函数根据 model 对测试集数据 (testData) 进行预测,并将预测标签 (predict_label)、准确率 (accuracy) 和类别概率值 (prob_values) 分别赋值给相应的变量。
+ z  y0 T# ~% @! ucolorList = prism(100);
6 ?8 U7 M2 E- R! l7 W1 `! HtrueClassIndex = zeros(N,1);$ W* z' ?' z3 x2 z. T% M! `
trueClassIndex(heart_scale_label==1) = 1;
1 r% o! _* ]1 |# E' p$ a6 S5 F; {# PtrueClassIndex(heart_scale_label==-1) = 2;
1 @0 z6 O$ Y, ~3 O" o, p/ w! acolorTrueClass = colorList(trueClassIndex,;* j3 }3 V* X* {% h' @; t
resultClassIndex = zeros(length(predict_label),1);
3 F) q- d" W* B. R3 JresultClassIndex(predict_label==1) = 1;# z  {4 m- B" L' Q% R- b' A, H
resultClassIndex(predict_label==-1) = 2;7 P* k* E$ E1 ~0 I, y4 [$ k" ?, G2 o
colorResultClass = colorList(resultClassIndex,;$ M+ r3 O1 o6 G' j7 a6 x1 N% W
# x  |+ n; y/ x( v- p9 [6 g7 i
这部分代码用于为每个类别分配颜色。通过 prism(100) 函数创建一个颜色映射列表 colorList。然后,根据原始数据的标签 (heart_scale_label),将标签为1的数据点的索引标记为1,标签为-1的数据点的索引标记为2。根据这些索引,从 colorList 中选择相应的颜色,得到真实类别的颜色 (colorTrueClass)。类似地,使用预测标签 (predict_label) 创建结果类别的颜色 (colorResultClass)。
' G/ V  j$ Y& b- p% \distanceMatrix = pdist(heart_scale_inst,'euclidean');
& x$ ?/ w4 Q, [, tnewCoor = mdscale(distanceMatrix,2);
0 f8 q' G. p0 q! v
* r" K. a, Y/ l0 W2 _+ ?这部分代码计算了原始数据点之间的欧氏距离矩阵 (distanceMatrix),并将其作为输入传递给 mdscale 函数。mdscale 函数将高维特征向量 (13D) 降维到2维,并返回新的二维坐标 (newCoor)。7 L2 p% e3 l# {% q" W( K/ |7 A  P) d
x = newCoor(:,1);7 W- e% q  k) J0 E
y = newCoor(:,2);
% Q) y$ k  k8 Z. V6 ipatchSize = 30;+ K' B1 k* n" c3 b0 g
colorTrueClassPlot = colorTrueClass;
+ G8 X; Z, S% R! J$ |figure; scatter(x,y,patchSize,colorTrueClassPlot,'filled');
; \5 Z7 m( N$ F& q3 U; Xtitle('whole data set');6 V, o. h( c9 N
. ^! Z( T2 N1 B1 B) f; q# M
这部分代码用于绘制整个数据集的散点图。首先,将新的坐标中的第一列 (x) 和第二列 (y) 分别赋值给变量。然后,根据真实类别的颜色 (colorTrueClassPlot),使用 scatter 函数绘制散点图,并设置散点的大小为 patchSize。最后,通过 title 函数给图像添加标题。
9 @. {1 K; r% a& C9 F  m7 R1 Lx = newCoor(testIndex==1,1);
0 U4 @& v3 Q6 y6 Y% t  N" dy = newCoor(testIndex==1,2);
8 c/ `1 L8 {* `! A( ~8 X) `patchSize = 80*max(prob_values,[],2);, `% l4 r" Z; A, _: w
colorTrueClassPlot = colorTrueClass(testIndex==1,;
, `$ q5 [! n0 z3 u- _) ofigure; hold on;
0 {5 [6 Y- W2 K% C; K% l8 P& F/ `scatter(x,y,2*patchSize,colorTrueClassPlot,'o','filled');
; }* v/ i& l0 Z! i* hscatter(x,y,patchSize,colorResultClass,'o','filled');
" f5 I2 \3 t. T1 U, A0 h0 _9 Gx = newCoor(trainIndex==1,1);
/ X9 }- @& W% N5 `9 c9 }y = newCoor(trainIndex==1,2);; D" ?+ {0 z* |5 ?5 d
patchSize = 30;" G; d% a  N1 K3 s( Y& A8 K3 H/ p
colorTrueClassPlot = colorTrueClass(trainIndex==1,;5 }3 V# {" k2 a3 m) l
scatter(x,y,patchSize,colorTrueClassPlot,'o');4 v. k: n) ~" d$ d- A; I2 q. ?" t
title('classification results');
6 [- _9 k# J$ S" Y# r+ N6 ?, k
: l4 T  O: n. `! c7 M( N这部分代码用于绘制分类结果的散点图。首先,将测试集的新坐标 (newCoor) 中仅包含测试数据的部分的第一列 (x) 和第二列 (y) 赋值给 x 和 y 变量。然后,根据真实类别的颜色 (colorTrueClassPlot) 使用 scatter 函数绘制测试数据的散点图,设置散点的大小为 patchSize 的2倍,并使用真实类别的颜色填充。接下来,再次使用 scatter 函数绘制测试数据的散点图,散点的大小为 patchSize,颜色根据预测的类别 (colorResultClass) 填充。最后,将训练集数据的散点图绘制在图像上,同样使用真实类别的颜色填充。通过 title 函数给图像添加标题。
, N$ y( p0 q( a9 d1 @9 j  M5 k8 ^希望这些逐行解释能够帮助您理解代码的功能和作用。如果还有其他问题,请随时提问。, S& L# K* z& C. X* S

) {- ~6 w8 i' m, c# F4 b* Y( ?& ~0 z5 }5 I
5 o  ]6 p5 W1 l- ?* s

SVM.rar

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

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

zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-6-14 15:29 , Processed in 0.430078 second(s), 54 queries .

回顶部