找回密码
 注册
关于网站域名变更的通知
查看: 524|回复: 1
打印 上一主题 下一主题

MATLAB中SVM(支持向量机)的用法

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-10-12 15:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
7 f* z7 y! ]/ r4 S- s# _
LIBSVM是台湾大学林智仁(Lin Chih-Jen)教授等开发设计的一个简单、易于使用和快速有效的SVM模式识别与回归的软件包,他不但提供了编译好的可在Windows系列系统的执行文件,还提供了源代码,方便改进、修改以及在其它操作系统上应用;该软件对SVM所涉及的参数调节相对比较少,提供了很多的默认参数,利用这些默认参数可以解决很多问题;并提供了交互检验(Cross Validation)的功能。该软件可以解决C-SVM、ν-SVM、ε-SVR和ν-SVR等问题,包括基于一对一算法的多类模式识别问题。( K! B' }, x& e4 K5 A2 K) @

' x; \, k9 T& t; `2 A注意不是matlab自带的svm实现函数,自带的svm实现函数仅支持分类问题,不支持回归问题;而libsvm不仅支持分类问题,亦支持回归问题,参数可调节,功能更强大。
* M: q8 c) d9 r! X* Q6 P7 x3 K0 z
5 C% _! |* D3 J+ H% s9 y9 slibsvm的配置很简单,只需要下载高级版本的matlab和libsvm,VC或VS编译实现很简单的,这里就不细讲了。
4 h* h0 I8 w2 Y& z, r( [. e
& K) E( l9 R7 }. N两个步骤:训练建模——>模型预测1 V) R! M# S' I; x! k
0 N- H& u, Z1 T! h) B# @
分类  model = svmtrain(trainlabel, traindata, ‘-s 0 -t 2 -c 1.2 -g 2.8’);
! ?$ b- J' U! F5 S+ O) j2 X  }' _4 c3 k( @
回归  model = svmtrain(trainlabel, traindata, ‘-s 3 -t 2 -c 2.2 -g 2.8 -p 0.01’);
! V5 S) m0 ~0 y" t( {4 o( B  f. j( D& R2 c% M
参数说明:
% x- i# M$ w; H* E/ o& A
* k5 N( h( s5 W* o- J( G-s svm类型:SVM设置类型(默认0)
4 V& j, j, p' s, v) J% r0 — C-SVC
% p5 e# O5 t/ @5 Y1 –v-SVC
8 R$ c9 I: F! s3 b7 R1 C2 – 一类SVM% z' ?, u$ Z% f
3 — e -SVR
8 K- L4 N, \( k! p4 — v-SVR
$ O, Z& O3 T; e  D) z; F" C* E. \% i( ?7 z6 k3 p9 v5 z
-t 核函数类型:核函数设置类型(默认2)
9 t5 p* R* i' c  [$ j2 \0 – 线性:u’v
  P$ I8 e8 K+ V+ C# e' E5 Y8 c& `1 – 多项式:(r*u’v + coef0)^degree
9 q6 c. q6 [; z: I0 Z4 [2 – RBF函数:exp(-r|u-v|^2)/ v) p7 T. ~! K$ v
3 –sigmoid:tanh(r*u’v + coef0)6 o, M5 z8 v. _) n: @' w0 V
- W2 R0 W5 G% \+ V: P8 |8 H4 E. e6 v  S
-g r(gama):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)( Q% O- G+ z8 [6 G: @6 |
( B: G: S: Q4 Y  Z) f
-c cost:设置C-SVC,e -SVR和v-SVR的参数(损失函数)(默认1),惩罚系数
8 a8 B2 a( v% ~9 v8 [+ ^$ N
, u6 x6 }$ e0 }9 h* e$ Q( d$ W-n nu:设置v-SVC,一类SVM和v- SVR的参数(默认0.5)' Y. T# ?  R; k# r. @
. G6 A% V' @3 J
-p p:设置e -SVR 中损失函数p的值(默认0.1)  D( d: y* l, Q5 l0 u9 f0 B
9 x" R8 R* J% E0 A4 M" a
-d degree:核函数中的degree设置(针对多项式核函数)(默认3)
) t; a4 r0 C, y+ z% Y* r
# ?# d' ^' z' `: `* `" T$ a7 {-wi weight:设置第几类的参数C为weight*C(C-SVC中的C)(默认1)
3 J" @" p/ V* U# k- x7 W+ d8 d
/ k0 k, e7 x3 P/ F+ w1 w( Y-v n: n-fold交互检验模式,n为fold的个数,必须大于等于2
5 Z7 |! \, s# H1 ^( o8 r0 ^. G7 @7 V+ ^# k1 |
libsvm使用误区———————-
0 `1 W# {2 M+ L, V: m6 T
' a' N4 j1 \# p* n% t(1) 直接将训练集合和测试集合简单归一化到[0,1]区间,可能导致实验结果很差。
0 f: [" n' v, P$ I2 d
7 C% A0 K3 K- s3 L- k4 W+ l(2) 如果样本的特征数非常多,那么就不必使用RBF核将样本映射到高维空间。* s; a: @/ t5 F5 n" k

  y- i/ r& ^. H' w0 H- U8 o. ia) 在特征数非常多的情况下,使用线性核,结果已经非常好,并且只需要选择参数C即可。
6 n; d1 X7 Z6 N; p8 {$ `3 |b) 虽然说RBF核的结果至少比线性核好,前提下搜索整个的空间。
9 g. y& R$ E5 H$ i1 o, c" }(3) 样本数<<特征数的情况:推荐使用线性核,可以达到与RBF同样的性能。
9 i) U+ o& Z; m3 @/ U3 c+ s9 Y" U* X8 r) ?! P' e( |% P; W0 X4 C
(4) 样本数和特征数都非常多:推荐使用liblinear,更少的时间和内存,可比的准确率。
% K( z$ v9 o( M" O6 Y
$ p3 D9 g9 G1 G; d(5) 样本数>>特征数:如果想使用线性模型,可以使用liblinear,并且使用-s 2参数: W: Z% _" _% D% e! z" X
0 ~. I. t1 t. B+ @

$ d$ Q* {' S3 \2 j$ @
3 v2 m& P) Z" d/ |, x! ~3 p详解:
8 S1 h0 [: r7 S) Z$ n1 O& ^' x
: ]  ~! y* B& ?# q, _8 R1. 训练
* A( n; W+ B9 F' I8 z! p1 \格式:; w/ g+ `; S4 x2 e
model = libsvmtrain(training_label_vector, training_instance_matrix [, ‘libsvm_options’]);- e% y% d( x3 p$ ~8 r0 P% m
% K  T. P4 R! Q' V! }8 Y% g
这个函数有三个参数,其中( B: l6 m7 E3 N5 Q
! d9 ]/ S/ |- W# j7 g7 {5 L. z
-training_label_vector:训练样本的类标,如果有m个样本,就是m x 1的矩阵(类型必须为double)。这里可以是二分类和多分类,类标是(-1,1)、(1,2,3)或者其他任意用来表示不同的类别的数字,要转成double类型。
1 `2 G- q: f" {6 a+ z-training_instance_matrix:训练样本的特征,如果有m个样本,每个样本特征是n维,则为m x n的矩阵(类型必须为double)。
/ g7 H/ V: w7 i$ n7 D% P1 h8 ]* r-libsvm_options:训练的参数,在第3点详细介绍。
+ P7 K* S) A' i) s7 T3 Jlibsvmtrain函数返回训练好的SVM分类器模型model是一个结构体,包含以下成员:  v4 v8 r& |3 ]
2 ~9 ~5 D" O7 P; P1 F
-Parameters: 一个5 x 1的矩阵,从上到下依次表示:
* `4 d8 s( ]3 f3 `2 }' c-s SVM类型(默认0);8 L9 |$ b/ D" f; h
-t 核函数类型(默认2)
  C! p% d: }5 d-d 核函数中的degree设置(针对多项式核函数)(默认3);) s$ P- m8 I8 b* l& v
-g 核函数中的r(gamma)函数设置(针对多项式/rbf/sigmoid核函数) (默认类别数目的倒数);* C8 h& n' n0 ?7 N9 c; y3 E' s2 o
-r 核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)
, @* |' z) h4 Y" S3 x-nr_class: 表示数据集中有多少类别,比如二分类时这个值即为2。
$ w( b1 o# h% L3 |1 o( c-totalSV: 表示支持向量的总数。0 W  u+ i( S0 u/ Q; d$ z
-rho: 决策函数wx+b中的常数项的相反数(-b)。
) [- ?/ E( D  I-Label: 表示数据集中类别的标签,比如二分类常见的1和-1。$ [: i4 u1 ?. C2 [5 }  j
-ProbA: 使用-b参数时用于概率估计的数值,否则为空。; K5 d4 m# Z. K( t3 B& r
-ProbB: 使用-b参数时用于概率估计的数值,否则为空。- i0 T- X5 n7 R( Y6 h
-nSV: 表示每类样本的支持向量的数目,和Label的类别标签对应。如Label=[1; -1],nSV=[63; 67],则标签为1的样本有63个支持向量,标签为-1的有67个。
9 m+ Z* h1 c& I2 i( m-sv_coef: 表示每个支持向量在决策函数中的系数。
: j- A# v; @; U/ i-SVs: 表示所有的支持向量,如果特征是n维的,支持向量一共有m个,则为m x n的稀疏矩阵。/ c& G- [& R& k' |. b! E/ C
另外,如果在训练中使用了-v参数进行交叉验证时,返回的不是一个模型,而是交叉验证的分类的正确率或者回归的均方根误差。
) U, p  s: I- d* i
4 V' Q9 b, R& O" J2 M% u, Q当构建完成model后,还要为上述参数选择合适的值,方法主要有Gridsearch,其他的感觉不常用,Gridsearch说白了就是穷举。
6 e% T  y" m& F- R5 k$ l0 x8 D- h- N9 s6 a. P( B. o
! F9 H. t* `" A( k- c( T
+ _; s$ t, o$ p; S4 d: E
网格参数寻优函数(分类问题):SVMcgForClass
2 E6 {8 B4 E7 X
( ]- [8 r8 ~# T$ \8 f9 b3 J6 p  p: c6 ^[bestCVaccuracy,bestc,bestg]=SVMcgForClass(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,accstep)! g0 C- y% b* T0 p% X$ G8 X- f
) I  S3 o( e$ b2 ?3 \6 ~! g
输入:
1 ^5 }6 _6 S% C
& [# M. m2 Q+ K  s9 n5 r- o# M: J5 B! m" Ltrain_label:训练集的标签,格式要求与svmtrain相同。
/ m/ b% L' \7 R; ]6 Z3 atrain:训练集,格式要求与svmtrain相同。
3 C/ X1 e7 t. g- Z" D: N# Ocmin,cmax:惩罚参数c的变化范围,即在[2^cmin,2^cmax]范围内寻找最佳的参数c,默认值为cmin=-8,cmax=8,即默认惩罚参数c的范围是[2^(-8),2^8]。
  M! n/ F' Y9 N1 b1 f& n- ~- ugmin,gmax:RBF核参数g的变化范围,即在[2^gmin,2^gmax]范围内寻找最佳的RBF核参数g,默认值为gmin=-8,gmax=8,即默认RBF核参数g的范围是[2^(-8),2^8]。3 n7 W; d% L2 I
v:进行Cross Validation过程中的参数,即对训练集进行v-fold Cross Validation,默认为3,即默认进行3折CV过程。
7 c& l$ b+ {3 a$ Xcstep,gstep:进行参数寻优是c和g的步进大小,即c的取值为2^cmin,2^(cmin+cstep),…,2^cmax,,g的取值为2^gmin,2^(gmin+gstep),…,2^gmax,默认取值为cstep=1,gstep=1。6 y2 M1 t/ g7 e
accstep:最后参数选择结果图中准确率离散化显示的步进间隔大小([0,100]之间的一个数),默认为4.5。5 F! K9 l* ^3 X, J8 e1 T, i8 V
输出:6 T- |. B5 l* j( T- }8 i2 i

3 p# X9 N/ f- {5 n* E3 t* AbestCVaccuracy:最终CV意义下的最佳分类准确率。
) l% V( f, A/ cbestc:最佳的参数c。3 ~' R9 z" t) {$ U! C9 r$ @  W! t$ h) p
bestg:最佳的参数g。4 t% F- b' i* k9 {
2 R& G0 ], g9 P- H5 ~

9 r2 N* g9 y! p+ \网格参数寻优函数(回归问题):SVMcgForRegress
+ Y4 ^# g" ?9 w# G; h. a( d- c& N, H: F+ I/ O9 G
[bestCVmse,bestc,bestg]=SVMcgForRegress(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,msestep)
1 w* b. H) G# D/ C2 E
; }; ^' O# a7 w其输入输出与SVMcgForClass类似,这里不再赘述。
. v) }% d" ~& R5 u" R& Q  n* \1 E7 \+ I" }: f% W+ w" V
SVM 怎样能得到好的结果
3 S* ~% Y+ z! s" L- E5 R  [5 R6 h. P2 ^5 u8 ^* Y( M
1.   对数据做归一化(simple scaling)  {/ _9 d; q/ H3 s9 P3 d: h

5 j' h  E( Z( v6 V2.   应用 RBF kernel! b! K, p' c* C* L, `

2 O4 u3 D( @2 P3.   用cross-validation和grid-search 得到最优的c和g8 F1 r7 k: s! I
5 a' e6 D3 S" P  `% Z- ^6 {
4.   用得到的最优c和g训练训练数据/ ]9 B8 f* v' l* z$ Z( ^0 h- I- m% g

2 @; n! U% G5 E* Q! q* v5.   测试
8 R. p1 y: P* ]0 D! O: c9 o/ B* ^& P9 r+ w+ l1 i) x5 J

' k7 u7 d: z/ K/ j+ L0 w, F) S7 s6 `; x
关于svm的C以及核函数参数设置———————-
4 _5 z7 R& \" y* }- Y+ S9 B; u  i- N& L3 G5 X
C一般可以选择为:10^t , t=- 4..4就是0.0001 到10000
5 S/ ^  ]: p6 X. d' _7 B0 ~8 v, e! R1 C3 H/ |& V. b0 B
选择的越大,表示对错误例惩罚程度越大,可能会导致模型过拟合5 [8 ^$ M/ A+ {$ Q
# u& ]0 y( U! ]! ?  _3 }

! k, ^1 P7 }9 v% A% J' X
) [5 E! v8 f+ c$ r在LIBSVM中-t用来指定核函数类型(默认值是2)。
4 A8 b' R+ h8 f0 w7 h& F; h0 r+ \% K) s7 H8 i
0)线性核函数
+ L; I2 C0 V4 ~9 d4 P" k) i$ z; ?% e# E, P6 U/ P' b
(无其他参数)0 v6 E+ x4 H. W* D2 R. P# u+ a/ n

0 C' _5 B# p" N1 b; V3 [1)多项式核函数
; H& ~! @# C" u2 g, G3 D. l6 x& I. H: K: K
(重点是阶数的选择,即d,一般选择1-11:1 3 5 7 9 11,也可以选择2,4,6…)
, x' j2 I. O9 O8 z% Y" u4 e; r) J! S( C- W2 V
2)RBF核函数1 r  _# ^4 Q1 I, b% y, f6 r2 J! x
$ l* h+ P# L, t# i# i
(径向基RBF内核,exp{-|xi-xj|^2/均方差},其中均方差反映了数据波动的大小。8 ]. X' U6 \1 e+ n) S

* t7 B6 K' w& H6 w: N参数通常可选择下面几个数的倒数:0.1 0.2 0.4 0.6 0.8 1.6 3.2 6.4 12.8,默认的是类别数的倒数,即1/k,2分类的话就是0.5)
0 d* y* u6 ~9 n1 x! B* U/ P
  g$ l7 @# m  J$ f- k3)sigmoid核函数 又叫做S形内核# a! _8 x8 c, _$ D% t3 c

5 B  k$ ]+ k; Y/ S' C两个参数g以及r:g一般可选1 2 3 4,r选0.2 0.4 0.60.8 1
7 j! j) z  {4 b: _' }1 e& a5 ?* o( i4 b+ R
4)自定义核函数
/ g* O4 k7 S  S+ o6 k3 Q. K8 Z8 v' t8 X

