|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
9 ~9 p; y; T- \. b' A4 M! XLIBSVM是台湾大学林智仁(Lin Chih-Jen)教授等开发设计的一个简单、易于使用和快速有效的SVM模式识别与回归的软件包,他不但提供了编译好的可在Windows系列系统的执行文件,还提供了源代码,方便改进、修改以及在其它操作系统上应用;该软件对SVM所涉及的参数调节相对比较少,提供了很多的默认参数,利用这些默认参数可以解决很多问题;并提供了交互检验(Cross Validation)的功能。该软件可以解决C-SVM、ν-SVM、ε-SVR和ν-SVR等问题,包括基于一对一算法的多类模式识别问题。
* S! \4 g0 K) O- D ^ z) @& ^/ r7 K1 C' v& M+ E
注意不是matlab自带的svm实现函数,自带的svm实现函数仅支持分类问题,不支持回归问题;而libsvm不仅支持分类问题,亦支持回归问题,参数可调节,功能更强大。
4 q$ l7 \/ @/ { q' M' J+ f/ u& Q
7 D" k' |7 m* k; p0 q4 o, S; plibsvm的配置很简单,只需要下载高级版本的matlab和libsvm,VC或VS编译实现很简单的,这里就不细讲了。/ |0 L: ], N& ?. M
- x% Q( u2 a0 j; _0 H
两个步骤:训练建模——>模型预测
7 f( T* }% }2 z& r' ^# _. n
6 G& y7 |: R/ t9 S S# T分类 model = svmtrain(trainlabel, traindata, ‘-s 0 -t 2 -c 1.2 -g 2.8’);
; F9 ?" F0 u; ~% Q( ]# v6 P/ ]6 M3 A# \2 [* q, v" ^ p: f4 h# J% k& I
回归 model = svmtrain(trainlabel, traindata, ‘-s 3 -t 2 -c 2.2 -g 2.8 -p 0.01’);9 a) y0 o5 @+ C4 k3 x6 Q
( }0 B2 W: M7 {4 W/ m) h参数说明:4 n5 @8 t6 x" c% t1 A) Z) ~7 Z4 F
/ N: b. U1 x" ~
-s svm类型:SVM设置类型(默认0)
2 p0 g/ R1 ~1 b# M0 s0 — C-SVC
8 s& u9 K) x3 I' Q5 h1 –v-SVC
; ^5 }; @! w2 r. m" H# ^2 – 一类SVM6 @8 G- W. t3 F# p4 g. L/ g
3 — e -SVR
" Y+ A n6 U+ o5 G2 j4 — v-SVR8 i7 x; v: b3 p$ y5 x3 @
- f6 t8 U; [: ~* h, Y
-t 核函数类型:核函数设置类型(默认2)
8 L: ~& D8 {( Q7 V0 – 线性:u’v
J* g- G3 W* m# x9 V/ O$ C# m f; N1 – 多项式:(r*u’v + coef0)^degree/ m3 C2 l h2 c U
2 – RBF函数:exp(-r|u-v|^2)
5 \" d' Z. q% A7 W$ N1 L3 –sigmoid:tanh(r*u’v + coef0)2 p1 Z( ?( a! X& U% l, N. h$ Q* b
( \, o/ j9 M5 K-g r(gama):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)0 q; k0 V# L- i( x
2 [+ Z! p/ j0 {: a0 v-c cost:设置C-SVC,e -SVR和v-SVR的参数(损失函数)(默认1),惩罚系数
5 m# O+ l3 w9 F9 U
2 @/ y4 d2 [4 ]" E; W2 w-n nu:设置v-SVC,一类SVM和v- SVR的参数(默认0.5)( z$ H, i2 @; M; n+ x+ E( u$ b
; W/ G, k* ]2 |. t* h
-p p:设置e -SVR 中损失函数p的值(默认0.1)
( x) ]& d! ^$ @8 n( k2 C- n6 d# ~/ s+ `8 V+ B+ W2 }4 b
-d degree:核函数中的degree设置(针对多项式核函数)(默认3)
3 y8 H- b5 |) m$ @" q( e$ s
' q* j5 `& J. t" }; M: [( d" M2 J9 c-wi weight:设置第几类的参数C为weight*C(C-SVC中的C)(默认1)
* N' b7 u1 {% A: M
. {: h2 r% x$ N% q, a-v n: n-fold交互检验模式,n为fold的个数,必须大于等于21 a! C6 [: }0 j' Q: I' ~
0 V3 G) Z8 w @9 Z, k9 x4 [) wlibsvm使用误区———————-
% p; l: ?: F: j: l) j" ^7 {4 ?6 F# `9 E0 r- e$ E
(1) 直接将训练集合和测试集合简单归一化到[0,1]区间,可能导致实验结果很差。, `2 a6 b1 `1 R6 X) M7 Z" h; j
7 t9 l6 y4 y, C
(2) 如果样本的特征数非常多,那么就不必使用RBF核将样本映射到高维空间。3 t8 g3 r( a b: v) S1 V
5 E8 `9 r/ q9 Da) 在特征数非常多的情况下,使用线性核,结果已经非常好,并且只需要选择参数C即可。! ^) M+ d$ i5 [ u7 U- @5 n& ?
b) 虽然说RBF核的结果至少比线性核好,前提下搜索整个的空间。2 ~" f8 K6 I: Z0 ~
(3) 样本数<<特征数的情况:推荐使用线性核,可以达到与RBF同样的性能。
3 ~1 F) |/ Q* l" \" b5 V
: j# W. f8 \1 r(4) 样本数和特征数都非常多:推荐使用liblinear,更少的时间和内存,可比的准确率。- g7 B8 a9 K1 `
! s5 b* ~) g# o0 y- N(5) 样本数>>特征数:如果想使用线性模型,可以使用liblinear,并且使用-s 2参数0 t, r/ S, `1 Z: K9 k! U. }
7 s' X- _7 Q& u @
0 [( V# k8 H6 c6 N
( q1 b0 Q* c+ X. I详解:
3 f: \- w5 ?7 D/ J
6 ~4 o) [) R8 Q, ~1. 训练
2 f3 E8 }; O+ W" x& \! S: @格式:
V; M M7 O. I- _7 kmodel = libsvmtrain(training_label_vector, training_instance_matrix [, ‘libsvm_options’]);1 @ q7 e9 _$ f4 D
1 f' d0 l- x0 ~% T. y/ }% u7 u
这个函数有三个参数,其中
2 Y0 {; K2 t6 Z3 O4 Q" \% @, x# N. @9 H' e3 P
-training_label_vector:训练样本的类标,如果有m个样本,就是m x 1的矩阵(类型必须为double)。这里可以是二分类和多分类,类标是(-1,1)、(1,2,3)或者其他任意用来表示不同的类别的数字,要转成double类型。$ r& R& w- ~, C# m
-training_instance_matrix:训练样本的特征,如果有m个样本,每个样本特征是n维,则为m x n的矩阵(类型必须为double)。! G2 U9 Q1 q; l+ X5 b. e% O# g3 g
-libsvm_options:训练的参数,在第3点详细介绍。
' c+ A0 x$ v$ a1 N zlibsvmtrain函数返回训练好的SVM分类器模型model是一个结构体,包含以下成员:
~/ @0 p+ t9 y6 d5 T3 J2 S1 _5 H" l+ N/ ?
-Parameters: 一个5 x 1的矩阵,从上到下依次表示:
/ n: b% ]# g X# e" g-s SVM类型(默认0);) E- V( ?8 T1 b
-t 核函数类型(默认2)
3 Y/ L: _6 _" \3 H. d' ^6 u9 n! Q-d 核函数中的degree设置(针对多项式核函数)(默认3);
, E. F: k$ T, @, r-g 核函数中的r(gamma)函数设置(针对多项式/rbf/sigmoid核函数) (默认类别数目的倒数);
+ _' t2 l! v1 [; C6 i-r 核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)+ _8 @+ ~# g* }: z
-nr_class: 表示数据集中有多少类别,比如二分类时这个值即为2。
& t7 ` Z2 R2 L% ?. A6 O4 V' F-totalSV: 表示支持向量的总数。
, ]- `4 S- y* u3 P% m5 G-rho: 决策函数wx+b中的常数项的相反数(-b)。
% J5 r; v/ W) H% y. [4 Y-Label: 表示数据集中类别的标签,比如二分类常见的1和-1。% V" W; Y' n M; U9 d
-ProbA: 使用-b参数时用于概率估计的数值,否则为空。
& _0 `8 O% l, }-ProbB: 使用-b参数时用于概率估计的数值,否则为空。+ H6 a( G) m' ~8 l* R) ^
-nSV: 表示每类样本的支持向量的数目,和Label的类别标签对应。如Label=[1; -1],nSV=[63; 67],则标签为1的样本有63个支持向量,标签为-1的有67个。. E7 f8 m% M; a
-sv_coef: 表示每个支持向量在决策函数中的系数。- N6 N1 Z& x9 B# N
-SVs: 表示所有的支持向量,如果特征是n维的,支持向量一共有m个,则为m x n的稀疏矩阵。
9 l* A5 |7 `7 j% K' G8 D1 h另外,如果在训练中使用了-v参数进行交叉验证时,返回的不是一个模型,而是交叉验证的分类的正确率或者回归的均方根误差。# j; y1 o4 V+ f
, D7 G7 v. m9 L5 M- @, j8 X: c& t2 S当构建完成model后,还要为上述参数选择合适的值,方法主要有Gridsearch,其他的感觉不常用,Gridsearch说白了就是穷举。
* U; ?# a# { z3 W( S. c. P( Y, }. [3 f( A
/ m( e% E. K5 C$ [
# s% B, S' S/ e% t. \# d网格参数寻优函数(分类问题):SVMcgForClass
# I( b+ _5 H- F% N1 P6 {
7 p8 k8 p5 E. z0 x5 G0 N$ t[bestCVaccuracy,bestc,bestg]=SVMcgForClass(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,accstep)4 ~0 I( z$ @+ q* W# c; H O5 J8 ^
- j: X2 K# t0 f/ Z& k$ c+ | V输入:% Q0 G9 X* q. D3 B: ~/ c9 q2 N7 k
- S8 @/ [+ A) G$ v! S$ q( Jtrain_label:训练集的标签,格式要求与svmtrain相同。7 V: \' x8 y! y4 M6 k5 K
train:训练集,格式要求与svmtrain相同。, s; m1 a2 @& ]4 C% \& a5 E$ |
cmin,cmax:惩罚参数c的变化范围,即在[2^cmin,2^cmax]范围内寻找最佳的参数c,默认值为cmin=-8,cmax=8,即默认惩罚参数c的范围是[2^(-8),2^8]。
2 r# P. `( x( H; O* g% W: Y3 [. @( Ggmin,gmax:RBF核参数g的变化范围,即在[2^gmin,2^gmax]范围内寻找最佳的RBF核参数g,默认值为gmin=-8,gmax=8,即默认RBF核参数g的范围是[2^(-8),2^8]。+ h% \5 C( f/ _' p ~& F- E& U2 F
v:进行Cross Validation过程中的参数,即对训练集进行v-fold Cross Validation,默认为3,即默认进行3折CV过程。
6 k( e) k8 [7 Zcstep,gstep:进行参数寻优是c和g的步进大小,即c的取值为2^cmin,2^(cmin+cstep),…,2^cmax,,g的取值为2^gmin,2^(gmin+gstep),…,2^gmax,默认取值为cstep=1,gstep=1。
* q+ n0 [, M4 J; ?) jaccstep:最后参数选择结果图中准确率离散化显示的步进间隔大小([0,100]之间的一个数),默认为4.5。
6 _, A- c$ _! p6 U输出:# P+ V/ Q6 v1 U0 O6 S0 E! I
6 @: s1 S7 @2 E d2 @. j
bestCVaccuracy:最终CV意义下的最佳分类准确率。
6 S% X5 G: o3 u# z% W; ~2 V, P8 vbestc:最佳的参数c。
6 z6 v. G4 y9 ~) Nbestg:最佳的参数g。
; d# p2 l x4 S, ^; Q
O/ C% a& |3 s0 L
" E, B1 k9 F$ m/ W, I网格参数寻优函数(回归问题):SVMcgForRegress& }. Y$ M/ S; B0 {* s6 `
+ f- x# V, z$ J$ B" Z! d[bestCVmse,bestc,bestg]=SVMcgForRegress(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,msestep)
6 ]5 O0 B7 b! t% v7 l6 x
9 l0 H1 ]3 {8 y& B5 e# L其输入输出与SVMcgForClass类似,这里不再赘述。
- A0 `) U$ A' a6 F9 p/ ~' q2 A' g: V3 Y0 P3 ?
SVM 怎样能得到好的结果
$ c" N2 c' X0 w9 g! w
1 Z+ B, R& F7 b1. 对数据做归一化(simple scaling)& o* L- {+ }" H" |3 O( _, j9 Y
# |. M! ~4 I, h, V5 a5 F
2. 应用 RBF kernel! x) A( `, z3 V( t3 L& p2 p
% L3 o: Y8 w9 G4 p& I9 v+ G3 f3. 用cross-validation和grid-search 得到最优的c和g% _6 s0 G& v7 h5 Z- i$ Q
' t( S+ |# O$ H G# w7 i& s4. 用得到的最优c和g训练训练数据4 n; v) P/ t+ u4 g z: U6 L( e
, H+ r% r5 R/ Y ]
5. 测试: k5 M: g$ v8 t
9 C2 V6 S9 R' W l' z# a' C
S$ F; I$ z$ Z5 J6 p) h2 A j; P, } c2 u2 n% E% v7 O. Q& t4 r
关于svm的C以及核函数参数设置———————-
# F6 u, _) o2 g7 u3 J: p* ]' s" a
7 k5 k+ f0 x7 i+ KC一般可以选择为:10^t , t=- 4..4就是0.0001 到100009 D' ~* I. r1 U! Z- I" l
- c* `' m% l+ G; x1 u4 L( r选择的越大,表示对错误例惩罚程度越大,可能会导致模型过拟合7 p m0 h+ A0 k- q0 c5 \9 t
) X. o6 C3 _5 C3 I, e T$ u8 \8 v& S / W N+ m1 f1 w5 Y9 o$ S
3 U: `1 ~( Z `5 L
在LIBSVM中-t用来指定核函数类型(默认值是2)。
}- |6 d" ^8 d% ]3 N+ K* N8 _' p0 Z) {" q
0)线性核函数7 @+ q) S5 r" C/ o* U9 P& B
" ~1 _* }* V+ x0 a2 Z$ q1 ~
(无其他参数)* M$ x3 W5 V0 r4 X c
& S1 Y. G0 @+ ^& E7 s* }7 K1)多项式核函数5 r! [' A, p7 c! E. Z
' F4 F6 V7 a; s: A2 E(重点是阶数的选择,即d,一般选择1-11:1 3 5 7 9 11,也可以选择2,4,6…)
2 c8 H9 P$ H/ l4 v) f
! L) w: D" `4 R$ j2)RBF核函数+ y+ ]- C1 s9 i0 I( L
; c0 p1 k. A6 @1 ~* W(径向基RBF内核,exp{-|xi-xj|^2/均方差},其中均方差反映了数据波动的大小。0 _7 E' ]" r v8 c" g
" {% X! M0 N& T7 v9 ^
参数通常可选择下面几个数的倒数:0.1 0.2 0.4 0.6 0.8 1.6 3.2 6.4 12.8,默认的是类别数的倒数,即1/k,2分类的话就是0.5)# Q+ q1 X( v Q/ k5 g) W
0 w$ D7 N9 g/ @( D( {8 t3)sigmoid核函数 又叫做S形内核
; r& }) t- O, \9 \8 o# l: _8 G0 a
3 ?- j, c6 a. Q2 t1 |0 C9 C3 }两个参数g以及r:g一般可选1 2 3 4,r选0.2 0.4 0.60.8 1
0 Y" _2 b) L4 _( }! S) t
: }" T5 B) O. C6 B6 L' E4)自定义核函数
( i- S8 o% E0 I: f: ~! s, v {, l, L7 d& `! o1 K* {
5 m1 O! s: e6 k0 s: B1 ~: O- K' X' O9 k) n
与核函数相对应的libsvm参数:8 y. j- D% o# s9 T" P8 j, u& ~# m( r
/ A- M' L2 ^. r3 j ?1)对于线性核函数,没有专门需要设置的参数
6 `5 O9 _. F* j" r
' |/ X+ ^) l. W/ I2)对于多项式核函数,有三个参数。-d用来设置多项式核函数的最高此项次数,也就是公式中的d,默认值是3。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/k(k是类别数)。-r用来设置核函数中的coef0,也就是公式中的第二个r,默认值是0。, W; F: d! x) v7 \: e
3 C3 ]9 N2 O& u% o3 O' ~
3)对于RBF核函数,有一个参数。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/k(k是类别数)。
2 F) X1 t; F' x: H W- k# L2 ?/ N7 X5 O; f7 a6 K9 @, y& C
4)对于sigmoid核函数,有两个参数。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/k(k是类别数)。-r用来设置核函数中的coef0,也就是公式中的第二个r,默认值是0。2 N' N, X4 L! R, Z) H
/ t" D7 B( H5 R& `; ^2. 预测
8 O, b: z% I& H; \5 y. i& [, s格式:
3 g- }( P4 U" K2 o" F[predicted_label, accuracy, decision_values/prob_estimates]0 Z% a2 l- d6 a+ I
= libsvmpredict(testing_label_vector, testing_instance_matrix, model [, ‘libsvm_options’]);; H- R6 K! h& R& \% p
% @2 W- z& W" R; G5 \! x8 s
这个函数包括四个参数,其中
8 K5 q( W* Q2 H1 u& s
! _: p, ]# y S9 X: L5 s-testing_label_vector:测试样本的类标,如果有m个样本,就是m x 1的矩阵(类型必须为double)。如果类标未知,可以初始化为任意m x 1的double数组。* ~2 _( {+ ]' O
-testing_instance_matrix:测试样本的特征,如果有m个样本,每个样本特征是n维,则为m x n的矩阵(类型必须为double)。
3 p* h1 S. G# f-model:使用libsvmtrain返回的模型9 T4 b3 t; m/ ~. O5 y1 T
-libsvm_options:预测的参数,与训练的参数形式一样。
' q" g1 b* q4 ~5 Z4 b1 zlibsvmpredict函数有三个返回值,不需要的值在Matlab可以用 ~ 进行代替。
' E; |* K5 o; s2 V. q4 J( t+ N/ b( }2 S( [
-predicted_label:第一个返回值,表示样本的预测类标号。. G. G+ ?" `. |8 L0 L# o" {
-accuracy:第二个返回值,一个3 x 1的数组,表示分类的正确率、回归的均方根误差、回归的平方相关系数。
. O. ]* Q! N) j! V% 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的预测结果。
5 G' Y* m4 X8 ]; N+ `) e1 T# C3. 训练的参数
; S$ B7 L5 t Q9 e! I. OLIBSVM训练时可以选择的参数很多,包括:# W8 k; p- P6 x
: i! b5 l6 f6 \& j/ w, |4 Q-s svm类型:SVM设置类型(默认0)! B! u5 b+ |& D: }
0 — C-SVC; 1 –v-SVC; 2 – 一类SVM; 3 — e-SVR; 4 — v-SVR
8 k2 c! r! R' d$ ^$ T/ ~% V! ?-t 核函数类型:核函数设置类型(默认2)
' W7 j1 f$ j# J* o A) N% ~0 – 线性核函数:u’v$ I% \- |0 V: V
1 – 多项式核函数:(r*u’v + coef0)^degree5 c- Q4 V' x" u& H# ]; e0 Y' F) b
2 – RBF(径向基)核函数:exp(-r|u-v|^2)+ K6 e2 t; K3 B/ d2 q" Y7 Y
3 – sigmoid核函数:tanh(r*u’v + coef0)7 |2 n) F8 r; {
-d degree:核函数中的degree设置(针对多项式核函数)(默认3)
* Y. b$ c# z5 ?' F+ S9 \' F-g r(gamma):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)(默认1/k,k为总类别数)
" ^0 V- t4 u1 ]# ]. q-r coef0:核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)4 X# d6 o' z; a! ?' }
-c cost:设置C-SVC,e -SVR和v-SVR的参数(损失函数)(默认1)
$ x M7 `, o2 t-n nu:设置v-SVC,一类SVM和v- SVR的参数(默认0.5)
: _ P- b4 P% R" c( t# T-p p:设置e -SVR 中损失函数p的值(默认0.1); D* m" {5 d( Y0 ?3 p
-m cachesize:设置cache内存大小,以MB为单位(默认40)
3 {( A8 ~, q7 k5 M, A2 j-e eps:设置允许的终止判据(默认0.001)
1 k, c/ m4 V( r0 s/ y2 |4 n1 A5 l-h shrinking:是否使用启发式,0或1(默认1)
; {1 t9 ^& }# i& b-wi weight:设置第几类的参数C为weight*C (C-SVC中的C) (默认1)2 W8 n1 Z8 w. _/ Y
-v n: n-fold交互检验模式,n为fold的个数,必须大于等于2
, ?( y. n) U4 V' Y" V9 b以上这些参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。" K0 m: ^! @0 i/ X2 Z8 c# G0 k
2 l) Z# y. e6 y5 K* B7 O* g+ u
4. 读取或保存( m; ?! [- D2 @9 n" L3 j& y
libsvmread函数可以读取以LIBSVM格式存储的数据文件。4 Q- J: M0 ?, t! f) L
9 @$ ^( _, u8 E0 n2 I[label_vector, instance_matrix] = libsvmread(‘data.txt’);
0 W4 s3 u1 j0 ?7 n6 A I( _7 X* K2 _ }2 r& A$ f8 Z% H8 R
这个函数输入的是文件的名字,输出为样本的类标和对应的特征。* c5 q9 O+ U v% N
7 \- l; k4 K' Z" plibsvmwrite函数可以把Matlab的矩阵存储称为LIBSVM格式的文件。
; R7 [2 l2 k7 b S
9 X- @$ s& P. r5 c3 {& @7 Ylibsvmwrite(‘data.txt’, label_vector, instance_matrix]# H5 g# e3 P+ ^: _5 i3 G
' e, {) _ ~2 q J6 y这个函数有三个输入,分别为保存的文件名、样本的类标和对应的特征(必须为double类型的稀疏矩阵)。 |
|