- 在线时间
- 480 小时
- 最后登录
- 2026-6-1
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7823 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2934
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1174
- 主题
- 1189
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
|
支持向量机(Support Vector Machine,SVM)是一种常用的监督学习算法,广泛应用于模式识别、分类和回归分析等领域。SVM 的主要目标是找到一个最优的超平面来对数据进行划分,并实现在非线性情况下的高效分类。 通俗地说,我们可以想象 SVM 是一个将不同类别的数据点分隔开的分割线(二维平面)或超平面(高维空间)。SVM基于训练集中的样本点,通过寻找最优的分割线或超平面来实现分类。这里的最优意味着,将不同类别的样本点分隔得尽可能宽,以提高对新样本的泛化能力。分割线或超平面两侧的数据点被称为支持向量,它们对分类决策起到重要作用。
1 y$ R4 D1 h! s% b+ M1 \% T% Q, V这段代码是一个简单的支持向量机(SVM)分类器的示例。代码使用了名为 "heart_scale" 的数据集,首先将数据集分为训练集和测试集,然后利用SVM模型对测试集进行分类,并将结果与实际标签进行对比。为了可视化高维数据,代码还使用了多维缩放(MDS)将数据从13维降低到2维。5 y. e& H) H: a
首先,代码读取 "heartscale" 数据集,其中包括标签(heartscalelabel)和特征向量(heartscale_inst)。然后确定训练集和测试集的索引,并将数据分成相应的部分。
& w" h5 P+ H d- X) Z$ R接下来,代码使用训练集数据(trainData)和标签(trainLabel)训练SVM模型。然后使用训练好的模型对测试集数据(testData)进行分类,得到预测标签(predictlabel)、准确率(accuracy)和类别概率值(probvalues)。0 e. J v7 r3 P$ G1 U7 \
代码的下一部分是为每个类别分配颜色。根据数据集标签的值,将其转换为类别索引,然后使用预先定义的颜色列表(colorList)为每个类别确定颜色。$ L+ S* h% W) V7 m: d1 g2 }3 I
通过多维缩放(MDS),代码将原始的13维特征向量降低到2维。首先,通过计算特征向量间的欧氏距离(distanceMatrix),得到距离矩阵。然后,将距离矩阵作为输入,使用MDS将特征向量降低到2维,得到新的坐标(newCoor)。
9 N6 R l/ j* F5 \4 E最后,代码使用散点图展示结果。首先,在整个数据集上绘制散点图,并根据真实类别(colorTrueClass)为每个数据点上色。然后,绘制测试集的散点图,并根据真实类别(colorTrueClassPlot)和预测类别(colorResultClass)分别为数据点上色。最后,绘制训练集的散点图,并根据真实类别(colorTrueClassPlot)为数据点上色。
: }7 C% s6 W, Z# u2 ^+ ^( H
% Y- J2 V; B6 e$ w3 d9 _- W; R1 m当然,我会逐行解释以下代码的功能和作用。$ ~( g, F n- R, `8 L1 E/ i4 H
clear
! w! T4 `1 D( fclc2 m0 f y5 k) Y. J( \ |7 n y f
close all
5 _1 A/ W: B& X) H" [
9 z5 r- d; k/ s9 f0 b9 A这些行代码用于清除MATLAB工作区域中的变量,清除命令行窗口上的内容,并关闭所有打开的图形窗口。7 q; A$ B& s6 e% c
[heart_scale_label, heart_scale_inst] = libsvmread('heart_scale');% d; g; a& j. `4 x# n% t
[N,D] = size(heart_scale_inst);# O) s6 N6 X# E6 m$ F U0 b- j+ D7 V
# G6 Q) c0 s* H, v; 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 是每个数据点的特征维度。! m* U& L: s) a: ~. [/ v% ^
trainIndex = zeros(N,1); trainIndex(1:200) = 1;
3 l1 a3 E1 \: s: C/ M0 C# N0 M4 ptestIndex = zeros(N,1); testIndex(201:N) = 1;
0 z: f* e. o" S; j6 D- _/ rtrainData = heart_scale_inst(trainIndex==1, ;
# F+ @8 L6 r3 t' T, r" B9 ~trainLabel = heart_scale_label(trainIndex==1, ;- T+ _1 [" s3 h( X0 F
testData = heart_scale_inst(testIndex==1, ;9 @# F/ x* E! y! l. m8 U8 S
testLabel = heart_scale_label(testIndex==1, ;# K, n2 ~, Y ?' w1 A
3 E# O# E" r9 p
这部分代码定义了训练集和测试集的索引,并使用这些索引将数据划分为相应的部分。首先,通过创建一个大小为 N 的零向量 trainIndex 和 testIndex,将训练集和测试集的索引位置标记为1。然后,使用这些索引从 heart_scale_inst 和 heart_scale_label 中选择相应的数据点和标签,形成训练集数据 (trainData)、训练集标签 (trainLabel)、测试集数据 (testData) 和测试集标签 (testLabel)。
4 P: b1 Y3 Z3 h% a% T& N* fmodel = svmtrain(trainLabel, trainData, '-c 1 -g 0.07 -b 1');* R8 {$ J: U2 X3 c% x: K2 E% {
[predict_label, accuracy, prob_values] = svmpredict(testLabel, testData, model, '-b 1');
8 e" `* L$ T$ J0 O2 v9 ]# [/ E" Y& U, O! ]
这部分代码使用支持向量机 (SVM) 进行训练和测试。首先,使用 svmtrain 函数训练一个SVM模型,其中训练集标签 (trainLabel) 和训练集数据 (trainData) 作为输入。额外的参数 -c 1 -g 0.07 -b 1 是SVM的参数设置,其中 -c 是惩罚项系数,-g 是高斯核函数的参数,-b 启用概率输出。训练完成后,得到一个训练好的模型 (model)。, F9 T1 e; J1 W4 H7 E- H: y
然后,使用 svmpredict 函数根据 model 对测试集数据 (testData) 进行预测,并将预测标签 (predict_label)、准确率 (accuracy) 和类别概率值 (prob_values) 分别赋值给相应的变量。
. k3 y* s! o9 t& Z( P( T, AcolorList = prism(100);* C/ ^& w7 o) X
trueClassIndex = zeros(N,1);
4 o- ^. P6 L% h0 n G7 G: |trueClassIndex(heart_scale_label==1) = 1;
4 s) Y" w3 u( StrueClassIndex(heart_scale_label==-1) = 2;( \" ~* [3 |' C; O
colorTrueClass = colorList(trueClassIndex, ;2 O* F H, E: A! @. ^
resultClassIndex = zeros(length(predict_label),1);$ \9 @. _- J3 m5 B. K
resultClassIndex(predict_label==1) = 1;* C8 v8 C' k7 L% W, l+ ^
resultClassIndex(predict_label==-1) = 2;; |$ [, M/ b) K' T
colorResultClass = colorList(resultClassIndex, ;
$ K3 u9 v: F N) u* C8 d. d8 c9 X9 V0 j/ h m# H
这部分代码用于为每个类别分配颜色。通过 prism(100) 函数创建一个颜色映射列表 colorList。然后,根据原始数据的标签 (heart_scale_label),将标签为1的数据点的索引标记为1,标签为-1的数据点的索引标记为2。根据这些索引,从 colorList 中选择相应的颜色,得到真实类别的颜色 (colorTrueClass)。类似地,使用预测标签 (predict_label) 创建结果类别的颜色 (colorResultClass)。" V( X, Y" l% c# }& m
distanceMatrix = pdist(heart_scale_inst,'euclidean');" V# b' t0 H( I1 M$ I# A3 i! v
newCoor = mdscale(distanceMatrix,2);# A' a; z h) y
: o/ W; v7 l U# k这部分代码计算了原始数据点之间的欧氏距离矩阵 (distanceMatrix),并将其作为输入传递给 mdscale 函数。mdscale 函数将高维特征向量 (13D) 降维到2维,并返回新的二维坐标 (newCoor)。
% a+ D G! v7 Q& w/ d5 r: h- cx = newCoor(:,1);) e" N3 o3 B0 L0 R) _( ?& Z, v
y = newCoor(:,2);
* e/ \ K9 V& H( s! L* jpatchSize = 30;
8 h5 v3 t1 n+ q# e' q; fcolorTrueClassPlot = colorTrueClass;
( ^! s3 M8 t% d2 ^' B- Ufigure; scatter(x,y,patchSize,colorTrueClassPlot,'filled');7 y3 V2 A3 F+ S, q- w
title('whole data set'); X7 [+ Q ] A, t
8 ~* Q# _' ]% F! E这部分代码用于绘制整个数据集的散点图。首先,将新的坐标中的第一列 (x) 和第二列 (y) 分别赋值给变量。然后,根据真实类别的颜色 (colorTrueClassPlot),使用 scatter 函数绘制散点图,并设置散点的大小为 patchSize。最后,通过 title 函数给图像添加标题。
' y. Z+ Y5 ^1 d' }* _+ {8 Dx = newCoor(testIndex==1,1);
3 M0 o5 I% Q% }6 ] F7 q. vy = newCoor(testIndex==1,2);: \6 o: @) m6 G$ ?4 P4 m6 [$ Z6 ~
patchSize = 80*max(prob_values,[],2);
) y: _6 @& `" x. ycolorTrueClassPlot = colorTrueClass(testIndex==1, ;+ B. [" A0 H2 {, V/ h V
figure; hold on;
- I/ ~& x* e1 H: J8 Pscatter(x,y,2*patchSize,colorTrueClassPlot,'o','filled');
3 R" Z0 e3 z0 C! Q- l& R1 P. J8 Dscatter(x,y,patchSize,colorResultClass,'o','filled');. {7 j% q r# m; f* K9 y* `! ?
x = newCoor(trainIndex==1,1);
# g& d; A$ H0 B6 Dy = newCoor(trainIndex==1,2);& k' h4 g5 b# K
patchSize = 30;$ U% G, W( ]8 V/ m, o) V1 `
colorTrueClassPlot = colorTrueClass(trainIndex==1, ;6 b; N8 V. e: `6 S& v# }
scatter(x,y,patchSize,colorTrueClassPlot,'o');7 T- V" z9 I: L( E/ C
title('classification results');
. ~6 ^' G* e$ Y Y }9 G& G) i# }5 c: `9 J6 [9 @% [2 `2 {
这部分代码用于绘制分类结果的散点图。首先,将测试集的新坐标 (newCoor) 中仅包含测试数据的部分的第一列 (x) 和第二列 (y) 赋值给 x 和 y 变量。然后,根据真实类别的颜色 (colorTrueClassPlot) 使用 scatter 函数绘制测试数据的散点图,设置散点的大小为 patchSize 的2倍,并使用真实类别的颜色填充。接下来,再次使用 scatter 函数绘制测试数据的散点图,散点的大小为 patchSize,颜色根据预测的类别 (colorResultClass) 填充。最后,将训练集数据的散点图绘制在图像上,同样使用真实类别的颜色填充。通过 title 函数给图像添加标题。
# a# K. F1 ?, ]. @5 l! Y F希望这些逐行解释能够帮助您理解代码的功能和作用。如果还有其他问题,请随时提问。$ n- p C8 }& J: B# \
: p) T" c5 W: E' i8 g( o. {
# c- t5 H. N2 q5 ~3 O" v3 R# p
% o% }% r& M+ ~4 j4 G; { |
-
-
SVM.rar
6.37 KB, 下载次数: 0, 下载积分: 体力 -2 点
售价: 3 点体力 [记录]
[购买]
zan
|