9 v5 @7 M" U( y* n3 }% T( W, i
1 H7 N, z& r% s5 N! f# J与核函数相对应的libsvm参数:' s* L9 y; a' N

7 i; g3 t" d, {9 \2 x1 h1)对于线性核函数,没有专门需要设置的参数$ J4 T- @( Q: v3 Y7 x9 m$ B

0 U- |4 C$ s" y# a2)对于多项式核函数,有三个参数。-d用来设置多项式核函数的最高此项次数,也就是公式中的d,默认值是3。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/k(k是类别数)。-r用来设置核函数中的coef0,也就是公式中的第二个r,默认值是0。
' r) Y! O; R2 T+ ^  n4 ?3 t- g
3)对于RBF核函数,有一个参数。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/k(k是类别数)。
( C* T8 m* Y; p. B$ a& j8 \) ]
4 }( m. H0 g% I+ b- W/ T4)对于sigmoid核函数,有两个参数。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/k(k是类别数)。-r用来设置核函数中的coef0,也就是公式中的第二个r,默认值是0。
. v% y  M5 G2 Q* R5 @3 V) U& J( e1 j3 `# W
2. 预测
" ^* |3 q+ [) B+ S# K- b% Y格式:2 w4 Q9 a% n- ?% K. f
[predicted_label, accuracy, decision_values/prob_estimates]' r+ ]7 |) f/ I% |
= libsvmpredict(testing_label_vector, testing_instance_matrix, model [, ‘libsvm_options’]);
( F3 E  k2 }0 H
! o  D3 i& [0 C2 Z/ v# I这个函数包括四个参数,其中
+ j- d! a1 _0 m; |% z8 D' E4 l- T6 d* t7 s: }6 E9 Y- k' Y
-testing_label_vector:测试样本的类标,如果有m个样本,就是m x 1的矩阵(类型必须为double)。如果类标未知,可以初始化为任意m x 1的double数组。1 ~& E* c) i/ w
-testing_instance_matrix:测试样本的特征,如果有m个样本,每个样本特征是n维,则为m x n的矩阵(类型必须为double)。1 s. K( p; H8 @! X: b: a' k& t$ D
-model:使用libsvmtrain返回的模型
" Q) H4 z+ n3 Y' @; H5 Y0 N7 c-libsvm_options:预测的参数,与训练的参数形式一样。* X9 H3 x- ?% |( z
libsvmpredict函数有三个返回值,不需要的值在Matlab可以用 ~ 进行代替。
1 S: ~. Z2 C" f/ j5 n# j) P. T$ \4 ]% O# _1 P  B$ n
-predicted_label:第一个返回值,表示样本的预测类标号。
4 f: s$ O7 K" j" \+ ^5 E0 T6 c-accuracy:第二个返回值,一个3 x 1的数组,表示分类的正确率、回归的均方根误差、回归的平方相关系数。
" E8 G3 U8 a' l% Q-decision_values/prob_estimates:第三个返回值,一个矩阵包含决策的值或者概率估计。对于n个预测样本、k类的问题,如果指定“-b 1”参数,则n x k的矩阵,每一行表示这个样本分别属于每一个类别的概率;如果没有指定“-b 1”参数,则为n x k*(k-1)/2的矩阵,每一行表示k(k-1)/2个二分类SVM的预测结果。
% R2 f5 n- @& @3 \3. 训练的参数0 T; p3 M, d/ E% K0 I( |
LIBSVM训练时可以选择的参数很多,包括:
4 Z: T, N7 x' s$ x
6 ^5 m( p5 {* A-s svm类型:SVM设置类型(默认0)
/ Q: v7 h" \$ c1 y- v5 c0 — C-SVC; 1 –v-SVC; 2 – 一类SVM; 3 — e-SVR; 4 — v-SVR
4 I4 v) I& f& |. p. P4 R-t 核函数类型:核函数设置类型(默认2)4 E4 t, W2 V3 D& z- I
0 – 线性核函数:u’v
7 |# Z7 f3 m8 j. p. q) H1 – 多项式核函数:(r*u’v + coef0)^degree
. H' [5 s; {8 p% B2 – RBF(径向基)核函数:exp(-r|u-v|^2)
; N) J/ O3 I/ q9 s7 J3 – sigmoid核函数:tanh(r*u’v + coef0)
7 @( c, x1 U4 L( n-d degree:核函数中的degree设置(针对多项式核函数)(默认3)9 @2 ~. w) N& s/ \# Y
-g r(gamma):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)(默认1/k,k为总类别数)8 o/ s! f9 h7 k$ Y7 I! B2 u
-r coef0:核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)2 B7 n, @0 v/ Q) g( n- x$ b
-c cost:设置C-SVC,e -SVR和v-SVR的参数(损失函数)(默认1)
0 L1 {# U$ m  R# v-n nu:设置v-SVC,一类SVM和v- SVR的参数(默认0.5)
8 t; ^& p1 \3 |! _% x" P% Y! K-p p:设置e -SVR 中损失函数p的值(默认0.1)6 I/ U; Q) y* |
-m cachesize:设置cache内存大小,以MB为单位(默认40), N  ^. L# I6 h9 c$ j) ^' E
-e eps:设置允许的终止判据(默认0.001)8 D# S( j' B3 H; h/ u6 U! I' K! v
-h shrinking:是否使用启发式,0或1(默认1)
/ H+ s  t- Q. I( r/ v$ [* e6 ]-wi weight:设置第几类的参数C为weight*C (C-SVC中的C) (默认1)2 D$ f3 r4 h, Y$ p5 z6 z
-v n: n-fold交互检验模式,n为fold的个数,必须大于等于2& S! e9 U9 C& k/ T* I
以上这些参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。
0 B& A9 [5 N1 }9 L  |" X. k  S" A/ d9 P+ {
4. 读取或保存
& v0 h* l& F3 H2 a( xlibsvmread函数可以读取以LIBSVM格式存储的数据文件。2 r/ }. `/ L( v; r

6 d9 H- j- N4 q) [$ {6 \[label_vector, instance_matrix] = libsvmread(‘data.txt’);
& r. V+ @5 `! X5 k5 J
2 P3 @  X/ }4 U. r这个函数输入的是文件的名字,输出为样本的类标和对应的特征。1 W5 c3 k, s! z6 l# A- q! ]

; ~" ?/ I4 l+ Q5 {; G% r) `: alibsvmwrite函数可以把Matlab的矩阵存储称为LIBSVM格式的文件。
6 i; Y# ^/ ^; o& F
8 p% {7 b" e* L; E6 ?1 F: p. k& {libsvmwrite(‘data.txt’, label_vector, instance_matrix]1 i" Y" ~. P' l; r0 T

4 L& ]/ @. _& A这个函数有三个输入,分别为保存的文件名、样本的类标和对应的特征(必须为double类型的稀疏矩阵)。

该用户从未签到

2#
发表于 2020-10-12 16:11 | 只看该作者
MATLAB中SVM(支持向量机)的用法
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-24 10:45 , Processed in 0.187500 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表