QQ登录

只需要一步,快速开始

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

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

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

1175

主题

4

听众

2860

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-8-19 16:41 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
支持向量机(Support Vector Machine,SVM)是一种常用的监督学习算法,广泛应用于模式识别、分类和回归分析等领域。SVM 的主要目标是找到一个最优的超平面来对数据进行划分,并实现在非线性情况下的高效分类。
通俗地说,我们可以想象 SVM 是一个将不同类别的数据点分隔开的分割线(二维平面)或超平面(高维空间)。SVM基于训练集中的样本点,通过寻找最优的分割线或超平面来实现分类。这里的最优意味着,将不同类别的样本点分隔得尽可能宽,以提高对新样本的泛化能力。分割线或超平面两侧的数据点被称为支持向量,它们对分类决策起到重要作用。

% `9 b! P+ E+ @! S( [, n  r+ r8 o这段代码是一个简单的支持向量机(SVM)分类器的示例。代码使用了名为 "heart_scale" 的数据集,首先将数据集分为训练集和测试集,然后利用SVM模型对测试集进行分类,并将结果与实际标签进行对比。为了可视化高维数据,代码还使用了多维缩放(MDS)将数据从13维降低到2维。1 M0 T# t6 X! I' ^; Q0 o
首先,代码读取 "heartscale" 数据集,其中包括标签(heartscalelabel)和特征向量(heartscale_inst)。然后确定训练集和测试集的索引,并将数据分成相应的部分。
; J# d9 U- l# X接下来,代码使用训练集数据(trainData)和标签(trainLabel)训练SVM模型。然后使用训练好的模型对测试集数据(testData)进行分类,得到预测标签(predictlabel)、准确率(accuracy)和类别概率值(probvalues)。
4 k1 D3 |  i6 c代码的下一部分是为每个类别分配颜色。根据数据集标签的值,将其转换为类别索引,然后使用预先定义的颜色列表(colorList)为每个类别确定颜色。4 I1 _2 t& D& o1 t
通过多维缩放(MDS),代码将原始的13维特征向量降低到2维。首先,通过计算特征向量间的欧氏距离(distanceMatrix),得到距离矩阵。然后,将距离矩阵作为输入,使用MDS将特征向量降低到2维,得到新的坐标(newCoor)。' l8 c. z+ ^, X4 J/ F9 U
最后,代码使用散点图展示结果。首先,在整个数据集上绘制散点图,并根据真实类别(colorTrueClass)为每个数据点上色。然后,绘制测试集的散点图,并根据真实类别(colorTrueClassPlot)和预测类别(colorResultClass)分别为数据点上色。最后,绘制训练集的散点图,并根据真实类别(colorTrueClassPlot)为数据点上色。- V5 s! l# v- l6 _6 Y: S) Q  p* K( Q
' s1 i3 r7 z7 z( N8 {
当然,我会逐行解释以下代码的功能和作用。: [# {! L+ b& `) ~& G
clear
( h3 u9 m+ U, ?# h8 J' ^! Wclc& _9 Z8 ~# c$ a, `! M
close all
% R- ^6 H- b/ A9 G  M
  X. k$ ?' w$ `& ]) t  U* O: f( l$ ?这些行代码用于清除MATLAB工作区域中的变量,清除命令行窗口上的内容,并关闭所有打开的图形窗口。
0 t* ]$ V+ V3 G; ~* u/ p[heart_scale_label, heart_scale_inst] = libsvmread('heart_scale');0 R" C' p9 n* x9 N
[N,D] = size(heart_scale_inst);( B# Y5 W5 }6 x' a: H
. z8 g- A, u  Q3 G2 u" B. c
这两行代码读取文件 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 是每个数据点的特征维度。
( r7 K: c/ [+ P3 I, s; FtrainIndex = zeros(N,1); trainIndex(1:200) = 1;
& A' A9 T, S! g1 j4 otestIndex = zeros(N,1); testIndex(201:N) = 1;
2 Z1 \% G  m* R2 z" a+ HtrainData = heart_scale_inst(trainIndex==1,;
7 D1 Y! t3 Y7 h2 u/ d1 U% H9 OtrainLabel = heart_scale_label(trainIndex==1,;( g( \: t3 M6 G" G. h+ o
testData = heart_scale_inst(testIndex==1,;. n/ ^+ ?4 O0 C' H; p* x* b, a
testLabel = heart_scale_label(testIndex==1,;9 |) C1 d* l0 F1 l4 a6 a. U
5 o* _! {9 g4 o0 ]/ X
这部分代码定义了训练集和测试集的索引,并使用这些索引将数据划分为相应的部分。首先,通过创建一个大小为 N 的零向量 trainIndex 和 testIndex,将训练集和测试集的索引位置标记为1。然后,使用这些索引从 heart_scale_inst 和 heart_scale_label 中选择相应的数据点和标签,形成训练集数据 (trainData)、训练集标签 (trainLabel)、测试集数据 (testData) 和测试集标签 (testLabel)。0 h: e1 {' L" `/ k- E" h+ P$ I+ K+ I
model = svmtrain(trainLabel, trainData, '-c 1 -g 0.07 -b 1');1 g: J2 z3 v) v6 R
[predict_label, accuracy, prob_values] = svmpredict(testLabel, testData, model, '-b 1');5 k. D* e, w# p9 a4 b
, t: Z' Y7 R% U; k, Q9 k  P$ b+ |5 Z
这部分代码使用支持向量机 (SVM) 进行训练和测试。首先,使用 svmtrain 函数训练一个SVM模型,其中训练集标签 (trainLabel) 和训练集数据 (trainData) 作为输入。额外的参数 -c 1 -g 0.07 -b 1 是SVM的参数设置,其中 -c 是惩罚项系数,-g 是高斯核函数的参数,-b 启用概率输出。训练完成后,得到一个训练好的模型 (model)。% l- P" e  b) w" M0 V* u' q4 w$ U
然后,使用 svmpredict 函数根据 model 对测试集数据 (testData) 进行预测,并将预测标签 (predict_label)、准确率 (accuracy) 和类别概率值 (prob_values) 分别赋值给相应的变量。
! e3 g! y; D& w: _. s: ncolorList = prism(100);
7 _; s# Y" j% K' j! y- d' F* BtrueClassIndex = zeros(N,1);
" N- u" M9 Y, t5 \& [trueClassIndex(heart_scale_label==1) = 1;. ]2 D# }1 [6 Q& V* D: o
trueClassIndex(heart_scale_label==-1) = 2;
( ~7 q3 [$ ^7 C" pcolorTrueClass = colorList(trueClassIndex,;; ^/ q4 W5 N9 @4 y! a
resultClassIndex = zeros(length(predict_label),1);
6 H9 l( ]; k! K% y  AresultClassIndex(predict_label==1) = 1;) |5 Q, P. E# m; _) S( D: ]. t
resultClassIndex(predict_label==-1) = 2;
8 W5 [, x% M/ A& c$ j! vcolorResultClass = colorList(resultClassIndex,;
: Q: r1 F5 a3 f) M% q; {# _0 s0 ]' b9 H. G% l" I+ v4 E
这部分代码用于为每个类别分配颜色。通过 prism(100) 函数创建一个颜色映射列表 colorList。然后,根据原始数据的标签 (heart_scale_label),将标签为1的数据点的索引标记为1,标签为-1的数据点的索引标记为2。根据这些索引,从 colorList 中选择相应的颜色,得到真实类别的颜色 (colorTrueClass)。类似地,使用预测标签 (predict_label) 创建结果类别的颜色 (colorResultClass)。
0 N! @9 I8 u9 V! v3 sdistanceMatrix = pdist(heart_scale_inst,'euclidean');
% o! d. l# ~7 v' snewCoor = mdscale(distanceMatrix,2);
) m' n* k* {' e% e( K, Y# f; U1 O/ _. L: I4 o0 B
这部分代码计算了原始数据点之间的欧氏距离矩阵 (distanceMatrix),并将其作为输入传递给 mdscale 函数。mdscale 函数将高维特征向量 (13D) 降维到2维,并返回新的二维坐标 (newCoor)。
) s6 Z) C, Y5 s8 r8 E& b' ]x = newCoor(:,1);
% ~6 W2 P0 O, \. Z# E( yy = newCoor(:,2);
7 q% w/ U+ h. j. QpatchSize = 30;
: S0 t+ Z8 [/ m$ Y2 }colorTrueClassPlot = colorTrueClass;
" ~+ r) T4 t5 S9 B. t- Q6 efigure; scatter(x,y,patchSize,colorTrueClassPlot,'filled');. X; m; E( I1 h3 r% h
title('whole data set');1 S" ?5 S% D1 W# ^1 j
' B* V1 ^, _0 Y2 X+ j0 L
这部分代码用于绘制整个数据集的散点图。首先,将新的坐标中的第一列 (x) 和第二列 (y) 分别赋值给变量。然后,根据真实类别的颜色 (colorTrueClassPlot),使用 scatter 函数绘制散点图,并设置散点的大小为 patchSize。最后,通过 title 函数给图像添加标题。
- s- c( B% N; ?( }4 zx = newCoor(testIndex==1,1);
* a* U; l+ q7 Y# by = newCoor(testIndex==1,2);, I8 w  U0 C* U) j0 W& L  }
patchSize = 80*max(prob_values,[],2);
6 U( k9 t  Q' X( D  QcolorTrueClassPlot = colorTrueClass(testIndex==1,;
/ I+ x. E0 @7 ~# ?figure; hold on;
; |; L; g) D, F( \" Gscatter(x,y,2*patchSize,colorTrueClassPlot,'o','filled');
% r# {% I  [+ z9 Tscatter(x,y,patchSize,colorResultClass,'o','filled');1 M9 X- c# H4 w
x = newCoor(trainIndex==1,1);8 `0 Q. N8 R/ S1 \
y = newCoor(trainIndex==1,2);
$ x, e# D# e1 tpatchSize = 30;
. g4 k4 R+ U& bcolorTrueClassPlot = colorTrueClass(trainIndex==1,;9 u9 p( ^9 o) R
scatter(x,y,patchSize,colorTrueClassPlot,'o');% l& P, B! ^1 q- y6 Y
title('classification results');) f6 J  w+ z3 X! v, L0 T' ^
# f8 D* V9 J. K5 R; @9 H! j$ m
这部分代码用于绘制分类结果的散点图。首先,将测试集的新坐标 (newCoor) 中仅包含测试数据的部分的第一列 (x) 和第二列 (y) 赋值给 x 和 y 变量。然后,根据真实类别的颜色 (colorTrueClassPlot) 使用 scatter 函数绘制测试数据的散点图,设置散点的大小为 patchSize 的2倍,并使用真实类别的颜色填充。接下来,再次使用 scatter 函数绘制测试数据的散点图,散点的大小为 patchSize,颜色根据预测的类别 (colorResultClass) 填充。最后,将训练集数据的散点图绘制在图像上,同样使用真实类别的颜色填充。通过 title 函数给图像添加标题。
! x5 m# J' Q/ p; m% d2 V' S: b希望这些逐行解释能够帮助您理解代码的功能和作用。如果还有其他问题,请随时提问。& F9 Z2 R6 E( E. T
" x# t" A* Z& h6 P
! D% H  n3 k, N5 M

& r+ x9 b1 `& K4 n6 U' Y3 X

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, 2025-8-12 03:40 , Processed in 0.635604 second(s), 55 queries .

回顶部