|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
% T: Q, m1 W" |6 Q0 A) zLIBSVM是台湾大学林智仁(Lin Chih-Jen)教授等开发设计的一个简单、易于使用和快速有效的SVM模式识别与回归的软件包,他不但提供了编译好的可在Windows系列系统的执行文件,还提供了源代码,方便改进、修改以及在其它操作系统上应用;该软件对SVM所涉及的参数调节相对比较少,提供了很多的默认参数,利用这些默认参数可以解决很多问题;并提供了交互检验(Cross Validation)的功能。该软件可以解决C-SVM、ν-SVM、ε-SVR和ν-SVR等问题,包括基于一对一算法的多类模式识别问题。
" @. Q0 x2 a' g/ n% n/ Z- s0 G8 s0 c' ^2 c
注意不是matlab自带的svm实现函数,自带的svm实现函数仅支持分类问题,不支持回归问题;而libsvm不仅支持分类问题,亦支持回归问题,参数可调节,功能更强大。9 x' z# r( C# ~5 G/ N6 ~; ]$ }
, j- {0 ]$ R! A8 ~. i. Y$ c! w7 W
libsvm的配置很简单,只需要下载高级版本的matlab和libsvm,VC或VS编译实现很简单的,这里就不细讲了。
' S% o2 a I) K `, J- a
2 t% }1 H5 j4 |' i z+ A. N) D两个步骤:训练建模——>模型预测, c4 N0 B, K6 @! a! q; h
- ~& i' ]4 q/ ]8 p T# p3 J& R分类 model = svmtrain(trainlabel, traindata, ‘-s 0 -t 2 -c 1.2 -g 2.8’);
7 i- p" v& Q5 f3 ~
9 I0 D) k) c$ j8 L) b回归 model = svmtrain(trainlabel, traindata, ‘-s 3 -t 2 -c 2.2 -g 2.8 -p 0.01’);
1 w, C" k: f. D- d0 o, z; |" k4 i6 V$ J' I
参数说明:
8 D1 h. B+ Q' F* ?; J0 W* u) g3 u0 ?& x, `7 ]( x4 ^
-s svm类型:SVM设置类型(默认0)
* r8 F5 D" }* c) m4 r! t! u) H0 — C-SVC
! b- u4 x- o- {9 l2 q1 –v-SVC
7 V) i4 z, q% E, A( W2 – 一类SVM ?& Z8 F+ _, W7 u' N( k. V- \5 W
3 — e -SVR$ Q$ J1 L+ A7 D, g# u0 e
4 — v-SVR8 d! I# Q* B6 \8 B J, Y/ q
9 f5 W( V' { E$ B0 |9 @8 T
-t 核函数类型:核函数设置类型(默认2): V5 A! M% P& `
0 – 线性:u’v
; e( [) b7 v2 C1 E: ]5 t# d1 – 多项式:(r*u’v + coef0)^degree" d6 C( R9 x* ?' Z4 `1 c
2 – RBF函数:exp(-r|u-v|^2)
- X- t" k/ ~& W: r Q" k3 –sigmoid:tanh(r*u’v + coef0)9 C; T8 M: u, H6 ?
/ U7 [4 ^+ M0 U-g r(gama):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)# l/ X3 B' w) a0 P9 y1 ^
3 g, e0 U# d: q! g! j ~. Q-c cost:设置C-SVC,e -SVR和v-SVR的参数(损失函数)(默认1),惩罚系数' h( m1 b5 C, E8 _. u0 `$ z! u
' L9 A9 ^8 R5 ~" F L& |
-n nu:设置v-SVC,一类SVM和v- SVR的参数(默认0.5)
( o; G( n9 U. K$ m I( ?$ Y7 k7 ^8 X7 Z" P6 r7 ]! b
-p p:设置e -SVR 中损失函数p的值(默认0.1)/ K4 g% a1 Q+ k, X+ b
" x" E* E" M) j, s6 f/ m-d degree:核函数中的degree设置(针对多项式核函数)(默认3)
4 r* T: l4 p2 u, D7 k/ D5 ^% P. P$ G6 j+ @
-wi weight:设置第几类的参数C为weight*C(C-SVC中的C)(默认1) f4 w5 o0 o/ _# {8 m
5 O+ H" r+ F# D6 T) U1 J-v n: n-fold交互检验模式,n为fold的个数,必须大于等于2
" |- a. I8 e& A: E
: M6 X+ D% [' Y8 v* qlibsvm使用误区———————-, C+ B* N4 {# f! f
3 K A7 v2 {$ s1 Z# o(1) 直接将训练集合和测试集合简单归一化到[0,1]区间,可能导致实验结果很差。
) ^8 n8 a& f# e5 F
2 k3 Z* S6 j' T O% p(2) 如果样本的特征数非常多,那么就不必使用RBF核将样本映射到高维空间。
% f) E6 N. Q+ {' I; O0 F& v
: l( l2 F% x% M h4 a5 Q9 U' ha) 在特征数非常多的情况下,使用线性核,结果已经非常好,并且只需要选择参数C即可。
2 h9 v2 t* Y, w- ]0 h; s$ yb) 虽然说RBF核的结果至少比线性核好,前提下搜索整个的空间。
5 Q1 f+ O1 [# f- h7 L2 @" N(3) 样本数<<特征数的情况:推荐使用线性核,可以达到与RBF同样的性能。' \$ t% Z, b0 E- a7 F7 {% Z" L' k
+ v0 Q. K7 d8 t) i3 n1 W7 c(4) 样本数和特征数都非常多:推荐使用liblinear,更少的时间和内存,可比的准确率。# C' q! t7 q& W2 O9 Z: j- `: `
/ B+ e" @1 }7 I9 {
(5) 样本数>>特征数:如果想使用线性模型,可以使用liblinear,并且使用-s 2参数
% V7 d/ g8 L$ E; y& o& y( G: [/ ^& L' M2 W
2 i8 N- ]! P+ H) B5 e' |
4 Z5 I5 |7 H) y4 X- x; _6 C: e
详解:# C! Q8 ~8 O& [; V! H: K
8 W+ I& X7 @1 v: y
1. 训练: H* [: n" G' }
格式:
# T/ s/ L l/ ^) {& u; F% ]model = libsvmtrain(training_label_vector, training_instance_matrix [, ‘libsvm_options’]);8 c: p" J" t9 u
' a# u& b" C* p1 w3 \+ T: s
这个函数有三个参数,其中+ c: z* h( x( p' {9 O
! q6 i1 w5 n. c; S" _-training_label_vector:训练样本的类标,如果有m个样本,就是m x 1的矩阵(类型必须为double)。这里可以是二分类和多分类,类标是(-1,1)、(1,2,3)或者其他任意用来表示不同的类别的数字,要转成double类型。: F! N+ k) O1 ~: }* Z( ?
-training_instance_matrix:训练样本的特征,如果有m个样本,每个样本特征是n维,则为m x n的矩阵(类型必须为double)。
4 ?& W! L. z" Y( C$ ?-libsvm_options:训练的参数,在第3点详细介绍。2 q6 O$ E" c& i+ ~1 G
libsvmtrain函数返回训练好的SVM分类器模型model是一个结构体,包含以下成员:2 D, t$ m& t9 i/ ] E; j" z; q' N4 b
" x$ B4 r, h8 T1 e% L3 b' {0 I-Parameters: 一个5 x 1的矩阵,从上到下依次表示:
: x k. o: t! l* p-s SVM类型(默认0);, x+ Y( l8 e) d# x$ e- U, Y
-t 核函数类型(默认2)
! `/ |$ b7 o% T3 Q8 f% H-d 核函数中的degree设置(针对多项式核函数)(默认3);
. C3 o# ?& O8 M# z5 l-g 核函数中的r(gamma)函数设置(针对多项式/rbf/sigmoid核函数) (默认类别数目的倒数);
# s' a6 E3 Y: e6 X6 r# y-r 核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)
) W( P7 s- k& s. l7 F' [-nr_class: 表示数据集中有多少类别,比如二分类时这个值即为2。4 D# {2 T) ` U( l( C
-totalSV: 表示支持向量的总数。: B& b% ^* E2 `, [$ ~ q, m! W7 e
-rho: 决策函数wx+b中的常数项的相反数(-b)。$ }8 P; M' J- z _: o; ~2 s
-Label: 表示数据集中类别的标签,比如二分类常见的1和-1。' Y. B m% e/ f X, }# s
-ProbA: 使用-b参数时用于概率估计的数值,否则为空。
7 }5 Z4 E6 ]: x4 n( p6 T" J-ProbB: 使用-b参数时用于概率估计的数值,否则为空。
' B/ y# n9 d% J, J9 o2 F5 R0 v$ t-nSV: 表示每类样本的支持向量的数目,和Label的类别标签对应。如Label=[1; -1],nSV=[63; 67],则标签为1的样本有63个支持向量,标签为-1的有67个。
) Q7 F! x4 o/ E- G6 M-sv_coef: 表示每个支持向量在决策函数中的系数。6 G; Z* \! x) ?$ [' v* A+ f& P! h6 o( b
-SVs: 表示所有的支持向量,如果特征是n维的,支持向量一共有m个,则为m x n的稀疏矩阵。6 g$ v& f" f# Q+ L3 k* T
另外,如果在训练中使用了-v参数进行交叉验证时,返回的不是一个模型,而是交叉验证的分类的正确率或者回归的均方根误差。
) y1 ~3 w F* D, S
. I9 h3 Q2 s$ [: `: q3 ?7 l当构建完成model后,还要为上述参数选择合适的值,方法主要有Gridsearch,其他的感觉不常用,Gridsearch说白了就是穷举。/ D7 D" Q3 j1 Y5 y5 D6 i' \- |
# V, j7 @! U3 a! W, [ P
7 P/ K: h1 h3 [# I y8 Y" ` P& }. O ^0 A, t
网格参数寻优函数(分类问题):SVMcgForClass
$ q% y$ x5 p/ [) u+ H
2 x5 G' C" w1 x* P7 j6 m[bestCVaccuracy,bestc,bestg]=SVMcgForClass(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,accstep)# u% j. e! W1 O- u+ ^# n8 }! C* n
3 T) O# l+ q2 c1 W( K# b. j) m% j
输入:
/ D4 l& m7 F5 t: n% t( d) E! p* F5 v4 ?
train_label:训练集的标签,格式要求与svmtrain相同。' O H4 r4 W( {3 k- y! P
train:训练集,格式要求与svmtrain相同。) I; T0 X- X; _* T( k: l; U/ v7 s/ ~( B
cmin,cmax:惩罚参数c的变化范围,即在[2^cmin,2^cmax]范围内寻找最佳的参数c,默认值为cmin=-8,cmax=8,即默认惩罚参数c的范围是[2^(-8),2^8]。
2 B# N7 @# |6 h( ]* M6 }gmin,gmax:RBF核参数g的变化范围,即在[2^gmin,2^gmax]范围内寻找最佳的RBF核参数g,默认值为gmin=-8,gmax=8,即默认RBF核参数g的范围是[2^(-8),2^8]。5 g, H8 l# D4 Y% L" ^; w. V
v:进行Cross Validation过程中的参数,即对训练集进行v-fold Cross Validation,默认为3,即默认进行3折CV过程。$ P6 h8 O& X' i' v- e+ h+ C
cstep,gstep:进行参数寻优是c和g的步进大小,即c的取值为2^cmin,2^(cmin+cstep),…,2^cmax,,g的取值为2^gmin,2^(gmin+gstep),…,2^gmax,默认取值为cstep=1,gstep=1。
$ |- y. Q; {$ A2 g' {accstep:最后参数选择结果图中准确率离散化显示的步进间隔大小([0,100]之间的一个数),默认为4.5。$ z5 `, {" Q: N& ]1 L( K8 q
输出:1 c+ o) F5 t& e/ b6 k" C; y! B
3 \8 C. h1 [- XbestCVaccuracy:最终CV意义下的最佳分类准确率。
: ~9 e0 A5 K6 P* G) Q! U) w( @9 l5 kbestc:最佳的参数c。
5 ^8 j$ q5 P L) L2 V; E- Nbestg:最佳的参数g。
y: E7 \$ K$ l9 l: d3 f) H' N- c
+ V. G6 Y3 _2 m( F; H' m( t, M Q, x, H
网格参数寻优函数(回归问题):SVMcgForRegress ~; {8 x% K+ r) O, |
6 d% }$ o: C+ C y- J. N& K! B% `% _[bestCVmse,bestc,bestg]=SVMcgForRegress(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,msestep)" I2 @6 J4 t# `: P$ o
" z# l I- j1 G0 l \& }
其输入输出与SVMcgForClass类似,这里不再赘述。
/ B, ^1 C3 Z; t. `) b- ?2 l
+ j+ C/ ?) ^/ T; { `, BSVM 怎样能得到好的结果# ~0 Y: Q& ^( N+ ]7 ~" N
1 `5 ]+ w3 N% |7 z, _; ~1. 对数据做归一化(simple scaling)+ q4 h: u" ]6 o* o, ~
" |9 A' R% u4 b: D" K1 E4 ~) T
2. 应用 RBF kernel
5 q0 @" |" S% j" \- H3 \! @0 ?
1 i0 j4 R8 x0 C7 l- v i/ I# V/ h3. 用cross-validation和grid-search 得到最优的c和g
1 u, K' y# d0 V0 `# r4 N: P3 f+ M% Z4 m
4. 用得到的最优c和g训练训练数据
8 L( H+ X# K: A# J( v
& N- W7 \* G3 n9 r5. 测试
5 e2 M0 v! K# @4 J, L4 b$ R
& r3 E8 q, I5 W& u2 x) i + v: {. v7 y/ {6 ]2 ~
* q1 r# N1 e4 i8 G, {( ~关于svm的C以及核函数参数设置———————-1 b. S. I- q) D: y2 w5 R0 y
" z2 \4 b4 [% K2 z+ ?" a
C一般可以选择为:10^t , t=- 4..4就是0.0001 到10000
8 B z4 ^* T' Q3 b0 t
% C! h" ~. m# s' V7 K) o% N选择的越大,表示对错误例惩罚程度越大,可能会导致模型过拟合
0 q) y( R/ {# j6 d; a4 Q# ~7 n- t# W1 q
2 D0 H# o, z+ O9 x: T: S5 q
- q% ?* C# q2 ^7 @" u在LIBSVM中-t用来指定核函数类型(默认值是2)。. C4 D) r2 ^( w# [9 M
5 e) g$ [$ M, x, X+ e4 l4 r$ w0)线性核函数
) s4 Q2 y; J0 U( n0 ^
$ W6 n9 J+ t/ o) v: G# C+ d(无其他参数)
. U; O, G% J9 }' t! \% ^
* U# f! {! c2 T3 D( m, r1)多项式核函数
0 g, q4 M' o( T- g; o: E$ t4 Y
7 g' @- }! Y1 B* _4 ](重点是阶数的选择,即d,一般选择1-11:1 3 5 7 9 11,也可以选择2,4,6…)( Q* _1 W6 q& j- ?+ o
: v2 M) P& n* u4 e
2)RBF核函数9 B4 F( B. i3 T4 E: n+ l' J1 u
9 R3 Q ?1 O- A [$ f6 w, t0 W e
(径向基RBF内核,exp{-|xi-xj|^2/均方差},其中均方差反映了数据波动的大小。. X7 S4 a/ F. i
/ R$ ?! _+ [: i7 u+ D# f2 ?8 T0 g
参数通常可选择下面几个数的倒数:0.1 0.2 0.4 0.6 0.8 1.6 3.2 6.4 12.8,默认的是类别数的倒数,即1/k,2分类的话就是0.5)7 D E O! S5 a3 \
4 w, |2 Z% t+ u5 u. x* s3)sigmoid核函数 又叫做S形内核. A& `' F- o, O* c F
$ `, Q2 V! Q( o6 c' n. h+ L' t
两个参数g以及r:g一般可选1 2 3 4,r选0.2 0.4 0.60.8 1
1 ~5 I6 V( b7 ~8 ` y
& M$ B- Z! e" A L$ f. f' H4 d4)自定义核函数& j s( ?* ~# E2 L8 |1 x: I
; G! X0 J( U# I9 I% D
0 X* Y! V2 U7 e6 }+ A& V& Z6 b# ~
9 u* f( B3 E7 Z5 B# k6 d. w9 X9 s% w与核函数相对应的libsvm参数:
0 y/ X w$ l7 B/ t. V, O" g# ^9 U! {& M b% s
1)对于线性核函数,没有专门需要设置的参数% Y/ G& B5 L4 c" B) t" V( G& c U
8 V5 M+ E4 J7 y5 E4 r& l& ~
2)对于多项式核函数,有三个参数。-d用来设置多项式核函数的最高此项次数,也就是公式中的d,默认值是3。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/k(k是类别数)。-r用来设置核函数中的coef0,也就是公式中的第二个r,默认值是0。
% g ?4 R: `. Q' |( G, D8 d2 ^1 z4 j
3)对于RBF核函数,有一个参数。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/k(k是类别数)。
+ D2 y, E% X" }/ M0 N5 g* w; J! q/ ]- r1 d8 r
4)对于sigmoid核函数,有两个参数。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/k(k是类别数)。-r用来设置核函数中的coef0,也就是公式中的第二个r,默认值是0。2 K7 G) l& |. Y0 a1 B/ O" w
|3 H2 z r: C( ]
2. 预测1 J- N' j' n4 a4 \" m0 A6 h
格式:
! n# E1 C2 k! u4 w[predicted_label, accuracy, decision_values/prob_estimates]+ |" Y" f: ]4 b. J( D4 }
= libsvmpredict(testing_label_vector, testing_instance_matrix, model [, ‘libsvm_options’]);, s3 {2 W! q4 T G5 f3 ]7 t1 L
F8 R2 A" u1 z
这个函数包括四个参数,其中5 |4 U5 D9 z7 A/ L. P1 f8 y# e6 r
$ j( m" l. y5 }+ b8 o
-testing_label_vector:测试样本的类标,如果有m个样本,就是m x 1的矩阵(类型必须为double)。如果类标未知,可以初始化为任意m x 1的double数组。9 V/ D% l% d7 T0 h4 S6 e& b1 d+ K
-testing_instance_matrix:测试样本的特征,如果有m个样本,每个样本特征是n维,则为m x n的矩阵(类型必须为double)。6 N% z* C$ B' K% j
-model:使用libsvmtrain返回的模型
$ H! Q2 ^' j" s' a2 v-libsvm_options:预测的参数,与训练的参数形式一样。- Y( y3 R' x4 X# q1 d; p+ L
libsvmpredict函数有三个返回值,不需要的值在Matlab可以用 ~ 进行代替。' b3 J) f2 w2 l$ D7 X
( ^0 x) y( w- d: D: i. z-predicted_label:第一个返回值,表示样本的预测类标号。
1 p, {, d3 d8 t* D-accuracy:第二个返回值,一个3 x 1的数组,表示分类的正确率、回归的均方根误差、回归的平方相关系数。 \/ B' g- ~7 c% M% U7 x
-decision_values/prob_estimates:第三个返回值,一个矩阵包含决策的值或者概率估计。对于n个预测样本、k类的问题,如果指定“-b 1”参数,则n x k的矩阵,每一行表示这个样本分别属于每一个类别的概率;如果没有指定“-b 1”参数,则为n x k*(k-1)/2的矩阵,每一行表示k(k-1)/2个二分类SVM的预测结果。
' G1 w+ N1 [* W5 l/ E/ I3. 训练的参数' V- S N! U0 A2 X0 r( t$ E- u
LIBSVM训练时可以选择的参数很多,包括:
3 z# ^* J, Y# B7 Y3 a0 L; n# g( F
-s svm类型:SVM设置类型(默认0). P3 d! f) M) {& k
0 — C-SVC; 1 –v-SVC; 2 – 一类SVM; 3 — e-SVR; 4 — v-SVR, L. j% u: p+ v4 D& A( ^$ J
-t 核函数类型:核函数设置类型(默认2): ]- @$ l6 I7 x" z6 ]+ s0 y
0 – 线性核函数:u’v! u+ i* ?4 k; T' H
1 – 多项式核函数:(r*u’v + coef0)^degree
8 f9 m; J% a! j4 _2 – RBF(径向基)核函数:exp(-r|u-v|^2)) b/ t& O! N. V9 S/ v6 o6 u
3 – sigmoid核函数:tanh(r*u’v + coef0)
3 W2 f) `4 d& r+ o9 [+ q2 l7 L( Z-d degree:核函数中的degree设置(针对多项式核函数)(默认3)
$ T! ?& a1 k6 i% l: Y-g r(gamma):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)(默认1/k,k为总类别数)
( n8 O; N3 _3 v+ M: C-r coef0:核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)
; l: g# Q6 x/ X+ {( a1 M2 B-c cost:设置C-SVC,e -SVR和v-SVR的参数(损失函数)(默认1)$ E$ e! }0 p- P; i8 e) V. T
-n nu:设置v-SVC,一类SVM和v- SVR的参数(默认0.5)8 a5 O- o! q$ c+ G
-p p:设置e -SVR 中损失函数p的值(默认0.1)9 e6 y5 `0 B1 U7 a1 k6 z# ]8 T
-m cachesize:设置cache内存大小,以MB为单位(默认40)$ h/ L, r; ^* C6 h
-e eps:设置允许的终止判据(默认0.001)
7 x7 @% J+ K5 }+ q" K6 ~-h shrinking:是否使用启发式,0或1(默认1)
2 L! H2 V4 }: d S) t# a( \-wi weight:设置第几类的参数C为weight*C (C-SVC中的C) (默认1)
5 m" w% g2 I) j8 H( R-v n: n-fold交互检验模式,n为fold的个数,必须大于等于2& T# k! \$ D e/ w5 m
以上这些参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。
# e8 ]# O ]5 }9 f, \- v, l) c7 o# h( }0 D, s
4. 读取或保存9 x$ o; B/ @8 {2 `. `6 E T/ V/ D
libsvmread函数可以读取以LIBSVM格式存储的数据文件。
$ m+ ^9 z# c: y1 y- S F* J6 z0 t7 M/ d3 O4 X
[label_vector, instance_matrix] = libsvmread(‘data.txt’);. J! k" T8 J) v
+ s' U0 R2 L* E0 U这个函数输入的是文件的名字,输出为样本的类标和对应的特征。# [# L2 M$ j( i' E+ z
% U* i! g5 N1 m/ X/ Clibsvmwrite函数可以把Matlab的矩阵存储称为LIBSVM格式的文件。
) ]; v) W8 @9 g- Z1 D6 _+ I7 G8 L" r) r' w. {
libsvmwrite(‘data.txt’, label_vector, instance_matrix]2 Q' L" I. c7 o9 ^
|) x1 o) `* B: [* N这个函数有三个输入,分别为保存的文件名、样本的类标和对应的特征(必须为double类型的稀疏矩阵)。 |
|