- 在线时间
- 469 小时
- 最后登录
- 2025-8-1
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7563 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2849
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1160
- 主题
- 1175
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
支持向量机(Support Vector Machine,SVM)是一种常用的监督学习算法,广泛应用于模式识别、分类和回归分析等领域。SVM 的主要目标是找到一个最优的超平面来对数据进行划分,并实现在非线性情况下的高效分类。 通俗地说,我们可以想象 SVM 是一个将不同类别的数据点分隔开的分割线(二维平面)或超平面(高维空间)。SVM基于训练集中的样本点,通过寻找最优的分割线或超平面来实现分类。这里的最优意味着,将不同类别的样本点分隔得尽可能宽,以提高对新样本的泛化能力。分割线或超平面两侧的数据点被称为支持向量,它们对分类决策起到重要作用。
: r1 T. S: r: [5 C/ N( f' X9 r" k这段代码是一个简单的支持向量机(SVM)分类器的示例。代码使用了名为 "heart_scale" 的数据集,首先将数据集分为训练集和测试集,然后利用SVM模型对测试集进行分类,并将结果与实际标签进行对比。为了可视化高维数据,代码还使用了多维缩放(MDS)将数据从13维降低到2维。* Y* a0 T% p, s2 U* U
首先,代码读取 "heartscale" 数据集,其中包括标签(heartscalelabel)和特征向量(heartscale_inst)。然后确定训练集和测试集的索引,并将数据分成相应的部分。; Z$ U# Y! U+ \7 l, t
接下来,代码使用训练集数据(trainData)和标签(trainLabel)训练SVM模型。然后使用训练好的模型对测试集数据(testData)进行分类,得到预测标签(predictlabel)、准确率(accuracy)和类别概率值(probvalues)。1 Y0 o z7 S" d: z3 l o
代码的下一部分是为每个类别分配颜色。根据数据集标签的值,将其转换为类别索引,然后使用预先定义的颜色列表(colorList)为每个类别确定颜色。- |# @7 [( S G2 D& G
通过多维缩放(MDS),代码将原始的13维特征向量降低到2维。首先,通过计算特征向量间的欧氏距离(distanceMatrix),得到距离矩阵。然后,将距离矩阵作为输入,使用MDS将特征向量降低到2维,得到新的坐标(newCoor)。
) a' e: K8 B' o最后,代码使用散点图展示结果。首先,在整个数据集上绘制散点图,并根据真实类别(colorTrueClass)为每个数据点上色。然后,绘制测试集的散点图,并根据真实类别(colorTrueClassPlot)和预测类别(colorResultClass)分别为数据点上色。最后,绘制训练集的散点图,并根据真实类别(colorTrueClassPlot)为数据点上色。( U! m& H( f& b5 S0 ^
0 T {1 U2 i7 ~
当然,我会逐行解释以下代码的功能和作用。9 M! ?0 Y/ m& N* u" o* s$ y
clear! N$ l5 x% C& C# f& j% q/ M
clc
Q: `" M1 k! P% n: S$ H' d0 Nclose all
; ^( I7 e: X$ f2 a0 e* W, t0 h& K+ K- p, D, d, h* J0 ~9 g! N9 b
这些行代码用于清除MATLAB工作区域中的变量,清除命令行窗口上的内容,并关闭所有打开的图形窗口。. F! s/ p# e+ }% p$ i/ s! e
[heart_scale_label, heart_scale_inst] = libsvmread('heart_scale');' {' E p0 z5 O: _% J
[N,D] = size(heart_scale_inst);
6 A2 V" Y; B" I8 Z7 G0 [
1 O# `8 M) m) y" U这两行代码读取文件 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: ?) L; Y$ \3 r. R" L- I
trainIndex = zeros(N,1); trainIndex(1:200) = 1;; a/ q9 {, M$ o, s# x" z/ B
testIndex = zeros(N,1); testIndex(201:N) = 1;4 Q$ B4 A$ V5 Y0 E0 i
trainData = heart_scale_inst(trainIndex==1, ;$ h* U5 @/ q4 v- M
trainLabel = heart_scale_label(trainIndex==1, ;
# i) d# H, c8 V y, k- |testData = heart_scale_inst(testIndex==1, ;
2 q" T c% Z5 V; o) _/ p* Q! ZtestLabel = heart_scale_label(testIndex==1, ;5 N- Y; y9 Q9 r i
. |! k2 t2 O7 C5 h. R" b2 ?
这部分代码定义了训练集和测试集的索引,并使用这些索引将数据划分为相应的部分。首先,通过创建一个大小为 N 的零向量 trainIndex 和 testIndex,将训练集和测试集的索引位置标记为1。然后,使用这些索引从 heart_scale_inst 和 heart_scale_label 中选择相应的数据点和标签,形成训练集数据 (trainData)、训练集标签 (trainLabel)、测试集数据 (testData) 和测试集标签 (testLabel)。
5 A1 v- F6 {3 z! u- I kmodel = svmtrain(trainLabel, trainData, '-c 1 -g 0.07 -b 1');
: h; W, U8 f0 ~! ?[predict_label, accuracy, prob_values] = svmpredict(testLabel, testData, model, '-b 1');
5 U% B; l5 u% A. `( }$ j4 _. O1 e& i6 l$ I9 }& l, U
这部分代码使用支持向量机 (SVM) 进行训练和测试。首先,使用 svmtrain 函数训练一个SVM模型,其中训练集标签 (trainLabel) 和训练集数据 (trainData) 作为输入。额外的参数 -c 1 -g 0.07 -b 1 是SVM的参数设置,其中 -c 是惩罚项系数,-g 是高斯核函数的参数,-b 启用概率输出。训练完成后,得到一个训练好的模型 (model)。 t. ^1 z" v- s& I* H1 H6 g/ D
然后,使用 svmpredict 函数根据 model 对测试集数据 (testData) 进行预测,并将预测标签 (predict_label)、准确率 (accuracy) 和类别概率值 (prob_values) 分别赋值给相应的变量。
. _ P$ i9 y0 w+ D+ AcolorList = prism(100);
) l8 l5 H z8 q& X& ?trueClassIndex = zeros(N,1);
" `5 E2 [; W) K6 ~. h2 k# g: vtrueClassIndex(heart_scale_label==1) = 1;
8 O7 R( x8 j5 W/ R4 ftrueClassIndex(heart_scale_label==-1) = 2;
7 ~3 i/ J. H8 {colorTrueClass = colorList(trueClassIndex, ;
% X `" f& [5 l/ F" q0 @5 bresultClassIndex = zeros(length(predict_label),1);9 L% g6 o+ e6 n
resultClassIndex(predict_label==1) = 1;
9 W' d1 ~" I( L5 v1 P. fresultClassIndex(predict_label==-1) = 2;
' K* S8 d+ `, s) ScolorResultClass = colorList(resultClassIndex, ;
* p; w* r$ X) B( D2 q% R1 E4 v3 v) T- t
这部分代码用于为每个类别分配颜色。通过 prism(100) 函数创建一个颜色映射列表 colorList。然后,根据原始数据的标签 (heart_scale_label),将标签为1的数据点的索引标记为1,标签为-1的数据点的索引标记为2。根据这些索引,从 colorList 中选择相应的颜色,得到真实类别的颜色 (colorTrueClass)。类似地,使用预测标签 (predict_label) 创建结果类别的颜色 (colorResultClass)。: {; ]0 X% f" _. t* r0 M
distanceMatrix = pdist(heart_scale_inst,'euclidean');
7 V6 m4 S9 Y3 s8 [# DnewCoor = mdscale(distanceMatrix,2);! c$ c, a& z6 [! Z) {/ J
& ^* u/ E9 t2 \' n: L _3 X
这部分代码计算了原始数据点之间的欧氏距离矩阵 (distanceMatrix),并将其作为输入传递给 mdscale 函数。mdscale 函数将高维特征向量 (13D) 降维到2维,并返回新的二维坐标 (newCoor)。
7 E- f6 t+ c% l+ G+ c+ Ex = newCoor(:,1);2 W5 g: ?& ]: a' ~
y = newCoor(:,2);7 u( ?" s' U0 @
patchSize = 30;$ I3 _. A! g6 Z8 V4 C6 t% ~. m& z/ [
colorTrueClassPlot = colorTrueClass;& p( _7 D, l2 y; a0 n5 h
figure; scatter(x,y,patchSize,colorTrueClassPlot,'filled');
! P d* q! z5 ]& k+ N/ j' atitle('whole data set');0 D O- Q. |) K+ x
; y3 i6 U8 a8 d1 p+ L这部分代码用于绘制整个数据集的散点图。首先,将新的坐标中的第一列 (x) 和第二列 (y) 分别赋值给变量。然后,根据真实类别的颜色 (colorTrueClassPlot),使用 scatter 函数绘制散点图,并设置散点的大小为 patchSize。最后,通过 title 函数给图像添加标题。1 f% a+ `- [+ h' |# S+ B& D
x = newCoor(testIndex==1,1);1 a8 Z% a8 C7 J1 Z! \
y = newCoor(testIndex==1,2);
$ v: z6 z+ L! u: gpatchSize = 80*max(prob_values,[],2);. w# V& _& _7 }4 O/ l. v0 d; ~$ l1 m
colorTrueClassPlot = colorTrueClass(testIndex==1, ;
1 ?5 x `8 J! @* yfigure; hold on;/ q( b3 R: W3 h0 x! {
scatter(x,y,2*patchSize,colorTrueClassPlot,'o','filled');
$ |& U: ?$ I R& t3 W6 b* Cscatter(x,y,patchSize,colorResultClass,'o','filled');5 D$ ?* @: s' `$ p' F9 D4 b
x = newCoor(trainIndex==1,1);
* f) @5 o& h% Wy = newCoor(trainIndex==1,2);# b0 T$ D5 H& Z% q' m) b; |! ~
patchSize = 30;
+ o! B# u" g: F7 [/ Q* Y# AcolorTrueClassPlot = colorTrueClass(trainIndex==1, ;
; f4 S* M! S4 w) ^2 J* g/ S; J: Zscatter(x,y,patchSize,colorTrueClassPlot,'o');& i3 ^- d$ T3 W, T; B# I
title('classification results');- v# l# r" R3 I
5 e8 S9 Q1 _3 Q$ c5 X9 J
这部分代码用于绘制分类结果的散点图。首先,将测试集的新坐标 (newCoor) 中仅包含测试数据的部分的第一列 (x) 和第二列 (y) 赋值给 x 和 y 变量。然后,根据真实类别的颜色 (colorTrueClassPlot) 使用 scatter 函数绘制测试数据的散点图,设置散点的大小为 patchSize 的2倍,并使用真实类别的颜色填充。接下来,再次使用 scatter 函数绘制测试数据的散点图,散点的大小为 patchSize,颜色根据预测的类别 (colorResultClass) 填充。最后,将训练集数据的散点图绘制在图像上,同样使用真实类别的颜色填充。通过 title 函数给图像添加标题。+ }) h* P8 L; ^1 O# S; u
希望这些逐行解释能够帮助您理解代码的功能和作用。如果还有其他问题,请随时提问。& w/ J/ [8 q# \/ C" o5 K( ]% h
" \2 F* S0 g# E7 y2 `6 R0 Y! l
/ t6 p7 r7 Y* z( q& F+ I- S: }5 e4 w. y/ q/ X# Y$ Q9 N$ s: M
|
-
-
SVM.rar
6.37 KB, 下载次数: 0, 下载积分: 体力 -2 点
售价: 3 点体力 [记录]
[购买]
zan
|