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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

2 {) _; w( w) W! XLIBSVM是台湾大学林智仁(Lin Chih-Jen)教授等开发设计的一个简单、易于使用和快速有效的SVM模式识别与回归的软件包,他不但提供了编译好的可在Windows系列系统的执行文件,还提供了源代码,方便改进、修改以及在其它操作系统上应用;该软件对SVM所涉及的参数调节相对比较少,提供了很多的默认参数,利用这些默认参数可以解决很多问题;并提供了交互检验(Cross Validation)的功能。该软件可以解决C-SVM、ν-SVM、ε-SVR和ν-SVR等问题,包括基于一对一算法的多类模式识别问题。
9 h+ L* u% N; R6 k# {6 ^9 [, m: [% S: L- w
注意不是matlab自带的svm实现函数,自带的svm实现函数仅支持分类问题,不支持回归问题;而libsvm不仅支持分类问题,亦支持回归问题,参数可调节,功能更强大。. B9 P  a9 ~$ Y) X8 r7 x

) p% s( D, t+ A- D2 Nlibsvm的配置很简单,只需要下载高级版本的matlab和libsvm,VC或VS编译实现很简单的,这里就不细讲了。2 J4 d, T% p; ]
7 D/ G0 _( O3 v% B7 _( U
两个步骤:训练建模——>模型预测( H% ]7 [% u+ p: _* I8 l) |

4 U1 |- o4 I8 W0 {- M分类  model = svmtrain(trainlabel, traindata, ‘-s 0 -t 2 -c 1.2 -g 2.8’);. ^7 h3 k7 R; [5 Y% I+ ^3 w9 b7 a

4 \2 Z6 v" W( Y* d0 e回归  model = svmtrain(trainlabel, traindata, ‘-s 3 -t 2 -c 2.2 -g 2.8 -p 0.01’);
5 f" m& J, {* r  Y- Z. H5 q
' N& e7 Y6 l( h参数说明:
$ G/ |  i* O: s5 l( N
, i# u6 M% Y4 [) a" v-s svm类型:SVM设置类型(默认0)+ |+ g4 v; r& i! ]& M1 r2 E# ?
0 — C-SVC; V& j- o' z, C" Z, k# P3 [
1 –v-SVC/ H6 X. O! l4 A( W/ {
2 – 一类SVM
! {! r4 [, j( A3 — e -SVR, Z( F6 W  j- @+ b0 s6 S/ A( b& f
4 — v-SVR% m; B3 e4 ?$ k! h2 V/ ^
" T( J7 }1 U/ a
-t 核函数类型:核函数设置类型(默认2): U+ e  ^  s0 r5 q
0 – 线性:u’v
) y6 A  _* i8 A/ m: M1 – 多项式:(r*u’v + coef0)^degree) u$ w: |' e& Y8 t3 a* C4 I7 d
2 – RBF函数:exp(-r|u-v|^2)- O' b4 Z. r! u" r
3 –sigmoid:tanh(r*u’v + coef0)
3 E8 g3 M9 d; c) _: ?$ G3 X
7 t. x2 P; e6 Y( u-g r(gama):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)
* _/ Z0 b8 }. c: V" }4 P8 `0 @( b" z0 ^
-c cost:设置C-SVC,e -SVR和v-SVR的参数(损失函数)(默认1),惩罚系数
! T% ^3 H1 t+ d6 D0 M! R2 a6 F3 k) W2 W9 m# B5 e1 b
-n nu:设置v-SVC,一类SVM和v- SVR的参数(默认0.5)8 z& N: z2 F" h  I$ Z# H. F2 g

" T9 [. P3 `0 H9 _) c1 O) M# W; |-p p:设置e -SVR 中损失函数p的值(默认0.1)
: x' S& I/ _: G. f  c( z6 ^. ]  t$ P
4 _  T  c# |8 e. s3 }, W, W8 ~-d degree:核函数中的degree设置(针对多项式核函数)(默认3)
/ b, b1 ]% l( S7 u7 S" a" L, W5 j- S% u
-wi weight:设置第几类的参数C为weight*C(C-SVC中的C)(默认1)
* D: t% U5 y4 f. k8 i2 F4 f, r* A$ ~) c. l! ^/ u! o0 H5 x$ N
-v n: n-fold交互检验模式,n为fold的个数,必须大于等于26 [8 {9 N7 O- d4 z5 }6 ]

9 Y! A  f/ M$ ^" }libsvm使用误区———————-0 |7 n/ w. V9 w; L  m
. u( Y) }* g# x8 l" x5 w- o8 V
(1) 直接将训练集合和测试集合简单归一化到[0,1]区间,可能导致实验结果很差。
7 ~; Q+ P$ L. [' h& E, w9 ~3 O' f& X
(2) 如果样本的特征数非常多,那么就不必使用RBF核将样本映射到高维空间。
9 J- U( f- H9 c
- o1 [. m. I& p. ]9 ea) 在特征数非常多的情况下,使用线性核,结果已经非常好,并且只需要选择参数C即可。
" x7 P* a; k  X2 Gb) 虽然说RBF核的结果至少比线性核好,前提下搜索整个的空间。
4 U7 Q3 w. q+ m  A4 ](3) 样本数<<特征数的情况:推荐使用线性核,可以达到与RBF同样的性能。
) R( h' Z* }6 Z8 g$ u3 k
3 Y! C  m6 {7 a0 A; |" m(4) 样本数和特征数都非常多:推荐使用liblinear,更少的时间和内存,可比的准确率。5 g2 H! T7 y* D: f4 b* ?
9 M( T; m; F7 E" [+ j
(5) 样本数>>特征数:如果想使用线性模型,可以使用liblinear,并且使用-s 2参数
! a; h0 y3 o' s2 Z  y4 G( k0 i* W, \/ r: a+ U  h% ^
" n& l9 ]; F$ f
8 M7 p% Y/ ?3 n' T" G
详解:
6 h+ Y) c4 K" I! v& c: ]8 k0 ?
2 @: b! b* e. L; s7 O( c1. 训练  B) m, @- V5 H1 F) {# o+ V( a
格式:
! X/ y, V1 S# |( Zmodel = libsvmtrain(training_label_vector, training_instance_matrix [, ‘libsvm_options’]);
* I7 f6 J9 K" l9 H4 }) C1 u* b; e4 ]- o5 ]0 {# j
这个函数有三个参数,其中" I: G! O# O& n8 j6 I% z# U# \
% d  o; ~$ |* ^; D
-training_label_vector:训练样本的类标,如果有m个样本,就是m x 1的矩阵(类型必须为double)。这里可以是二分类和多分类,类标是(-1,1)、(1,2,3)或者其他任意用来表示不同的类别的数字,要转成double类型。/ r5 N2 H8 J5 d8 ]
-training_instance_matrix:训练样本的特征,如果有m个样本,每个样本特征是n维,则为m x n的矩阵(类型必须为double)。
, B& }6 C0 c! e' G- M! t-libsvm_options:训练的参数,在第3点详细介绍。
6 R! g7 s  K+ y# n% m1 }libsvmtrain函数返回训练好的SVM分类器模型model是一个结构体,包含以下成员:. S. g) D6 _, q. {) V
1 }+ ?# L& k  k
-Parameters: 一个5 x 1的矩阵,从上到下依次表示:  f+ q) @6 F" o# s9 K% R( ~1 |
-s SVM类型(默认0);
) U2 D: C, c3 S6 G' d+ y+ Y-t 核函数类型(默认2)
  F+ y: Y1 ^  A/ C) M8 J' R-d 核函数中的degree设置(针对多项式核函数)(默认3);& n( J- M" M1 b- T. u2 a2 o
