- 在线时间
- 479 小时
- 最后登录
- 2026-4-13
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7789 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2922
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1171
- 主题
- 1186
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
|
支持向量机(Support Vector Machine,SVM)是一种常用的监督学习算法,广泛应用于模式识别、分类和回归分析等领域。SVM 的主要目标是找到一个最优的超平面来对数据进行划分,并实现在非线性情况下的高效分类。 通俗地说,我们可以想象 SVM 是一个将不同类别的数据点分隔开的分割线(二维平面)或超平面(高维空间)。SVM基于训练集中的样本点,通过寻找最优的分割线或超平面来实现分类。这里的最优意味着,将不同类别的样本点分隔得尽可能宽,以提高对新样本的泛化能力。分割线或超平面两侧的数据点被称为支持向量,它们对分类决策起到重要作用。 * n% [4 b5 Z, b2 S
这段代码是一个简单的支持向量机(SVM)分类器的示例。代码使用了名为 "heart_scale" 的数据集,首先将数据集分为训练集和测试集,然后利用SVM模型对测试集进行分类,并将结果与实际标签进行对比。为了可视化高维数据,代码还使用了多维缩放(MDS)将数据从13维降低到2维。$ G9 B- ]( V: ~, n7 F
首先,代码读取 "heartscale" 数据集,其中包括标签(heartscalelabel)和特征向量(heartscale_inst)。然后确定训练集和测试集的索引,并将数据分成相应的部分。
* }: g- R. x+ G+ R+ w接下来,代码使用训练集数据(trainData)和标签(trainLabel)训练SVM模型。然后使用训练好的模型对测试集数据(testData)进行分类,得到预测标签(predictlabel)、准确率(accuracy)和类别概率值(probvalues)。
- e; a1 y/ G- A" k; i" ]3 k代码的下一部分是为每个类别分配颜色。根据数据集标签的值,将其转换为类别索引,然后使用预先定义的颜色列表(colorList)为每个类别确定颜色。0 p' f1 S$ `' C- E0 T
通过多维缩放(MDS),代码将原始的13维特征向量降低到2维。首先,通过计算特征向量间的欧氏距离(distanceMatrix),得到距离矩阵。然后,将距离矩阵作为输入,使用MDS将特征向量降低到2维,得到新的坐标(newCoor)。" E3 w$ o5 Q: O* ^! |+ r7 S
最后,代码使用散点图展示结果。首先,在整个数据集上绘制散点图,并根据真实类别(colorTrueClass)为每个数据点上色。然后,绘制测试集的散点图,并根据真实类别(colorTrueClassPlot)和预测类别(colorResultClass)分别为数据点上色。最后,绘制训练集的散点图,并根据真实类别(colorTrueClassPlot)为数据点上色。: u& t& z3 ?) Y2 f5 J4 n& o* {
& J$ S% _" m) M0 y: K
当然,我会逐行解释以下代码的功能和作用。/ ? E4 k: |1 O% R7 W3 p* ]
clear
x: o% E, {0 n' N' yclc$ x7 r( Y2 `& v
close all5 t7 R/ f+ h3 I9 t ?6 \. ?
2 w! ~: C$ k! v0 d# s; U
这些行代码用于清除MATLAB工作区域中的变量,清除命令行窗口上的内容,并关闭所有打开的图形窗口。) m; i& p1 N6 _1 y/ G" g+ t9 A
[heart_scale_label, heart_scale_inst] = libsvmread('heart_scale');
6 o: n' l5 c+ U u( D$ @" I[N,D] = size(heart_scale_inst);3 p Q [0 C) p) Y" p
4 f: S) O. w/ [* }) Y) ]2 ], ^$ o% |
这两行代码读取文件 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 是每个数据点的特征维度。. W( ~) J2 Q2 I% S4 F$ }" R
trainIndex = zeros(N,1); trainIndex(1:200) = 1;& F7 U/ v2 _" `1 E6 g
testIndex = zeros(N,1); testIndex(201:N) = 1;
: \3 E. c. Y* [2 b. c9 l/ `; A+ \trainData = heart_scale_inst(trainIndex==1, ;3 A: @$ ^5 Z) n+ _
trainLabel = heart_scale_label(trainIndex==1, ;
# q+ C! P$ q7 _* {6 n6 g, {% wtestData = heart_scale_inst(testIndex==1, ;
- x2 o/ i7 k. \testLabel = heart_scale_label(testIndex==1, ;
' k0 w: Z& L- N9 a" n$ q1 F" g* I8 V8 S3 g
这部分代码定义了训练集和测试集的索引,并使用这些索引将数据划分为相应的部分。首先,通过创建一个大小为 N 的零向量 trainIndex 和 testIndex,将训练集和测试集的索引位置标记为1。然后,使用这些索引从 heart_scale_inst 和 heart_scale_label 中选择相应的数据点和标签,形成训练集数据 (trainData)、训练集标签 (trainLabel)、测试集数据 (testData) 和测试集标签 (testLabel)。6 ]0 p$ T# e6 K+ P r' ?
model = svmtrain(trainLabel, trainData, '-c 1 -g 0.07 -b 1');: f6 s- O3 o2 G0 l, p4 }
[predict_label, accuracy, prob_values] = svmpredict(testLabel, testData, model, '-b 1');
. I7 b. o' l$ |6 b4 n2 m
/ |4 H; v( E0 I( k2 I; _这部分代码使用支持向量机 (SVM) 进行训练和测试。首先,使用 svmtrain 函数训练一个SVM模型,其中训练集标签 (trainLabel) 和训练集数据 (trainData) 作为输入。额外的参数 -c 1 -g 0.07 -b 1 是SVM的参数设置,其中 -c 是惩罚项系数,-g 是高斯核函数的参数,-b 启用概率输出。训练完成后,得到一个训练好的模型 (model)。6 V8 `/ Z& Q" E3 d4 ~4 w) l+ b9 |
然后,使用 svmpredict 函数根据 model 对测试集数据 (testData) 进行预测,并将预测标签 (predict_label)、准确率 (accuracy) 和类别概率值 (prob_values) 分别赋值给相应的变量。
% Y3 y5 T3 I+ g/ |% ?colorList = prism(100);. X/ v8 e a$ T& l6 T; I
trueClassIndex = zeros(N,1);( G( _! q3 b% s j5 t! Y) j
trueClassIndex(heart_scale_label==1) = 1;+ f: S5 ~. P2 M9 g3 o, ?, V
trueClassIndex(heart_scale_label==-1) = 2;
+ |3 z& V1 u+ C& VcolorTrueClass = colorList(trueClassIndex, ;
9 `7 N& E; l0 `; t+ ?( AresultClassIndex = zeros(length(predict_label),1);
7 v; \$ b4 N L9 r: _2 t$ t+ p9 DresultClassIndex(predict_label==1) = 1;
5 Z9 c7 {# b3 v# X% h# a& ?/ KresultClassIndex(predict_label==-1) = 2;/ P2 I. ^5 r6 J" k
colorResultClass = colorList(resultClassIndex, ;5 i6 U* A) b) E- U; L
2 t. x2 _, P) Y& Y& M6 Y1 B* \
这部分代码用于为每个类别分配颜色。通过 prism(100) 函数创建一个颜色映射列表 colorList。然后,根据原始数据的标签 (heart_scale_label),将标签为1的数据点的索引标记为1,标签为-1的数据点的索引标记为2。根据这些索引,从 colorList 中选择相应的颜色,得到真实类别的颜色 (colorTrueClass)。类似地,使用预测标签 (predict_label) 创建结果类别的颜色 (colorResultClass)。; [1 g; K4 |( W: V+ t+ Y9 a8 @+ G
distanceMatrix = pdist(heart_scale_inst,'euclidean');0 @1 y5 k8 H' E. _
newCoor = mdscale(distanceMatrix,2);
; Q8 P n. m6 Y- r" M
3 A. n. ~/ ^/ u0 M5 {这部分代码计算了原始数据点之间的欧氏距离矩阵 (distanceMatrix),并将其作为输入传递给 mdscale 函数。mdscale 函数将高维特征向量 (13D) 降维到2维,并返回新的二维坐标 (newCoor)。0 W7 X+ I9 q! O' e# x7 x
x = newCoor(:,1);
, M% F+ s* b1 d) f3 l1 p! Cy = newCoor(:,2);( i, d I5 z% O; z) p) `# ~
patchSize = 30;, f8 n: n3 q5 G2 g
colorTrueClassPlot = colorTrueClass;" R/ w: \$ Q. i6 N! a. t
figure; scatter(x,y,patchSize,colorTrueClassPlot,'filled');
4 _$ W& h2 S# L0 \) q! dtitle('whole data set');
2 [6 ~( h' W7 |- s
1 J9 ~7 _# m& l& F7 I4 J+ I这部分代码用于绘制整个数据集的散点图。首先,将新的坐标中的第一列 (x) 和第二列 (y) 分别赋值给变量。然后,根据真实类别的颜色 (colorTrueClassPlot),使用 scatter 函数绘制散点图,并设置散点的大小为 patchSize。最后,通过 title 函数给图像添加标题。; ], u, \8 p/ ?4 |% g
x = newCoor(testIndex==1,1);7 {2 y# [% b( u4 ]
y = newCoor(testIndex==1,2);
, U6 _' _& O. Q XpatchSize = 80*max(prob_values,[],2);: h% _; g$ X- a! k9 m5 I% j
colorTrueClassPlot = colorTrueClass(testIndex==1, ;
8 R/ F/ t$ }9 F$ q1 Sfigure; hold on;& A) x7 K2 e% {! b8 ?# V6 R" t [
scatter(x,y,2*patchSize,colorTrueClassPlot,'o','filled');
' D b& i4 R3 y+ Uscatter(x,y,patchSize,colorResultClass,'o','filled');+ Z9 y0 B" L$ Z6 @; I
x = newCoor(trainIndex==1,1);# Z% g% E+ E5 Q; U1 u( ]5 E
y = newCoor(trainIndex==1,2);
( m- _% j1 b1 cpatchSize = 30;
5 S. D% [, K& ~4 C+ S2 h0 McolorTrueClassPlot = colorTrueClass(trainIndex==1, ;
4 M) s$ Q1 p# b4 H) ^# ~8 ]scatter(x,y,patchSize,colorTrueClassPlot,'o');
! j' z% c5 U5 y7 y; h/ r: _0 e% Wtitle('classification results');+ P; T1 O# X# Z7 L: [) H/ s
6 ~/ M& N$ K% P q7 Q
这部分代码用于绘制分类结果的散点图。首先,将测试集的新坐标 (newCoor) 中仅包含测试数据的部分的第一列 (x) 和第二列 (y) 赋值给 x 和 y 变量。然后,根据真实类别的颜色 (colorTrueClassPlot) 使用 scatter 函数绘制测试数据的散点图,设置散点的大小为 patchSize 的2倍,并使用真实类别的颜色填充。接下来,再次使用 scatter 函数绘制测试数据的散点图,散点的大小为 patchSize,颜色根据预测的类别 (colorResultClass) 填充。最后,将训练集数据的散点图绘制在图像上,同样使用真实类别的颜色填充。通过 title 函数给图像添加标题。' {# [' I1 u& P/ o* w, ^) b% o
希望这些逐行解释能够帮助您理解代码的功能和作用。如果还有其他问题,请随时提问。+ }4 a2 } z: T. y, w$ G
+ X! M: r5 E f9 N: M
4 A0 f9 j8 R2 K' P
- [1 d7 [ e/ d b; o' q, z |
-
-
SVM.rar
6.37 KB, 下载次数: 0, 下载积分: 体力 -2 点
售价: 3 点体力 [记录]
[购买]
zan
|