- 在线时间
- 479 小时
- 最后登录
- 2026-5-9
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7813 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2931
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1173
- 主题
- 1188
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
|
支持向量机(Support Vector Machine,SVM)是一种常用的监督学习算法,广泛应用于模式识别、分类和回归分析等领域。SVM 的主要目标是找到一个最优的超平面来对数据进行划分,并实现在非线性情况下的高效分类。 通俗地说,我们可以想象 SVM 是一个将不同类别的数据点分隔开的分割线(二维平面)或超平面(高维空间)。SVM基于训练集中的样本点,通过寻找最优的分割线或超平面来实现分类。这里的最优意味着,将不同类别的样本点分隔得尽可能宽,以提高对新样本的泛化能力。分割线或超平面两侧的数据点被称为支持向量,它们对分类决策起到重要作用。
1 Z& Y) | Z: T8 I/ }/ @, H- l0 e这段代码是一个简单的支持向量机(SVM)分类器的示例。代码使用了名为 "heart_scale" 的数据集,首先将数据集分为训练集和测试集,然后利用SVM模型对测试集进行分类,并将结果与实际标签进行对比。为了可视化高维数据,代码还使用了多维缩放(MDS)将数据从13维降低到2维。
& x) F; d: `! a% _- P首先,代码读取 "heartscale" 数据集,其中包括标签(heartscalelabel)和特征向量(heartscale_inst)。然后确定训练集和测试集的索引,并将数据分成相应的部分。
% L2 s7 g& s: L/ }% R接下来,代码使用训练集数据(trainData)和标签(trainLabel)训练SVM模型。然后使用训练好的模型对测试集数据(testData)进行分类,得到预测标签(predictlabel)、准确率(accuracy)和类别概率值(probvalues)。2 q6 H; a0 h. p' R# j5 D! [
代码的下一部分是为每个类别分配颜色。根据数据集标签的值,将其转换为类别索引,然后使用预先定义的颜色列表(colorList)为每个类别确定颜色。
6 k: O3 R5 V. q4 o& a+ i$ [9 i通过多维缩放(MDS),代码将原始的13维特征向量降低到2维。首先,通过计算特征向量间的欧氏距离(distanceMatrix),得到距离矩阵。然后,将距离矩阵作为输入,使用MDS将特征向量降低到2维,得到新的坐标(newCoor)。5 K+ |( s( K; ?
最后,代码使用散点图展示结果。首先,在整个数据集上绘制散点图,并根据真实类别(colorTrueClass)为每个数据点上色。然后,绘制测试集的散点图,并根据真实类别(colorTrueClassPlot)和预测类别(colorResultClass)分别为数据点上色。最后,绘制训练集的散点图,并根据真实类别(colorTrueClassPlot)为数据点上色。1 ?* @9 q5 F# R0 E
- R0 M& Y3 }# E! \" i8 l2 w当然,我会逐行解释以下代码的功能和作用。
) H$ m) E2 ?: i" O7 Fclear4 H* v6 e! B @( u
clc4 d; D# k* B7 E
close all2 u5 ?/ S+ T' V! H G' K2 G5 ]
* l N/ b) ^4 k8 P2 u
这些行代码用于清除MATLAB工作区域中的变量,清除命令行窗口上的内容,并关闭所有打开的图形窗口。0 z8 d* w8 N% i% t
[heart_scale_label, heart_scale_inst] = libsvmread('heart_scale');! e$ J7 ?( H( a7 Y/ \. D+ R' t0 ?9 [2 R
[N,D] = size(heart_scale_inst);
+ n2 Q& I, J5 |, S* p9 C6 p% ^" k i3 B3 U% @ J. v( A1 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 是每个数据点的特征维度。
' D3 A; }( I0 YtrainIndex = zeros(N,1); trainIndex(1:200) = 1;$ o% I) {# ~$ S, o) d) |; l/ @
testIndex = zeros(N,1); testIndex(201:N) = 1;
( E, A$ p$ C6 J) \. etrainData = heart_scale_inst(trainIndex==1, ;
' C0 n% o2 p3 u- ZtrainLabel = heart_scale_label(trainIndex==1, ;
3 S5 I: n2 y) }6 w8 e0 d& `9 dtestData = heart_scale_inst(testIndex==1, ;& W% g' h& I& R$ B" m' T0 A
testLabel = heart_scale_label(testIndex==1, ;
0 B/ b4 A/ U e K
' s7 G8 N+ o! R# R. Z这部分代码定义了训练集和测试集的索引,并使用这些索引将数据划分为相应的部分。首先,通过创建一个大小为 N 的零向量 trainIndex 和 testIndex,将训练集和测试集的索引位置标记为1。然后,使用这些索引从 heart_scale_inst 和 heart_scale_label 中选择相应的数据点和标签,形成训练集数据 (trainData)、训练集标签 (trainLabel)、测试集数据 (testData) 和测试集标签 (testLabel)。* J, s0 p& B4 X
model = svmtrain(trainLabel, trainData, '-c 1 -g 0.07 -b 1');
4 F ?( n3 Z* c. d, {[predict_label, accuracy, prob_values] = svmpredict(testLabel, testData, model, '-b 1');2 g9 r# D1 a9 O- Y: u8 h
/ ~6 C" s- U6 t0 d% X* b% a! `0 Z+ X
这部分代码使用支持向量机 (SVM) 进行训练和测试。首先,使用 svmtrain 函数训练一个SVM模型,其中训练集标签 (trainLabel) 和训练集数据 (trainData) 作为输入。额外的参数 -c 1 -g 0.07 -b 1 是SVM的参数设置,其中 -c 是惩罚项系数,-g 是高斯核函数的参数,-b 启用概率输出。训练完成后,得到一个训练好的模型 (model)。
& g0 p9 b, W7 [' X- s. z然后,使用 svmpredict 函数根据 model 对测试集数据 (testData) 进行预测,并将预测标签 (predict_label)、准确率 (accuracy) 和类别概率值 (prob_values) 分别赋值给相应的变量。3 _" o1 a' S4 q8 C0 t0 D( s
colorList = prism(100);' u. }' x; v% W3 [
trueClassIndex = zeros(N,1);5 E6 [7 n6 c) n: Q9 ~
trueClassIndex(heart_scale_label==1) = 1;
+ J3 t, m. Z' O- mtrueClassIndex(heart_scale_label==-1) = 2;
+ |4 S) ~2 a! g% t% E) t* _colorTrueClass = colorList(trueClassIndex, ;, B7 @3 b( n7 I, O; K. b
resultClassIndex = zeros(length(predict_label),1);
, D1 t. N T. D0 g3 Q- |resultClassIndex(predict_label==1) = 1;
9 C2 w7 K5 o* }( Z) m" w6 p& sresultClassIndex(predict_label==-1) = 2;
( ]7 p" y7 b, o2 p& D2 ~9 zcolorResultClass = colorList(resultClassIndex, ;
9 H3 b2 G# X" y7 K0 B6 N4 K+ y' O8 M# v% ~% V
这部分代码用于为每个类别分配颜色。通过 prism(100) 函数创建一个颜色映射列表 colorList。然后,根据原始数据的标签 (heart_scale_label),将标签为1的数据点的索引标记为1,标签为-1的数据点的索引标记为2。根据这些索引,从 colorList 中选择相应的颜色,得到真实类别的颜色 (colorTrueClass)。类似地,使用预测标签 (predict_label) 创建结果类别的颜色 (colorResultClass)。
$ i# y9 }/ c3 L4 q! X! XdistanceMatrix = pdist(heart_scale_inst,'euclidean');
2 m% E* l- z) {% ?6 xnewCoor = mdscale(distanceMatrix,2);
' ^4 V' ]1 U7 a& F% T7 m# V& e2 c4 f/ Z
这部分代码计算了原始数据点之间的欧氏距离矩阵 (distanceMatrix),并将其作为输入传递给 mdscale 函数。mdscale 函数将高维特征向量 (13D) 降维到2维,并返回新的二维坐标 (newCoor)。9 Q! c2 _) J3 r# l1 n5 i
x = newCoor(:,1);
8 N- c) T' [1 D8 B& ty = newCoor(:,2);
# e- i0 F% r U! U! HpatchSize = 30;- {5 [1 k: F) L! f
colorTrueClassPlot = colorTrueClass;
8 k& O2 D9 Q \$ U+ p/ ifigure; scatter(x,y,patchSize,colorTrueClassPlot,'filled');
. f. J* b- T1 Y7 n `9 L) Ptitle('whole data set');1 ? }' C& f1 A1 w) h
/ k: P& d1 |$ }3 W& g% k这部分代码用于绘制整个数据集的散点图。首先,将新的坐标中的第一列 (x) 和第二列 (y) 分别赋值给变量。然后,根据真实类别的颜色 (colorTrueClassPlot),使用 scatter 函数绘制散点图,并设置散点的大小为 patchSize。最后,通过 title 函数给图像添加标题。, O3 Z) o0 Z2 L6 L& N; H" K" i
x = newCoor(testIndex==1,1);8 W3 F+ ]6 E- w0 g/ [: W- C2 y
y = newCoor(testIndex==1,2);% M# m4 }/ S/ ^* }4 j
patchSize = 80*max(prob_values,[],2);
5 m, j2 w9 ~# v+ }) ecolorTrueClassPlot = colorTrueClass(testIndex==1, ;- I9 Q+ p3 G) ]4 x: l" f
figure; hold on;
3 j. x4 J! g. l* j! ^3 \scatter(x,y,2*patchSize,colorTrueClassPlot,'o','filled');
o' H( h" i& c; y `1 R$ J7 ~scatter(x,y,patchSize,colorResultClass,'o','filled');
; J+ V; v4 ^/ x# a1 @2 q: zx = newCoor(trainIndex==1,1);3 \. h6 b. y: K- r
y = newCoor(trainIndex==1,2);5 B7 I/ S8 B6 X4 ?5 ^& F9 l: X
patchSize = 30;1 ~- E8 h- M- M$ u2 A t' H" ]
colorTrueClassPlot = colorTrueClass(trainIndex==1, ;# F3 T( J9 y1 t/ B' R1 p2 |
scatter(x,y,patchSize,colorTrueClassPlot,'o');% J1 W1 j0 Y1 H- Y' J
title('classification results');
6 J" B& C8 j7 n) g; M1 B: @! L+ Y6 t! [$ q3 n
这部分代码用于绘制分类结果的散点图。首先,将测试集的新坐标 (newCoor) 中仅包含测试数据的部分的第一列 (x) 和第二列 (y) 赋值给 x 和 y 变量。然后,根据真实类别的颜色 (colorTrueClassPlot) 使用 scatter 函数绘制测试数据的散点图,设置散点的大小为 patchSize 的2倍,并使用真实类别的颜色填充。接下来,再次使用 scatter 函数绘制测试数据的散点图,散点的大小为 patchSize,颜色根据预测的类别 (colorResultClass) 填充。最后,将训练集数据的散点图绘制在图像上,同样使用真实类别的颜色填充。通过 title 函数给图像添加标题。6 D3 X5 i# ?" x- p0 \
希望这些逐行解释能够帮助您理解代码的功能和作用。如果还有其他问题,请随时提问。" D# M& U# M6 s& ]# H" v; l
( w/ G- D# v& r" R2 E
/ y) R( Y Q' X+ ]/ V5 Q
0 E& @# _8 u) e |
-
-
SVM.rar
6.37 KB, 下载次数: 0, 下载积分: 体力 -2 点
售价: 3 点体力 [记录]
[购买]
zan
|