|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
$ l: n F% N( u% G8 Q$ C
LIBSVM是台湾大学林智仁(Lin Chih-Jen)教授等开发设计的一个简单、易于使用和快速有效的SVM模式识别与回归的软件包,他不但提供了编译好的可在Windows系列系统的执行文件,还提供了源代码,方便改进、修改以及在其它操作系统上应用;该软件对SVM所涉及的参数调节相对比较少,提供了很多的默认参数,利用这些默认参数可以解决很多问题;并提供了交互检验(Cross Validation)的功能。该软件可以解决C-SVM、ν-SVM、ε-SVR和ν-SVR等问题,包括基于一对一算法的多类模式识别问题。* @6 u9 k9 X' \
, G+ O" k: G$ x注意不是matlab自带的svm实现函数,自带的svm实现函数仅支持分类问题,不支持回归问题;而libsvm不仅支持分类问题,亦支持回归问题,参数可调节,功能更强大。
4 r) p2 \* Y; r! [; t4 f9 d* q& O& X, }7 t' J* f
libsvm的配置很简单,只需要下载高级版本的matlab和libsvm,VC或VS编译实现很简单的,这里就不细讲了。
& h& F4 F% G9 Z% J: R2 \( C2 z4 S) T4 m) S
两个步骤:训练建模——>模型预测4 J% l0 T( r$ W( B( \
$ L# M5 U/ x5 r- N分类 model = svmtrain(trainlabel, traindata, ‘-s 0 -t 2 -c 1.2 -g 2.8’);' S8 n9 P7 x" w# }5 [( u6 i
9 L0 m. ?% m0 Y) S+ c: s5 k4 J+ ^: p
回归 model = svmtrain(trainlabel, traindata, ‘-s 3 -t 2 -c 2.2 -g 2.8 -p 0.01’);9 N+ S s: I6 V, s E: D6 h! [" k
7 C9 D8 P w' g* E1 D& {$ q参数说明:
( K" C [: F+ N) ]7 c, S _* c5 k. g' v& l, T: R
-s svm类型:SVM设置类型(默认0)7 Y2 \+ R5 S* U, t% r% y
0 — C-SVC7 Z( h& L6 G- ^ p# y1 W9 N6 D
1 –v-SVC
: L- q/ R& e5 [# }2 – 一类SVM
3 `! r% P- a0 j, D* E7 t0 j3 — e -SVR
; x' x- Q3 J& c v5 D: y% V* T W3 h4 — v-SVR9 R+ w, ?0 `3 s8 w2 {
. R' z h, X; x
-t 核函数类型:核函数设置类型(默认2)
) g1 K4 _! O! `+ S0 – 线性:u’v3 G+ d) \. n8 }3 P; T: w& X
1 – 多项式:(r*u’v + coef0)^degree
+ V% N0 a& e: u0 N2 – RBF函数:exp(-r|u-v|^2)1 H2 ~1 A8 r4 u$ z) k
3 –sigmoid:tanh(r*u’v + coef0)
+ ^+ g4 i1 J/ Q3 H8 ]
4 x! U' {8 h2 e* v [+ h8 X-g r(gama):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)/ g; O* S6 I" |) }3 F
( K6 q+ Z1 {6 O* w: o* }5 L-c cost:设置C-SVC,e -SVR和v-SVR的参数(损失函数)(默认1),惩罚系数5 W! B$ q4 [7 e& y$ I9 ~
- Y5 [0 {2 e9 U-n nu:设置v-SVC,一类SVM和v- SVR的参数(默认0.5)
4 ?$ w& h: C y7 A0 ~" D
" \/ R) h3 ~; y7 B- t* w$ S-p p:设置e -SVR 中损失函数p的值(默认0.1)8 ^: O& n" M% x( e
t% C! q2 {, ?6 G' m$ y- U
-d degree:核函数中的degree设置(针对多项式核函数)(默认3)
0 `; g# t* C6 ]1 |8 C0 a$ E
H2 z$ H' V( ?+ ?. k-wi weight:设置第几类的参数C为weight*C(C-SVC中的C)(默认1)
: F; y+ {: N# u
, T0 ^2 N- L9 R/ X* D/ w( o8 }( f' O-v n: n-fold交互检验模式,n为fold的个数,必须大于等于2
7 l& V# r: X+ S# a, w
I- T- e' ], k9 q* l, ilibsvm使用误区———————-
' P% T8 P% ?4 y: N E+ Z
d6 [2 b/ D$ r; R(1) 直接将训练集合和测试集合简单归一化到[0,1]区间,可能导致实验结果很差。% A( u* F4 |/ h1 o6 Z. Y* G% Q9 n/ `
) \ N' p. S4 u: `* f(2) 如果样本的特征数非常多,那么就不必使用RBF核将样本映射到高维空间。, X- E; @" g- A2 u- w
/ U. V, h6 ]: O% Ra) 在特征数非常多的情况下,使用线性核,结果已经非常好,并且只需要选择参数C即可。+ F6 z* N K* @; n3 t8 W$ J" p
b) 虽然说RBF核的结果至少比线性核好,前提下搜索整个的空间。( a6 l% e3 A5 i) b# W
(3) 样本数<<特征数的情况:推荐使用线性核,可以达到与RBF同样的性能。7 ]/ I1 o; h4 ^+ y2 Z
2 e* {+ J4 h5 a% M2 f) l9 y
(4) 样本数和特征数都非常多:推荐使用liblinear,更少的时间和内存,可比的准确率。; Y* Z' Y+ T" i# x! S$ J
5 M, F. v2 o: t' b* g* G! a" a! f(5) 样本数>>特征数:如果想使用线性模型,可以使用liblinear,并且使用-s 2参数 ]* V4 j5 K- J0 [
, w) d& Y9 _9 _4 p( i
" t; l! V6 S/ @# Y& S$ z" t, R
" [$ u" {, r+ F( `- R$ z9 L详解:' C$ L5 n0 z5 ]- n
5 o3 v+ |! n3 K7 z0 T( c
1. 训练
4 G, e' o7 @7 }' {, c0 p格式:
1 [# O Y- ^+ T1 C9 e4 Jmodel = libsvmtrain(training_label_vector, training_instance_matrix [, ‘libsvm_options’]);4 b4 t& c8 B6 b- r4 K
* a) s7 D# _& R* d" K: B
这个函数有三个参数,其中
" {; g# ~* c8 X" W( S9 p$ O6 d) M, v- L% E e! ]/ k/ m# S; q
-training_label_vector:训练样本的类标,如果有m个样本,就是m x 1的矩阵(类型必须为double)。这里可以是二分类和多分类,类标是(-1,1)、(1,2,3)或者其他任意用来表示不同的类别的数字,要转成double类型。
( d# Z) D% t' C$ v2 y$ T1 _-training_instance_matrix:训练样本的特征,如果有m个样本,每个样本特征是n维,则为m x n的矩阵(类型必须为double)。7 ]0 D6 u3 Y& h- A
-libsvm_options:训练的参数,在第3点详细介绍。8 d/ o* ]" b: a$ n" \7 ^: |
libsvmtrain函数返回训练好的SVM分类器模型model是一个结构体,包含以下成员:, y7 J( Q( u8 |; i8 L
z, b' k" \5 w-Parameters: 一个5 x 1的矩阵,从上到下依次表示:
% ^# P8 f! j3 J) ?( d-s SVM类型(默认0);1 P* e5 x7 `6 K' ` }* Z+ {
-t 核函数类型(默认2)
( M% x) ^5 I0 ^0 m$ }4 O; }$ @8 `-d 核函数中的degree设置(针对多项式核函数)(默认3);& u* `. B, H, m4 \
-g 核函数中的r(gamma)函数设置(针对多项式/rbf/sigmoid核函数) (默认类别数目的倒数);( j0 Z. C1 { K
-r 核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)' n& ]0 X0 U0 Z* c @4 N8 [ N0 r
-nr_class: 表示数据集中有多少类别,比如二分类时这个值即为2。0 V6 ^' I1 b; o
-totalSV: 表示支持向量的总数。3 [$ y+ F8 w& d0 U, e& a! Z
-rho: 决策函数wx+b中的常数项的相反数(-b)。
4 S; z" l- ^+ Y2 W-Label: 表示数据集中类别的标签,比如二分类常见的1和-1。
" P, U1 |& t# a2 `# d-ProbA: 使用-b参数时用于概率估计的数值,否则为空。
/ W% u0 l+ r2 \% {+ ]( [+ G0 R-ProbB: 使用-b参数时用于概率估计的数值,否则为空。
1 d! o. h1 c8 F% G. u; O* D-nSV: 表示每类样本的支持向量的数目,和Label的类别标签对应。如Label=[1; -1],nSV=[63; 67],则标签为1的样本有63个支持向量,标签为-1的有67个。
1 h( f" ]& V6 A6 n-sv_coef: 表示每个支持向量在决策函数中的系数。: r% ~8 ]7 M( Z7 j4 N1 h3 c
-SVs: 表示所有的支持向量,如果特征是n维的,支持向量一共有m个,则为m x n的稀疏矩阵。
6 s' J& r, D3 r( T另外,如果在训练中使用了-v参数进行交叉验证时,返回的不是一个模型,而是交叉验证的分类的正确率或者回归的均方根误差。
w: [1 h2 E4 a) W1 R9 H5 F5 Z2 U* y% J; q+ ~ U! {
当构建完成model后,还要为上述参数选择合适的值,方法主要有Gridsearch,其他的感觉不常用,Gridsearch说白了就是穷举。
. I C8 x* ]$ N4 @ u# c$ f& m# }6 ]
9 H# G+ B# n% X+ j; Q6 O! h/ n+ r
0 Q5 I- O% ~: c网格参数寻优函数(分类问题):SVMcgForClass/ ]& e) t4 Q& `" J+ |
: q; f. B( a% t: l' p \( T. a[bestCVaccuracy,bestc,bestg]=SVMcgForClass(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,accstep)) r2 D/ k# [+ G% T
/ A6 I( p- B; k- Z2 |6 ^输入:
0 s, ]8 I& t6 h. r/ b
3 ]% \8 B, b0 T6 F6 _& m8 ~train_label:训练集的标签,格式要求与svmtrain相同。4 I; v# \7 s+ X- v& ~% ^
train:训练集,格式要求与svmtrain相同。; Z; u5 M) u* L! X6 {4 K
cmin,cmax:惩罚参数c的变化范围,即在[2^cmin,2^cmax]范围内寻找最佳的参数c,默认值为cmin=-8,cmax=8,即默认惩罚参数c的范围是[2^(-8),2^8]。
( D; R/ c) t! K% P& u: kgmin,gmax:RBF核参数g的变化范围,即在[2^gmin,2^gmax]范围内寻找最佳的RBF核参数g,默认值为gmin=-8,gmax=8,即默认RBF核参数g的范围是[2^(-8),2^8]。5 y" k# ]! K& I q) ^
v:进行Cross Validation过程中的参数,即对训练集进行v-fold Cross Validation,默认为3,即默认进行3折CV过程。6 y. A6 U3 e, S0 y
cstep,gstep:进行参数寻优是c和g的步进大小,即c的取值为2^cmin,2^(cmin+cstep),…,2^cmax,,g的取值为2^gmin,2^(gmin+gstep),…,2^gmax,默认取值为cstep=1,gstep=1。
9 [) w8 b: M- R' ^1 Q# r7 U9 R) Laccstep:最后参数选择结果图中准确率离散化显示的步进间隔大小([0,100]之间的一个数),默认为4.5。" d0 j7 Y/ ^. z: {- k8 j8 `8 e7 R
输出:9 ?/ t, m0 Y, r; H( d
- B/ K. C b9 N* b2 ^
bestCVaccuracy:最终CV意义下的最佳分类准确率。: G! S( O. m/ U1 b$ J5 \4 Q
bestc:最佳的参数c。0 b: |: t$ L- k* P
bestg:最佳的参数g。2 F6 `% U' ~+ c6 e
- T' n8 |9 V0 k- B9 K( i/ j0 s0 x0 ~' x
网格参数寻优函数(回归问题):SVMcgForRegress
* x/ m: g5 J. {* ^5 A+ S# R- Y. s( Q/ Y% H2 Z0 V/ Y6 Y$ @/ r
[bestCVmse,bestc,bestg]=SVMcgForRegress(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,msestep)7 L4 v$ u8 U( L' ~
- z! ~ [* [2 u: b8 }
其输入输出与SVMcgForClass类似,这里不再赘述。
+ V+ @ v* |9 z _. Y4 ~! R8 t# e1 J7 l! n i4 O5 ^2 A3 I& H- z
SVM 怎样能得到好的结果
/ R; `9 Q u/ \' N
2 `9 u9 e% Q1 X7 I1. 对数据做归一化(simple scaling)2 {+ t4 f4 s5 v
, R5 V# j4 I1 n
2. 应用 RBF kernel$ @# f. L; [* A) m) { o
& v9 W ~8 e q' ]3. 用cross-validation和grid-search 得到最优的c和g
1 ^# f! i8 L# o9 t. S9 n4 Y6 ^. p6 ?( D3 L$ t# M
4. 用得到的最优c和g训练训练数据
% L- P5 [ l% U$ t3 F3 i: m
' W# d% c9 z" @! h9 {; Z7 n. y: C! l5. 测试
8 C; K9 [! T; L* T! y1 ~ Y5 T1 M5 `' ~! u& j
' c3 s7 S- B( d: l# F8 k
* i9 C0 M1 k; F6 M, R8 z1 t关于svm的C以及核函数参数设置———————-
" Z; u! `: B8 A6 c! L3 u
6 }2 d6 v; B) S4 pC一般可以选择为:10^t , t=- 4..4就是0.0001 到10000" H8 g. F0 g6 X
' E& z7 {; j1 k选择的越大,表示对错误例惩罚程度越大,可能会导致模型过拟合
% j7 o. n* T4 b$ h
6 { D m& W" P! A
8 l. }! a% r9 ]& k$ e- d
8 D) U+ L9 h; ~# y0 |6 d在LIBSVM中-t用来指定核函数类型(默认值是2)。- {0 G9 U7 Z5 l, e7 N
$ B8 e) ^% b4 f/ [7 c0)线性核函数& ]& G: q5 i4 h7 m8 u) ~4 Y: u' d
2 d' Z# q7 y3 t4 u(无其他参数)( [! P2 r% a$ O/ b- F, j, P
3 n; \8 ], }' `7 o! g: S1 P
1)多项式核函数) M x0 H! Z* d( V* ~' L
: t* T2 }, X5 `. Y6 N0 ^' R8 f
(重点是阶数的选择,即d,一般选择1-11:1 3 5 7 9 11,也可以选择2,4,6…)
% g# q" [5 A" {; Z# ^! F' _8 B g8 D0 Y5 r
2)RBF核函数- `/ r4 F$ _! p/ N( F3 N! W m
( B6 Q9 [' _; K3 y0 a0 ?. J(径向基RBF内核,exp{-|xi-xj|^2/均方差},其中均方差反映了数据波动的大小。5 J+ F: }" x( Q
4 b7 A% P" A% l. n# p k ]
参数通常可选择下面几个数的倒数:0.1 0.2 0.4 0.6 0.8 1.6 3.2 6.4 12.8,默认的是类别数的倒数,即1/k,2分类的话就是0.5)
+ V0 U$ f4 Y! X! Z f6 t& x) p7 T5 P2 V( F8 n' n7 }
3)sigmoid核函数 又叫做S形内核
( o% B' H5 y3 r" v2 }6 p: @. x
* q4 \! C" j( K两个参数g以及r:g一般可选1 2 3 4,r选0.2 0.4 0.60.8 1
) U8 H$ U/ w3 \& y6 K
# K/ P8 X$ y, n3 k/ L3 F4)自定义核函数
) a1 D2 A) H9 F$ F ^; j. `) i, U0 n1 E1 W( ?% s
+ ?3 Y: }' y& }+ n3 W+ y# B
- g9 ` x6 |" E5 C与核函数相对应的libsvm参数:# @, I: ^; Z M9 r. A. A4 s
% [: Y, ]* K t. W1 L W1)对于线性核函数,没有专门需要设置的参数. m8 A4 s: \. o* r
: _1 g+ `% p3 N8 v: }% c' I, e% ]
2)对于多项式核函数,有三个参数。-d用来设置多项式核函数的最高此项次数,也就是公式中的d,默认值是3。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/k(k是类别数)。-r用来设置核函数中的coef0,也就是公式中的第二个r,默认值是0。$ \( e" }- m, V
, ^# _0 {# d0 G! C# W& `3)对于RBF核函数,有一个参数。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/k(k是类别数)。
+ r- p: I* Z7 P! W0 Q+ l. C
' _) E2 p; S* D8 A$ P* J z% q. ]4)对于sigmoid核函数,有两个参数。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/k(k是类别数)。-r用来设置核函数中的coef0,也就是公式中的第二个r,默认值是0。( l- ?- r* a! h9 i2 S# W* n
- Q" H7 b- D. y
2. 预测$ o) m0 z" @) a) ?2 h) [- Y/ g
格式:
+ N) G3 t$ n4 O* E- A3 P" q5 [[predicted_label, accuracy, decision_values/prob_estimates]
1 p4 m0 E- G. o; D1 T2 s" j: E= libsvmpredict(testing_label_vector, testing_instance_matrix, model [, ‘libsvm_options’]);
6 j1 n; F9 p# d
* t4 {' k) |1 K8 I这个函数包括四个参数,其中
/ W, n" E4 u% [$ y9 m# a3 S- [) Q3 v
-testing_label_vector:测试样本的类标,如果有m个样本,就是m x 1的矩阵(类型必须为double)。如果类标未知,可以初始化为任意m x 1的double数组。
9 V' v. N4 [! I3 W) |-testing_instance_matrix:测试样本的特征,如果有m个样本,每个样本特征是n维,则为m x n的矩阵(类型必须为double)。
3 `/ l0 ?* X: H2 ]! n-model:使用libsvmtrain返回的模型
" @5 L4 \/ S2 J! M; b-libsvm_options:预测的参数,与训练的参数形式一样。$ n# [2 b1 W% `: H
libsvmpredict函数有三个返回值,不需要的值在Matlab可以用 ~ 进行代替。9 C9 l! T( f4 S: N
6 ^' K5 r6 f; j( p-predicted_label:第一个返回值,表示样本的预测类标号。" T1 G& M3 [8 F- s S8 n# \
-accuracy:第二个返回值,一个3 x 1的数组,表示分类的正确率、回归的均方根误差、回归的平方相关系数。
+ t- H1 w+ p/ l, `-decision_values/prob_estimates:第三个返回值,一个矩阵包含决策的值或者概率估计。对于n个预测样本、k类的问题,如果指定“-b 1”参数,则n x k的矩阵,每一行表示这个样本分别属于每一个类别的概率;如果没有指定“-b 1”参数,则为n x k*(k-1)/2的矩阵,每一行表示k(k-1)/2个二分类SVM的预测结果。
) K+ W {8 j5 q' A( i* l3. 训练的参数/ w% i5 n+ \! Q9 C# X5 K
LIBSVM训练时可以选择的参数很多,包括:2 n0 u) q0 H9 e$ h5 A; I# E- _
$ q5 G" W. i3 _ r
-s svm类型:SVM设置类型(默认0)
: m1 K6 b- D$ o( J# ~/ t) H0 — C-SVC; 1 –v-SVC; 2 – 一类SVM; 3 — e-SVR; 4 — v-SVR
( f1 c8 s+ n! {( O0 `: }+ [-t 核函数类型:核函数设置类型(默认2). L6 e# m- Z9 U" m6 P' f4 K1 W
0 – 线性核函数:u’v4 a; W& p4 ~* }7 [! o8 M7 T
1 – 多项式核函数:(r*u’v + coef0)^degree% t7 I" P5 C" \. Q$ r- x% }
2 – RBF(径向基)核函数:exp(-r|u-v|^2)
. R* o5 @, ?/ [7 u# |, O U3 – sigmoid核函数:tanh(r*u’v + coef0)
# x3 |% v, T: ^, f0 _+ B2 f-d degree:核函数中的degree设置(针对多项式核函数)(默认3)
$ K6 Q1 V3 ]! L& u' _-g r(gamma):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)(默认1/k,k为总类别数)
; O- l8 S% Y- X" w& X0 ~2 }-r coef0:核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)
$ ^& @1 G3 ~4 V, C9 `( J-c cost:设置C-SVC,e -SVR和v-SVR的参数(损失函数)(默认1)+ Q, u( l) }9 O- z
-n nu:设置v-SVC,一类SVM和v- SVR的参数(默认0.5)
3 j6 i4 u! z2 D L3 ]1 j; r, C! i-p p:设置e -SVR 中损失函数p的值(默认0.1)
0 O/ T3 U2 M G( b9 A6 [-m cachesize:设置cache内存大小,以MB为单位(默认40)- g9 @1 k# e% ~
-e eps:设置允许的终止判据(默认0.001)3 d- n3 ` C$ X
-h shrinking:是否使用启发式,0或1(默认1)
3 o9 q( ^9 [# @2 |" g- F-wi weight:设置第几类的参数C为weight*C (C-SVC中的C) (默认1)! x L) t; `% v" }- u/ o5 S
-v n: n-fold交互检验模式,n为fold的个数,必须大于等于2
) O5 \& ]; u( I3 P8 Q以上这些参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。' Z/ E2 Q" ~) a9 R. E% y
. G* {0 A% I4 }6 Z( \2 C6 Z4. 读取或保存1 x" o+ ?) B0 B& n- _
libsvmread函数可以读取以LIBSVM格式存储的数据文件。& w% V4 ^$ n! L0 ?/ F6 k
$ b* P" z: G9 i0 r$ P% `7 {/ w4 ~
[label_vector, instance_matrix] = libsvmread(‘data.txt’);, ~* H: j3 P& r5 d5 L' L* k
6 j5 r) b, `1 S1 K" h6 p- i! D
这个函数输入的是文件的名字,输出为样本的类标和对应的特征。
* B7 ~( ?; V8 o B+ U s2 i& `" U( L5 k. W8 @3 E6 C! O
libsvmwrite函数可以把Matlab的矩阵存储称为LIBSVM格式的文件。
4 `+ W9 m3 f9 N Z$ m0 k9 \5 P/ ~+ r) g- n' n# N( \6 m' P4 b3 X
libsvmwrite(‘data.txt’, label_vector, instance_matrix]
G x5 F( ]. _" d8 t; T+ M
0 Q9 X6 S0 R7 {( U, I这个函数有三个输入,分别为保存的文件名、样本的类标和对应的特征(必须为double类型的稀疏矩阵)。 |
|