- 在线时间
- 478 小时
- 最后登录
- 2026-4-9
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7788 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2922
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1171
- 主题
- 1186
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
|
支持向量机(Support Vector Machine,SVM)是一种常用的监督学习算法,广泛应用于模式识别、分类和回归分析等领域。SVM 的主要目标是找到一个最优的超平面来对数据进行划分,并实现在非线性情况下的高效分类。 通俗地说,我们可以想象 SVM 是一个将不同类别的数据点分隔开的分割线(二维平面)或超平面(高维空间)。SVM基于训练集中的样本点,通过寻找最优的分割线或超平面来实现分类。这里的最优意味着,将不同类别的样本点分隔得尽可能宽,以提高对新样本的泛化能力。分割线或超平面两侧的数据点被称为支持向量,它们对分类决策起到重要作用。
& M1 Z2 ~$ q( Z8 V1 \" \2 c1 o7 w这段代码是一个简单的支持向量机(SVM)分类器的示例。代码使用了名为 "heart_scale" 的数据集,首先将数据集分为训练集和测试集,然后利用SVM模型对测试集进行分类,并将结果与实际标签进行对比。为了可视化高维数据,代码还使用了多维缩放(MDS)将数据从13维降低到2维。* _7 o7 {! x- ?3 U( x" J8 k
首先,代码读取 "heartscale" 数据集,其中包括标签(heartscalelabel)和特征向量(heartscale_inst)。然后确定训练集和测试集的索引,并将数据分成相应的部分。
6 |2 j$ M& \9 w- j接下来,代码使用训练集数据(trainData)和标签(trainLabel)训练SVM模型。然后使用训练好的模型对测试集数据(testData)进行分类,得到预测标签(predictlabel)、准确率(accuracy)和类别概率值(probvalues)。( L {# q3 W6 ~3 X; j/ m; s8 Q
代码的下一部分是为每个类别分配颜色。根据数据集标签的值,将其转换为类别索引,然后使用预先定义的颜色列表(colorList)为每个类别确定颜色。& ^4 s" }- H" D3 F8 i
通过多维缩放(MDS),代码将原始的13维特征向量降低到2维。首先,通过计算特征向量间的欧氏距离(distanceMatrix),得到距离矩阵。然后,将距离矩阵作为输入,使用MDS将特征向量降低到2维,得到新的坐标(newCoor)。
: U/ ]! e* f9 ]& B1 v; X8 }最后,代码使用散点图展示结果。首先,在整个数据集上绘制散点图,并根据真实类别(colorTrueClass)为每个数据点上色。然后,绘制测试集的散点图,并根据真实类别(colorTrueClassPlot)和预测类别(colorResultClass)分别为数据点上色。最后,绘制训练集的散点图,并根据真实类别(colorTrueClassPlot)为数据点上色。
& y+ J2 F* p+ Y; [; Z& a7 Q# W' E" ]0 y. N
当然,我会逐行解释以下代码的功能和作用。2 t, E8 k/ C" P6 M( s
clear
% r- n c( x- h' S6 O, qclc; S: n, P9 n: V& {5 T- a
close all6 Y+ Z/ j0 Y4 C. V' ~
! v- v, J, Y7 t( F( m P; V
这些行代码用于清除MATLAB工作区域中的变量,清除命令行窗口上的内容,并关闭所有打开的图形窗口。& f6 I+ e9 b0 O1 C3 w! y
[heart_scale_label, heart_scale_inst] = libsvmread('heart_scale');
/ E1 d& X& ~: ~[N,D] = size(heart_scale_inst);
6 ~% v7 G0 d: q3 k" r2 M4 n- d( i# J4 e; O# O: M; V
这两行代码读取文件 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 是每个数据点的特征维度。
& h3 G# Z, S CtrainIndex = zeros(N,1); trainIndex(1:200) = 1;' H9 Y( B. t) A+ C+ I( E
testIndex = zeros(N,1); testIndex(201:N) = 1;2 m0 s5 H( x" X( E Q
trainData = heart_scale_inst(trainIndex==1, ;( r1 U. g% C+ o# h& f6 j" }
trainLabel = heart_scale_label(trainIndex==1, ;# v! Z. D) z) ?2 J
testData = heart_scale_inst(testIndex==1, ;$ F9 [+ [' _3 x" q, w" |, _
testLabel = heart_scale_label(testIndex==1, ;! e+ ?' c Y3 M) T! y3 ^0 t
; c- S4 ?1 ?3 ]8 r! a/ T1 T
这部分代码定义了训练集和测试集的索引,并使用这些索引将数据划分为相应的部分。首先,通过创建一个大小为 N 的零向量 trainIndex 和 testIndex,将训练集和测试集的索引位置标记为1。然后,使用这些索引从 heart_scale_inst 和 heart_scale_label 中选择相应的数据点和标签,形成训练集数据 (trainData)、训练集标签 (trainLabel)、测试集数据 (testData) 和测试集标签 (testLabel)。, c$ D" S$ {) t# t; d% v
model = svmtrain(trainLabel, trainData, '-c 1 -g 0.07 -b 1');/ M, V( J/ `. O& U4 Q5 \* C" Z; I
[predict_label, accuracy, prob_values] = svmpredict(testLabel, testData, model, '-b 1');3 x! v1 c, t' q% W+ @% A6 f6 c
+ I7 D+ \9 [. R! G1 Z这部分代码使用支持向量机 (SVM) 进行训练和测试。首先,使用 svmtrain 函数训练一个SVM模型,其中训练集标签 (trainLabel) 和训练集数据 (trainData) 作为输入。额外的参数 -c 1 -g 0.07 -b 1 是SVM的参数设置,其中 -c 是惩罚项系数,-g 是高斯核函数的参数,-b 启用概率输出。训练完成后,得到一个训练好的模型 (model)。
: w+ e" O% T) q7 h然后,使用 svmpredict 函数根据 model 对测试集数据 (testData) 进行预测,并将预测标签 (predict_label)、准确率 (accuracy) 和类别概率值 (prob_values) 分别赋值给相应的变量。
8 G! X* `3 K/ E, {' scolorList = prism(100);
7 [. `; f: t5 ?( L% B" w' F* L" k8 ctrueClassIndex = zeros(N,1);$ R( U' z+ r' ?6 I% S1 m% G
trueClassIndex(heart_scale_label==1) = 1;
! B( G+ V8 ^1 [6 J. C' CtrueClassIndex(heart_scale_label==-1) = 2;
( O9 r1 j, V$ k- |/ LcolorTrueClass = colorList(trueClassIndex, ;
T& i3 C" e) `resultClassIndex = zeros(length(predict_label),1);2 w# c7 y5 q3 O( K
resultClassIndex(predict_label==1) = 1;
3 b$ m9 t) K$ V$ U& XresultClassIndex(predict_label==-1) = 2;
) A$ m/ C! ~2 F' }! DcolorResultClass = colorList(resultClassIndex, ;
! i+ ?4 }' v# J4 `+ t" H# D! B1 j9 O! ]1 D0 I% ]
这部分代码用于为每个类别分配颜色。通过 prism(100) 函数创建一个颜色映射列表 colorList。然后,根据原始数据的标签 (heart_scale_label),将标签为1的数据点的索引标记为1,标签为-1的数据点的索引标记为2。根据这些索引,从 colorList 中选择相应的颜色,得到真实类别的颜色 (colorTrueClass)。类似地,使用预测标签 (predict_label) 创建结果类别的颜色 (colorResultClass)。
' o6 P" @$ z- Z4 H4 cdistanceMatrix = pdist(heart_scale_inst,'euclidean');
( r) a/ t0 {' EnewCoor = mdscale(distanceMatrix,2);* Y0 y8 ?( f3 H4 N0 R
% t( n( z8 R8 \' k U
这部分代码计算了原始数据点之间的欧氏距离矩阵 (distanceMatrix),并将其作为输入传递给 mdscale 函数。mdscale 函数将高维特征向量 (13D) 降维到2维,并返回新的二维坐标 (newCoor)。% o" E6 k5 ~1 B _8 s% ?
x = newCoor(:,1);
9 {$ q6 o* _: ~, _6 C7 @y = newCoor(:,2); k5 ~& Q# l4 o! q2 T1 z
patchSize = 30;
3 f$ R% ` D; CcolorTrueClassPlot = colorTrueClass;/ a8 K v+ H* n
figure; scatter(x,y,patchSize,colorTrueClassPlot,'filled');! K! V5 ], b, G7 j. L# R0 F, E* {
title('whole data set');
n# w) c3 |) [- S; U
+ s: j; S- e2 h" d! H% P9 P这部分代码用于绘制整个数据集的散点图。首先,将新的坐标中的第一列 (x) 和第二列 (y) 分别赋值给变量。然后,根据真实类别的颜色 (colorTrueClassPlot),使用 scatter 函数绘制散点图,并设置散点的大小为 patchSize。最后,通过 title 函数给图像添加标题。
5 E8 r2 a8 G2 f# v0 ~& A0 }9 ax = newCoor(testIndex==1,1);
! _4 e: k8 L* R, @% \8 ry = newCoor(testIndex==1,2);: e/ I7 s7 x6 z7 H: |' E
patchSize = 80*max(prob_values,[],2);
: Q& g: ~7 }0 ^' u1 C; h) AcolorTrueClassPlot = colorTrueClass(testIndex==1, ; j. |7 j1 S& \4 Y6 ]* [* _! k) l
figure; hold on;
7 a( F& ^4 P0 h5 ]* Qscatter(x,y,2*patchSize,colorTrueClassPlot,'o','filled');9 B& u4 ]: O9 O4 L
scatter(x,y,patchSize,colorResultClass,'o','filled');& u2 q. P( K2 @" _
x = newCoor(trainIndex==1,1);
, m, h$ Y! u9 `8 m0 n- [+ py = newCoor(trainIndex==1,2);* G% F( J% i8 I
patchSize = 30;! y; _2 R9 Q6 j. l! s" S
colorTrueClassPlot = colorTrueClass(trainIndex==1, ;
* n. q2 U" G0 \1 K) f. escatter(x,y,patchSize,colorTrueClassPlot,'o');
1 H- z" t& e( h: u& G( u7 stitle('classification results');
: G; z, K: A' O J' t; @, p
5 P- ^* }4 g( o' I' t! P' G这部分代码用于绘制分类结果的散点图。首先,将测试集的新坐标 (newCoor) 中仅包含测试数据的部分的第一列 (x) 和第二列 (y) 赋值给 x 和 y 变量。然后,根据真实类别的颜色 (colorTrueClassPlot) 使用 scatter 函数绘制测试数据的散点图,设置散点的大小为 patchSize 的2倍,并使用真实类别的颜色填充。接下来,再次使用 scatter 函数绘制测试数据的散点图,散点的大小为 patchSize,颜色根据预测的类别 (colorResultClass) 填充。最后,将训练集数据的散点图绘制在图像上,同样使用真实类别的颜色填充。通过 title 函数给图像添加标题。4 C4 P. W! ` t& s/ I- Y% N/ t3 H$ N
希望这些逐行解释能够帮助您理解代码的功能和作用。如果还有其他问题,请随时提问。
. @1 k' r4 f% c1 K1 S6 k( G2 `
. N- R" N8 M1 }% I, l) G+ f* p+ `
. C0 E; a! Z+ Q/ {& j+ g% N3 s i) U: r* R- U
|
-
-
SVM.rar
6.37 KB, 下载次数: 0, 下载积分: 体力 -2 点
售价: 3 点体力 [记录]
[购买]
zan
|