- 在线时间
- 468 小时
- 最后登录
- 2025-7-19
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7461 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2818
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1160
- 主题
- 1175
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
支持向量机(Support Vector Machine,SVM)是一种常用的监督学习算法,广泛应用于模式识别、分类和回归分析等领域。SVM 的主要目标是找到一个最优的超平面来对数据进行划分,并实现在非线性情况下的高效分类。 通俗地说,我们可以想象 SVM 是一个将不同类别的数据点分隔开的分割线(二维平面)或超平面(高维空间)。SVM基于训练集中的样本点,通过寻找最优的分割线或超平面来实现分类。这里的最优意味着,将不同类别的样本点分隔得尽可能宽,以提高对新样本的泛化能力。分割线或超平面两侧的数据点被称为支持向量,它们对分类决策起到重要作用。
- ~' z6 @9 { e# F4 _* W这段代码是一个简单的支持向量机(SVM)分类器的示例。代码使用了名为 "heart_scale" 的数据集,首先将数据集分为训练集和测试集,然后利用SVM模型对测试集进行分类,并将结果与实际标签进行对比。为了可视化高维数据,代码还使用了多维缩放(MDS)将数据从13维降低到2维。- O1 p8 G i( W7 S" F$ F! S
首先,代码读取 "heartscale" 数据集,其中包括标签(heartscalelabel)和特征向量(heartscale_inst)。然后确定训练集和测试集的索引,并将数据分成相应的部分。& L! q2 Q' W3 W/ w1 f0 P
接下来,代码使用训练集数据(trainData)和标签(trainLabel)训练SVM模型。然后使用训练好的模型对测试集数据(testData)进行分类,得到预测标签(predictlabel)、准确率(accuracy)和类别概率值(probvalues)。% L: v0 f" ]: C- i, W: G. f
代码的下一部分是为每个类别分配颜色。根据数据集标签的值,将其转换为类别索引,然后使用预先定义的颜色列表(colorList)为每个类别确定颜色。
4 m: @* C, b$ ^1 Y通过多维缩放(MDS),代码将原始的13维特征向量降低到2维。首先,通过计算特征向量间的欧氏距离(distanceMatrix),得到距离矩阵。然后,将距离矩阵作为输入,使用MDS将特征向量降低到2维,得到新的坐标(newCoor)。6 l0 x* V% U" v7 y" D B
最后,代码使用散点图展示结果。首先,在整个数据集上绘制散点图,并根据真实类别(colorTrueClass)为每个数据点上色。然后,绘制测试集的散点图,并根据真实类别(colorTrueClassPlot)和预测类别(colorResultClass)分别为数据点上色。最后,绘制训练集的散点图,并根据真实类别(colorTrueClassPlot)为数据点上色。
1 T* U, j) }5 m0 B* g8 D$ ^( X+ w: t" G: g
当然,我会逐行解释以下代码的功能和作用。+ u- [1 B' ]7 ?- i9 _4 q# O, v
clear- k1 m# V! T L
clc( Q3 ~& m; j m7 u% s
close all7 Z+ ]2 l- k# Y* G0 L
% y) P6 t) f l7 P7 ]4 I
这些行代码用于清除MATLAB工作区域中的变量,清除命令行窗口上的内容,并关闭所有打开的图形窗口。2 _- Y3 {' o% b0 f) W7 N
[heart_scale_label, heart_scale_inst] = libsvmread('heart_scale');" H2 i* N2 R- C7 ^9 B# ]1 l
[N,D] = size(heart_scale_inst);" q3 T6 I3 L c. j* r+ \* b G
' Z J* |* c5 ~+ p. j) A这两行代码读取文件 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 是每个数据点的特征维度。
% u* @; e) k& ~; w& P$ P4 F3 {trainIndex = zeros(N,1); trainIndex(1:200) = 1;
# r; p' o: r0 utestIndex = zeros(N,1); testIndex(201:N) = 1;
0 |3 a1 I9 g+ k1 V: UtrainData = heart_scale_inst(trainIndex==1, ;
. `. Q; h9 M! g, b( u$ S: Z3 X0 htrainLabel = heart_scale_label(trainIndex==1, ;* W, @& c; `2 N0 N, @# a
testData = heart_scale_inst(testIndex==1, ;8 g7 t2 z) V$ @2 U
testLabel = heart_scale_label(testIndex==1, ;
9 o& V3 J& h2 h: r9 R* m7 b+ c& S" n+ w+ k8 c% c) p8 S
这部分代码定义了训练集和测试集的索引,并使用这些索引将数据划分为相应的部分。首先,通过创建一个大小为 N 的零向量 trainIndex 和 testIndex,将训练集和测试集的索引位置标记为1。然后,使用这些索引从 heart_scale_inst 和 heart_scale_label 中选择相应的数据点和标签,形成训练集数据 (trainData)、训练集标签 (trainLabel)、测试集数据 (testData) 和测试集标签 (testLabel)。+ U) t3 E! `0 [) _
model = svmtrain(trainLabel, trainData, '-c 1 -g 0.07 -b 1');' u! }8 e, N; h% K1 f
[predict_label, accuracy, prob_values] = svmpredict(testLabel, testData, model, '-b 1');
2 H% v5 S7 f1 Y6 D/ ]5 B, r/ D! n0 G) z- a
这部分代码使用支持向量机 (SVM) 进行训练和测试。首先,使用 svmtrain 函数训练一个SVM模型,其中训练集标签 (trainLabel) 和训练集数据 (trainData) 作为输入。额外的参数 -c 1 -g 0.07 -b 1 是SVM的参数设置,其中 -c 是惩罚项系数,-g 是高斯核函数的参数,-b 启用概率输出。训练完成后,得到一个训练好的模型 (model)。
# U- o( S, E& Z' L( U然后,使用 svmpredict 函数根据 model 对测试集数据 (testData) 进行预测,并将预测标签 (predict_label)、准确率 (accuracy) 和类别概率值 (prob_values) 分别赋值给相应的变量。
4 x% ^% p: l* H7 ^/ w2 Q0 V9 NcolorList = prism(100);
3 ~/ i7 Y e, t6 h ItrueClassIndex = zeros(N,1);3 e" L* a/ t) o
trueClassIndex(heart_scale_label==1) = 1;% v5 `. O' a4 N
trueClassIndex(heart_scale_label==-1) = 2;
% z; q6 Y; l$ _colorTrueClass = colorList(trueClassIndex, ;' l- _, Y8 u4 z/ |9 J
resultClassIndex = zeros(length(predict_label),1);
+ t+ P; c8 x7 I0 \( Z* jresultClassIndex(predict_label==1) = 1;
. M- b! u0 X9 T y( yresultClassIndex(predict_label==-1) = 2;
3 h& b( P1 }: U5 k% N) u! f9 ScolorResultClass = colorList(resultClassIndex, ;! a7 { c4 h# l) A# |; g; e
4 h: X1 e9 a. r. @6 {; R T, D这部分代码用于为每个类别分配颜色。通过 prism(100) 函数创建一个颜色映射列表 colorList。然后,根据原始数据的标签 (heart_scale_label),将标签为1的数据点的索引标记为1,标签为-1的数据点的索引标记为2。根据这些索引,从 colorList 中选择相应的颜色,得到真实类别的颜色 (colorTrueClass)。类似地,使用预测标签 (predict_label) 创建结果类别的颜色 (colorResultClass)。
2 s9 T5 G! G- p, N! x$ pdistanceMatrix = pdist(heart_scale_inst,'euclidean');6 t" C3 ^ c# X w0 |
newCoor = mdscale(distanceMatrix,2);% T, ~9 v& K) \/ J% @6 p" j
; s* q' P/ I: ^ ?9 z R8 M
这部分代码计算了原始数据点之间的欧氏距离矩阵 (distanceMatrix),并将其作为输入传递给 mdscale 函数。mdscale 函数将高维特征向量 (13D) 降维到2维,并返回新的二维坐标 (newCoor)。
. P6 P3 v3 T9 Nx = newCoor(:,1);8 w) j3 }+ }6 j1 ^6 `0 B
y = newCoor(:,2);
! ?# F8 j5 c5 E& T( hpatchSize = 30;
3 W c! W- {: r& c2 e! |+ F" w$ jcolorTrueClassPlot = colorTrueClass;
; j& L1 W* A3 b; V1 f' \figure; scatter(x,y,patchSize,colorTrueClassPlot,'filled'); ^( M) }" M" @. ~- j
title('whole data set');" ^( _3 _- d7 u3 X
! Y$ e$ ]* w7 ?' u1 W0 Q# r! C, ]
这部分代码用于绘制整个数据集的散点图。首先,将新的坐标中的第一列 (x) 和第二列 (y) 分别赋值给变量。然后,根据真实类别的颜色 (colorTrueClassPlot),使用 scatter 函数绘制散点图,并设置散点的大小为 patchSize。最后,通过 title 函数给图像添加标题。& I, O2 i: v4 C9 N+ T& g' F2 F
x = newCoor(testIndex==1,1);
( e: T3 G+ Z6 \y = newCoor(testIndex==1,2); z0 N! i$ d, C% q
patchSize = 80*max(prob_values,[],2);9 r0 S1 `; A9 s- ^
colorTrueClassPlot = colorTrueClass(testIndex==1, ;; t+ U# _4 w5 J( R' _5 V$ K: O
figure; hold on;1 O4 v5 U+ N$ g. a9 R3 T0 ]
scatter(x,y,2*patchSize,colorTrueClassPlot,'o','filled');
( V7 j! u8 N9 R" p4 U3 S1 fscatter(x,y,patchSize,colorResultClass,'o','filled');/ K( C8 ?9 J# Q0 b' N& s' W
x = newCoor(trainIndex==1,1);( m$ h% ~% W, e
y = newCoor(trainIndex==1,2);
+ Y2 x" h9 Q. a0 j+ B1 P1 cpatchSize = 30;7 p) A6 Q- g5 @1 K8 z! }3 m) z
colorTrueClassPlot = colorTrueClass(trainIndex==1, ;* ~! q. ]. Q" u5 h
scatter(x,y,patchSize,colorTrueClassPlot,'o');3 n- _4 u6 K. L- x9 J$ m- l
title('classification results');
! W& f ]4 K% v, \2 Q1 q: [: @6 z* R% {2 |1 ?
这部分代码用于绘制分类结果的散点图。首先,将测试集的新坐标 (newCoor) 中仅包含测试数据的部分的第一列 (x) 和第二列 (y) 赋值给 x 和 y 变量。然后,根据真实类别的颜色 (colorTrueClassPlot) 使用 scatter 函数绘制测试数据的散点图,设置散点的大小为 patchSize 的2倍,并使用真实类别的颜色填充。接下来,再次使用 scatter 函数绘制测试数据的散点图,散点的大小为 patchSize,颜色根据预测的类别 (colorResultClass) 填充。最后,将训练集数据的散点图绘制在图像上,同样使用真实类别的颜色填充。通过 title 函数给图像添加标题。
8 b3 |1 F5 ^. E) F* c3 s9 O希望这些逐行解释能够帮助您理解代码的功能和作用。如果还有其他问题,请随时提问。. X. r6 ]+ K% ]8 g
0 ~, R' ]% R# T' w! n3 I- [# R8 i- X1 }" P7 S x
8 g" J/ F8 e2 o+ i( B
|
-
-
SVM.rar
6.37 KB, 下载次数: 0, 下载积分: 体力 -2 点
售价: 3 点体力 [记录]
[购买]
zan
|