-g 核函数中的r(gamma)函数设置(针对多项式/rbf/sigmoid核函数) (默认类别数目的倒数);
  V$ |( Y5 J$ W-r 核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)7 f& x5 V; x3 |& l
-nr_class: 表示数据集中有多少类别,比如二分类时这个值即为2。2 R9 _3 y# z9 }* g, g) ~" @& ?
-totalSV: 表示支持向量的总数。) S5 w  K) l) `( s! L
-rho: 决策函数wx+b中的常数项的相反数(-b)。' k6 K/ c9 k1 j% Z$ N1 n! F; l
-Label: 表示数据集中类别的标签,比如二分类常见的1和-1。
7 I2 m: y- i9 A/ y6 _$ m-ProbA: 使用-b参数时用于概率估计的数值,否则为空。% ^" e" c: r6 x
-ProbB: 使用-b参数时用于概率估计的数值,否则为空。
! a3 y6 K' V1 a7 R) X. k/ ~-nSV: 表示每类样本的支持向量的数目,和Label的类别标签对应。如Label=[1; -1],nSV=[63; 67],则标签为1的样本有63个支持向量,标签为-1的有67个。# M/ J5 d& k# }: |
-sv_coef: 表示每个支持向量在决策函数中的系数。! u. W0 C2 w4 k& I& Z
-SVs: 表示所有的支持向量,如果特征是n维的,支持向量一共有m个,则为m x n的稀疏矩阵。8 u4 q" P3 s* U1 \$ n/ `, v
另外,如果在训练中使用了-v参数进行交叉验证时,返回的不是一个模型,而是交叉验证的分类的正确率或者回归的均方根误差。
5 g8 A1 v1 N& }; ]6 r+ E
3 s' i. Z$ r$ C6 T, d) x* E. @当构建完成model后,还要为上述参数选择合适的值,方法主要有Gridsearch,其他的感觉不常用,Gridsearch说白了就是穷举。
+ X0 G* N2 w, z+ }- F, I
8 E7 P' g) f+ d1 x
9 a# d4 H3 B. L8 G  d" ?& x1 S5 t/ o" }# k, ^; e( F! X! S  r$ E
网格参数寻优函数(分类问题):SVMcgForClass
$ e# }1 h6 b8 c! e! X2 s# _3 N. t+ A7 g0 m& f. h
[bestCVaccuracy,bestc,bestg]=SVMcgForClass(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,accstep); g) ^1 D2 }8 `( ^

; M( C+ \: g( N, O3 C& x3 L; d输入:, O( |: c7 X5 Y; O# }% O* _" M: n
; g9 R' m! W: X) |/ ]8 x! l" T- o4 N
train_label:训练集的标签,格式要求与svmtrain相同。
9 Z) k: z3 [* i, c( D, l$ ~! J# _train:训练集,格式要求与svmtrain相同。  w& h# t4 L; s) i: m
cmin,cmax:惩罚参数c的变化范围,即在[2^cmin,2^cmax]范围内寻找最佳的参数c,默认值为cmin=-8,cmax=8,即默认惩罚参数c的范围是[2^(-8),2^8]。
4 A% l. n3 _0 ^3 j4 S$ |gmin,gmax:RBF核参数g的变化范围,即在[2^gmin,2^gmax]范围内寻找最佳的RBF核参数g,默认值为gmin=-8,gmax=8,即默认RBF核参数g的范围是[2^(-8),2^8]。$ w+ [% x# y3 z& d& j& C
v:进行Cross Validation过程中的参数,即对训练集进行v-fold Cross Validation,默认为3,即默认进行3折CV过程。' o3 e) s4 [) m5 q3 a
cstep,gstep:进行参数寻优是c和g的步进大小,即c的取值为2^cmin,2^(cmin+cstep),…,2^cmax,,g的取值为2^gmin,2^(gmin+gstep),…,2^gmax,默认取值为cstep=1,gstep=1。
" h, B& M- Z: ?( B/ p. ?accstep:最后参数选择结果图中准确率离散化显示的步进间隔大小([0,100]之间的一个数),默认为4.5。
) R1 I( E0 a" f6 D9 ]输出:
1 F( M4 V7 [  N  U9 N4 Y' p
& ?7 ]% l- J$ \7 qbestCVaccuracy:最终CV意义下的最佳分类准确率。
3 t3 O/ T# ?. p% ^4 d7 f$ _6 R2 A7 Zbestc:最佳的参数c。9 D) k4 ~4 C+ y8 V7 a
bestg:最佳的参数g。( X$ K1 ~+ w! Y, y3 C1 W2 A2 q. A
9 r8 B+ r( f" l) c, n- A& f  B

, c. B+ @1 c1 y/ B网格参数寻优函数(回归问题):SVMcgForRegress
) W& u5 |. V- Y, n# \/ t9 T6 n1 S2 }3 t( s
[bestCVmse,bestc,bestg]=SVMcgForRegress(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,msestep)
+ w7 v* g+ ~- ?. V. c* i7 x6 S( I: H% T2 e) O, [
其输入输出与SVMcgForClass类似,这里不再赘述。
! E# J0 @8 V+ U* F
  x  ?& H4 S1 \3 c. u+ nSVM 怎样能得到好的结果
: y1 t5 h$ \- L0 l* q; o2 M; B! `# s3 h4 ?
1.   对数据做归一化(simple scaling)4 t# R0 G) ?  J. [: J7 W3 d4 j
( m7 B- h1 J/ @: g* i
2.   应用 RBF kernel
) l% N$ r" Y  W2 I0 Z% Z" T' F3 n8 ?  R( z& O$ B- ~& d$ U2 Q
3.   用cross-validation和grid-search 得到最优的c和g
4 i0 n5 }0 w3 q$ z# c$ T2 |0 B
" ]( T9 O6 y( g* b4.   用得到的最优c和g训练训练数据/ Y& M3 C* S7 j# S
% a6 W. Y, }& A
5.   测试
( u0 h& t2 F9 [3 i) }
6 f9 L, H: F+ a- ~
6 R0 s. U/ [1 w: o
& B7 r6 d7 D+ a# z! u& w关于svm的C以及核函数参数设置———————-0 y' t6 g9 s" F" t* b- L& r4 f

/ i# Y7 C) `( L* o, lC一般可以选择为:10^t , t=- 4..4就是0.0001 到10000" D8 j: t+ F, {

, ^2 }% l5 Y" ]! E4 |选择的越大,表示对错误例惩罚程度越大,可能会导致模型过拟合
, I" \% g4 a0 I0 D3 n  O- j0 I, b" b4 c

) @/ Y( `. M" T, f" t4 p( Q+ K
9 ~3 W% ~! j3 {/ A在LIBSVM中-t用来指定核函数类型(默认值是2)。5 f; ?2 u2 G- X* }9 ~; \

0 ]1 t' \0 ?7 d0)线性核函数
; m# T$ T# o3 B% x
- O( N5 T# O7 L2 N(无其他参数)# C% v& ~) d8 N
6 M; x* N+ r! l" g' R4 L: i% _
1)多项式核函数# d- b- Z  I, O) B" V7 H
, C0 X& \; y( P* ^* O. J7 r
(重点是阶数的选择,即d,一般选择1-11:1 3 5 7 9 11,也可以选择2,4,6…)9 g/ _; @! i  }0 h. N1 p) W$ p

: u6 Q9 z* \) ~. @2)RBF核函数2 A9 L# F4 q; X% d
: G: k: m; g  B3 Y& a; s
(径向基RBF内核,exp{-|xi-xj|^2/均方差},其中均方差反映了数据波动的大小。5 W: \# f+ C! g: L& G

, J) M5 E3 U1 ]2 q# G  L参数通常可选择下面几个数的倒数:0.1 0.2 0.4 0.6 0.8 1.6 3.2 6.4 12.8,默认的是类别数的倒数,即1/k,2分类的话就是0.5)
# b4 q( x3 w* [1 V$ E
1 q; k( X! |8 H5 h6 @+ b8 j' V3)sigmoid核函数 又叫做S形内核
  }. C! U# e2 I7 B: v$ N- @& e$ a# ^' p4 a7 p* {# A
两个参数g以及r:g一般可选1 2 3 4,r选0.2 0.4 0.60.8 1, h; Z# E, m7 b5 M2 S+ N* t. `9 [$ d
! y0 M" l( \# ~  L* h, ~7 V4 @
4)自定义核函数: [8 |3 j0 y* b. Y. k

5 h( D0 ~. u/ o4 p$ [; @0 ~ ( i7 y2 ^9 Y6 L5 L; z3 Y" J: i9 ?6 J

# Z5 t6 V3 s( j: b( S与核函数相对应的libsvm参数:) H. @6 Q2 {* h# P% R0 w
  H# s; l- X& {* P2 Q1 N
1)对于线性核函数,没有专门需要设置的参数* |6 G4 G+ W) x, r5 P  b
) O7 Z  x( z3 a. {3 b' E
2)对于多项式核函数,有三个参数。-d用来设置多项式核函数的最高此项次数,也就是公式中的d,默认值是3。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/k(k是类别数)。-r用来设置核函数中的coef0,也就是公式中的第二个r,默认值是0。. ~! @7 U5 L; `
; X5 u( |# Z4 h3 o
3)对于RBF核函数,有一个参数。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/k(k是类别数)。4 [% O" i; f9 T
/ r, X9 f+ C  ^4 f4 P: \0 x* B
4)对于sigmoid核函数,有两个参数。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/k(k是类别数)。-r用来设置核函数中的coef0,也就是公式中的第二个r,默认值是0。
: ^- a& P" F- I# i. G4 O: O8 ~' l2 f4 ?& O6 x( H+ l
2. 预测
4 K% z$ s) o5 j8 u3 S( V格式:
* b/ I, V- S$ f/ `2 p: U1 M[predicted_label, accuracy, decision_values/prob_estimates]8 l& T: o6 e0 Z
= libsvmpredict(testing_label_vector, testing_instance_matrix, model [, ‘libsvm_options’]);. N# _% Y: G2 v7 r- Z. V
: {9 N# B9 q6 C/ L0 S5 B7 G: @
这个函数包括四个参数,其中
2 [: K) l6 N1 g) ~" S5 \. \
+ a7 [$ y4 R) M7 r-testing_label_vector:测试样本的类标,如果有m个样本,就是m x 1的矩阵(类型必须为double)。如果类标未知,可以初始化为任意m x 1的double数组。& J1 P9 y. Q* Z7 ]! v4 ?! f8 J3 x
-testing_instance_matrix:测试样本的特征,如果有m个样本,每个样本特征是n维,则为m x n的矩阵(类型必须为double)。0 N2 R! i( I- l$ V
-model:使用libsvmtrain返回的模型$ L/ l/ Q7 \# z3 N
-libsvm_options:预测的参数,与训练的参数形式一样。- p1 @# w$ X. a& t
libsvmpredict函数有三个返回值,不需要的值在Matlab可以用 ~ 进行代替。7 `8 M0 d' U" e4 e& U3 Z
$ A+ |. a2 t6 Z* _
-predicted_label:第一个返回值,表示样本的预测类标号。
# F7 u$ p" H9 `/ ~9 e, B, m. G-accuracy:第二个返回值,一个3 x 1的数组,表示分类的正确率、回归的均方根误差、回归的平方相关系数。! S: X; [. o8 [5 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的预测结果。
/ f  ?( y! E! R, S7 _, R; T3. 训练的参数2 @8 B8 O+ v+ F7 p
LIBSVM训练时可以选择的参数很多,包括:
5 |* I3 {8 O( O% z( m/ ?/ L6 T, Q- ?- V6 B& L
-s svm类型:SVM设置类型(默认0)% g* R8 M, k8 I
0 — C-SVC; 1 –v-SVC; 2 – 一类SVM; 3 — e-SVR; 4 — v-SVR5 r2 S  P; T9 w& C9 g- w. ?
-t 核函数类型:核函数设置类型(默认2)
8 k0 U* D& a! Z$ p0 – 线性核函数:u’v
# R3 V* g) P4 ~4 u# o7 y" N7 u: X1 – 多项式核函数:(r*u’v + coef0)^degree' Y  }; g1 ?  I% W
2 – RBF(径向基)核函数:exp(-r|u-v|^2)
% W( y6 w8 v) Q9 X) ?1 C3 – sigmoid核函数:tanh(r*u’v + coef0)
2 y# P& R6 ]; f7 T-d degree:核函数中的degree设置(针对多项式核函数)(默认3)$ l# Z+ L4 r6 ]) k
-g r(gamma):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)(默认1/k,k为总类别数)4 ]# r! Q9 q" A, V4 K: J0 T3 K3 P
-r coef0:核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)
/ p3 J: J% f) c) y  r-c cost:设置C-SVC,e -SVR和v-SVR的参数(损失函数)(默认1)
& T5 B0 |: s7 \( ?$ l4 i-n nu:设置v-SVC,一类SVM和v- SVR的参数(默认0.5)
8 M# N) Y, @, t8 q) _-p p:设置e -SVR 中损失函数p的值(默认0.1)9 ]1 y/ T& _) f+ @+ m9 k) y! F. h' o
-m cachesize:设置cache内存大小,以MB为单位(默认40)8 r! h8 `9 K* k. _  k: {
-e eps:设置允许的终止判据(默认0.001)" s1 |, \! W- d# G) h+ v: d: D
-h shrinking:是否使用启发式,0或1(默认1)+ Q' e+ J* [) z( h' e# A  A" Z" c
-wi weight:设置第几类的参数C为weight*C (C-SVC中的C) (默认1)1 I* r# q0 J8 l% u" a
-v n: n-fold交互检验模式,n为fold的个数,必须大于等于2) ?$ r$ }7 k% S
以上这些参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。
: O+ T; v* r, L5 `  L0 f( [5 j4 W
! Y/ {/ e6 D* D4. 读取或保存
5 E/ V+ C9 J* |; V8 G' {8 @! Tlibsvmread函数可以读取以LIBSVM格式存储的数据文件。+ _5 g% t6 j4 B7 \% u0 r

( F) n7 [- W% }: M. c8 j1 s[label_vector, instance_matrix] = libsvmread(‘data.txt’);
1 N1 \+ h; v: e* O& Y, W; S* L/ g# w/ {# d! |
这个函数输入的是文件的名字,输出为样本的类标和对应的特征。
! \4 u$ `) R5 f4 _8 K3 `9 A( d
# ^) w( v4 p! ]/ t3 E) Plibsvmwrite函数可以把Matlab的矩阵存储称为LIBSVM格式的文件。
) U, D" P4 ?  K9 J1 Z: G9 d2 ]/ z+ l- D. I6 s
libsvmwrite(‘data.txt’, label_vector, instance_matrix]
% R; o" Z1 E- V
& d' j+ L! a8 o+ m/ u+ [这个函数有三个输入,分别为保存的文件名、样本的类标和对应的特征(必须为double类型的稀疏矩阵)。

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-22 13:51 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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