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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
5 J# h5 B+ p9 T- E# Z$ e) ?9 q
LIBSVM是台湾大学林智仁(Lin Chih-Jen)教授等开发设计的一个简单、易于使用和快速有效的SVM模式识别与回归的软件包,他不但提供了编译好的可在Windows系列系统的执行文件,还提供了源代码,方便改进、修改以及在其它操作系统上应用;该软件对SVM所涉及的参数调节相对比较少,提供了很多的默认参数,利用这些默认参数可以解决很多问题;并提供了交互检验(Cross Validation)的功能。该软件可以解决C-SVM、ν-SVM、ε-SVR和ν-SVR等问题,包括基于一对一算法的多类模式识别问题。" Q8 U8 x3 i3 a+ F$ O0 m3 Y

$ x. y) z) J8 U% R' L注意不是matlab自带的svm实现函数,自带的svm实现函数仅支持分类问题,不支持回归问题;而libsvm不仅支持分类问题,亦支持回归问题,参数可调节,功能更强大。3 o* j% o9 D8 a# Z; u* g3 R
" F+ y  x# u  y$ t* |
libsvm的配置很简单,只需要下载高级版本的matlab和libsvm,VC或VS编译实现很简单的,这里就不细讲了。2 j, }! T) i: a! |! U* |/ n: _& V
9 P$ C/ S' T, @
两个步骤:训练建模——>模型预测* `' Q- }, J( R% y+ O" y
( _- k3 |3 Y0 H9 M" W  Z, H
分类  model = svmtrain(trainlabel, traindata, ‘-s 0 -t 2 -c 1.2 -g 2.8’);6 `# _# q: j2 m$ L& u
" [! ?& M$ `* ?
回归  model = svmtrain(trainlabel, traindata, ‘-s 3 -t 2 -c 2.2 -g 2.8 -p 0.01’);
/ P( g# @6 E  ^" @
* _+ P5 I! {( I( b$ m参数说明:
, _  A7 y; E* m# @9 Y% I( M- i2 K- J# r  A+ S5 P
-s svm类型:SVM设置类型(默认0)5 Z# u( t& s( A" k' t
0 — C-SVC6 o5 p/ P- G! w
1 –v-SVC0 T+ \$ J7 e/ Y4 f- I4 j) G
2 – 一类SVM
7 A' g6 }4 z1 a% u- O3 — e -SVR
$ l; l0 Q  x* y( F$ B4 — v-SVR1 O2 C# h( e: F: H( }. R

" v9 E& e' ]: i8 v; L* m9 m-t 核函数类型:核函数设置类型(默认2)/ [8 ^. \. E  {& Q" r( Q- _7 _; m3 n  x
0 – 线性:u’v) P/ s6 ^% z( t& b
1 – 多项式:(r*u’v + coef0)^degree
( y' D/ m5 C/ N( s: e* q% J2 – RBF函数:exp(-r|u-v|^2)4 q. f( I* U8 d- V
3 –sigmoid:tanh(r*u’v + coef0)7 y% r/ \: C$ T( e' A* q
& I( R) ^6 V9 e6 \! \
-g r(gama):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)6 n$ f2 p, H8 d
! Y8 y; I" L. D
-c cost:设置C-SVC,e -SVR和v-SVR的参数(损失函数)(默认1),惩罚系数
/ L, [7 J9 m1 w" Q2 E( A$ [0 u. x9 w/ ~' \$ o7 p. ?8 V
-n nu:设置v-SVC,一类SVM和v- SVR的参数(默认0.5)
/ V6 g# [( X' H1 I) u: [& H- R  d/ B3 T- i9 A
-p p:设置e -SVR 中损失函数p的值(默认0.1)3 T/ J# r$ z. ~8 S/ U: U. j

& G' [+ \2 Y4 w2 Z) }& n% u4 ?-d degree:核函数中的degree设置(针对多项式核函数)(默认3)
5 b' i) J4 Y( M2 [0 y+ h$ O; `# x4 @! c' a0 H1 W- r4 `
-wi weight:设置第几类的参数C为weight*C(C-SVC中的C)(默认1)
8 k& P' v1 Z: S6 R
* W0 A9 B% ^2 B2 o8 @7 @) V( ?( @-v n: n-fold交互检验模式,n为fold的个数,必须大于等于2
  C: t+ F4 z( L# W1 z7 b1 b
' Y/ w$ K# e- n0 blibsvm使用误区———————-* r2 z& S6 A( I4 F# n9 @: ^- |
8 |/ I- U5 F5 K& ~/ ]4 k! j
(1) 直接将训练集合和测试集合简单归一化到[0,1]区间,可能导致实验结果很差。
& v) B' F% b7 e. A2 @8 V
) b. \& ~6 u# q$ J- k(2) 如果样本的特征数非常多,那么就不必使用RBF核将样本映射到高维空间。
) n5 g9 Q5 Y" N& Y; o2 ~( ~3 [* h7 p% z$ J: Q
a) 在特征数非常多的情况下,使用线性核,结果已经非常好,并且只需要选择参数C即可。
# c( h* B2 D' ~* Qb) 虽然说RBF核的结果至少比线性核好,前提下搜索整个的空间。' z) j- F* p' n/ q& m" a/ c
(3) 样本数<<特征数的情况:推荐使用线性核,可以达到与RBF同样的性能。" I9 S6 w8 M. Z% ]3 w
* R+ t; }# h  ~& X+ p; G
(4) 样本数和特征数都非常多:推荐使用liblinear,更少的时间和内存,可比的准确率。0 M6 ]1 K9 L0 w

/ q4 ]! {0 J0 f2 f9 J(5) 样本数>>特征数:如果想使用线性模型,可以使用liblinear,并且使用-s 2参数
3 T- ~, m. K5 A. H
( S5 _2 A7 e: T3 P/ ` 7 _5 \8 }( f* W" {$ q8 c

+ [2 E% y# x4 e% c5 }' F4 H详解:, Y3 k6 u5 ?1 R0 ~+ p) I/ H
* q6 E- k9 m4 R. h9 w" i0 j! M7 G
1. 训练) L8 o" s! W; O( }( v! U
格式:* H0 r0 O( E3 ~- g* [5 k5 ]/ l
model = libsvmtrain(training_label_vector, training_instance_matrix [, ‘libsvm_options’]);1 A  W- m2 T* o6 s2 a

' _+ l. y. j0 M4 X4 b6 V这个函数有三个参数,其中
: D1 v1 c. g# A2 h7 {1 E! m" U) w9 o
. h0 a. w7 T" N" W; p  i$ ?" G-training_label_vector:训练样本的类标,如果有m个样本,就是m x 1的矩阵(类型必须为double)。这里可以是二分类和多分类,类标是(-1,1)、(1,2,3)或者其他任意用来表示不同的类别的数字,要转成double类型。1 P$ r1 M2 o. J$ g* `: n' ]
-training_instance_matrix:训练样本的特征,如果有m个样本,每个样本特征是n维,则为m x n的矩阵(类型必须为double)。
5 g4 P' T) p/ g4 M$ O-libsvm_options:训练的参数,在第3点详细介绍。; {3 F  y2 ^' U2 L- ?# H
libsvmtrain函数返回训练好的SVM分类器模型model是一个结构体,包含以下成员:4 J6 s: N9 l. o: n' D8 [3 l

% A! P0 A: V9 H/ a-Parameters: 一个5 x 1的矩阵,从上到下依次表示:
% v) Z0 \4 T( v6 n- v-s SVM类型(默认0);' Q( c) u% n2 ~3 {: P
-t 核函数类型(默认2)4 d7 N' L  ~3 p3 B3 W+ K
-d 核函数中的degree设置(针对多项式核函数)(默认3);  w- P% R2 I- k& w
-g 核函数中的r(gamma)函数设置(针对多项式/rbf/sigmoid核函数) (默认类别数目的倒数);) @& X4 s9 j* ?, {8 c
-r 核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)
. r  A1 Q: X7 f* F/ t8 N0 f4 B-nr_class: 表示数据集中有多少类别,比如二分类时这个值即为2。7 L* B' b+ S- t' G* B
-totalSV: 表示支持向量的总数。
1 V6 w: v0 v: w+ I4 X2 g$ m-rho: 决策函数wx+b中的常数项的相反数(-b)。8 g5 [" V6 j2 C  `" @1 Y9 q
-Label: 表示数据集中类别的标签,比如二分类常见的1和-1。
* k' C. S3 R) V9 l# \$ o" q+ B-ProbA: 使用-b参数时用于概率估计的数值,否则为空。" B; q* x1 F5 q1 E2 L" j
-ProbB: 使用-b参数时用于概率估计的数值,否则为空。
$ E9 }, c5 x6 k4 G5 H-nSV: 表示每类样本的支持向量的数目,和Label的类别标签对应。如Label=[1; -1],nSV=[63; 67],则标签为1的样本有63个支持向量,标签为-1的有67个。( W  A! {: N2 Y! V; c. x
-sv_coef: 表示每个支持向量在决策函数中的系数。* f' _+ e# S, w3 z3 Y, J- I; j* K* z
-SVs: 表示所有的支持向量,如果特征是n维的,支持向量一共有m个,则为m x n的稀疏矩阵。" ?( U6 f# U' L6 t( I  }  @
另外,如果在训练中使用了-v参数进行交叉验证时,返回的不是一个模型,而是交叉验证的分类的正确率或者回归的均方根误差。+ }0 b$ T; B3 c- v- J

6 L3 L1 _/ L4 k" \当构建完成model后,还要为上述参数选择合适的值,方法主要有Gridsearch,其他的感觉不常用,Gridsearch说白了就是穷举。5 z) h/ P  x7 E( T& P7 r4 g9 ^
% L) \4 k, c& r$ U+ O4 `) F
/ Z; M, G: t& V0 G" E/ ^' f

/ d' x( r& e1 u6 Q: _) i网格参数寻优函数(分类问题):SVMcgForClass* N, K" g8 j: N" M8 X( ?
: N- g, l* _2 m8 y0 `4 z" u! I  t
[bestCVaccuracy,bestc,bestg]=SVMcgForClass(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,accstep)
; K+ ^! D# o! }- I2 n
2 {& f) Q" Z% X8 t6 x4 ?输入:
9 b3 h5 ]/ J0 M) f" H0 s5 W/ p/ l0 O6 d* z" u' |
train_label:训练集的标签,格式要求与svmtrain相同。
4 K' r' |" T) c% }: H9 Atrain:训练集,格式要求与svmtrain相同。! D3 Z- k. q/ G$ J7 \  s
cmin,cmax:惩罚参数c的变化范围,即在[2^cmin,2^cmax]范围内寻找最佳的参数c,默认值为cmin=-8,cmax=8,即默认惩罚参数c的范围是[2^(-8),2^8]。  X: G" C* V; ~/ z4 K
gmin,gmax:RBF核参数g的变化范围,即在[2^gmin,2^gmax]范围内寻找最佳的RBF核参数g,默认值为gmin=-8,gmax=8,即默认RBF核参数g的范围是[2^(-8),2^8]。
7 ^" E0 i, Z+ g6 o$ S& ^v:进行Cross Validation过程中的参数,即对训练集进行v-fold Cross Validation,默认为3,即默认进行3折CV过程。9 h" D; K8 K! M
cstep,gstep:进行参数寻优是c和g的步进大小,即c的取值为2^cmin,2^(cmin+cstep),…,2^cmax,,g的取值为2^gmin,2^(gmin+gstep),…,2^gmax,默认取值为cstep=1,gstep=1。
; b, L2 G: A& c. d+ f( q- maccstep:最后参数选择结果图中准确率离散化显示的步进间隔大小([0,100]之间的一个数),默认为4.5。2 r3 Y2 ?* ?) z2 `, Q# [, [; c
输出:& o, f6 o& Q8 C' f7 e
9 t# C6 I9 n: y; z
bestCVaccuracy:最终CV意义下的最佳分类准确率。+ Y6 l- ]5 m# @* [
bestc:最佳的参数c。
& T2 U: P" E- kbestg:最佳的参数g。  d9 ?; [* E4 F/ |* G1 z
5 O3 i: l$ h. b: E& D! b& d
/ i* Z8 [  N. V5 R: y
网格参数寻优函数(回归问题):SVMcgForRegress
6 x5 A, y0 V- E% w! Z% j0 R$ N4 g
& m4 ]' N0 x( C7 s. B% m[bestCVmse,bestc,bestg]=SVMcgForRegress(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,msestep)0 X7 v: ?" u! V3 }
- Y; N0 }  W9 V2 \: @. N; t3 ?
其输入输出与SVMcgForClass类似,这里不再赘述。
$ Y/ }2 F: u9 G- ?$ K6 l9 ^; C6 W. u; |9 p2 U2 e
SVM 怎样能得到好的结果
/ b- Y* J/ W$ h, j/ c, A
3 ^9 V, i" d, e* j- j" ^1.   对数据做归一化(simple scaling)' d( X' ]" A* ]  e  @- U
$ L/ {5 E5 ~$ t. W. e' z$ T, V
2.   应用 RBF kernel
6 g  b+ F3 Z$ D3 \! _
) h/ q% q) d% {3.   用cross-validation和grid-search 得到最优的c和g
/ [6 y+ Z2 {* ~
( y- E% Q7 G: I7 ^- G4.   用得到的最优c和g训练训练数据( C7 z1 |' U) o! b  c2 T; B

* t, D+ y7 j( d: T% H5.   测试
4 W# F* e! @/ {6 s4 _- f- W  `" ^" y! S% M
  u0 h. y; A$ H* O/ p" ~
- z9 p6 N- i& }9 U. ~1 d4 F0 S5 M
关于svm的C以及核函数参数设置———————-
5 i  m. y4 V2 V# `" ]$ E3 C5 ^/ }6 K+ x
C一般可以选择为:10^t , t=- 4..4就是0.0001 到10000
- ]- X4 s7 h4 y' p6 `, x; [
! f4 C0 V# {* d. e/ E3 P选择的越大,表示对错误例惩罚程度越大,可能会导致模型过拟合/ ^9 K6 d4 M; Z# B

7 d1 }9 m4 f' f2 B/ x1 B. `
2 U1 S2 k% Z' J& b1 r" i4 x5 K0 P5 e
在LIBSVM中-t用来指定核函数类型(默认值是2)。0 Z" |) B0 t6 ~& d* B, |; E
( h6 Q# Y( c, k; d/ |4 M
0)线性核函数
: \2 g9 ^+ y$ }& Q% l: S/ |: X" d- P& f/ W8 K1 x
(无其他参数)) s: s5 v9 Z+ Q7 J
+ F; T: s2 C7 g) R9 w( B$ v8 o
1)多项式核函数
& P! B( V9 m* G! k  x: x( Q
1 p6 z% g( Y& S+ G(重点是阶数的选择,即d,一般选择1-11:1 3 5 7 9 11,也可以选择2,4,6…)
0 k8 C: ^2 M# J: L; I0 h! Y. g! r/ z( u& N6 k3 L' j' n: a6 Z
2)RBF核函数) I& g# k0 f1 `" M& R1 v" N- ?. j

* T6 F. k% h6 y% d! _8 f9 v8 `3 s. ](径向基RBF内核,exp{-|xi-xj|^2/均方差},其中均方差反映了数据波动的大小。
1 C- a6 q9 L7 \  p4 D3 V" g
" g! F7 m4 y9 u+ N7 W5 X参数通常可选择下面几个数的倒数:0.1 0.2 0.4 0.6 0.8 1.6 3.2 6.4 12.8,默认的是类别数的倒数,即1/k,2分类的话就是0.5)
7 \" {8 g5 R9 {
0 _0 x1 p4 f" H7 B' B3)sigmoid核函数 又叫做S形内核$ q  x- U; S7 h' J0 C
9 Q( m5 |; E; B! h
两个参数g以及r:g一般可选1 2 3 4,r选0.2 0.4 0.60.8 1: d8 x( n. \6 i0 W) F! W

5 d, j% Z3 e; ?1 J4)自定义核函数
) A/ G! r. b: `$ B/ |6 I) k7 p+ Q0 B2 ~& ~2 e4 W
, {, z+ I" t5 c, D' u4 f

  G) ~0 a" f" I3 w9 [  u与核函数相对应的libsvm参数:4 x' K& b( r- m- b  f
: B. r; i9 i8 N, B. {( [% H( T8 y
1)对于线性核函数,没有专门需要设置的参数, M+ A: e, f' d# O7 A
. V, i) v3 x1 V* j
2)对于多项式核函数,有三个参数。-d用来设置多项式核函数的最高此项次数,也就是公式中的d,默认值是3。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/k(k是类别数)。-r用来设置核函数中的coef0,也就是公式中的第二个r,默认值是0。9 N1 p: w$ k* W! W! j* a8 i/ R
) S6 N+ l% R7 O% E9 e* c
3)对于RBF核函数,有一个参数。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/k(k是类别数)。
  n# G: P. I6 `2 n2 G
7 ]. s4 Q8 G7 Q$ E$ a* a4)对于sigmoid核函数,有两个参数。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/k(k是类别数)。-r用来设置核函数中的coef0,也就是公式中的第二个r,默认值是0。1 }5 @: O  y  q! r% o+ N8 [

# S& t+ K/ Q) v, R! I. M2. 预测/ B" e9 P9 e( Z3 H* {5 o
格式:+ d1 k0 M( x9 }% F& u" w. X
[predicted_label, accuracy, decision_values/prob_estimates]
* z; v( t; W; m7 f( [= libsvmpredict(testing_label_vector, testing_instance_matrix, model [, ‘libsvm_options’]);7 B$ i& F1 ~# S) q" j
$ i  Q; H( w1 q& i4 z* ^
这个函数包括四个参数,其中
( D* o% e) D' U( o4 U+ r/ U, }
-testing_label_vector:测试样本的类标,如果有m个样本,就是m x 1的矩阵(类型必须为double)。如果类标未知,可以初始化为任意m x 1的double数组。& ~1 n2 L2 b4 \3 Y
-testing_instance_matrix:测试样本的特征,如果有m个样本,每个样本特征是n维,则为m x n的矩阵(类型必须为double)。
  S8 K+ L4 t9 I) \" S% \; r7 J- L-model:使用libsvmtrain返回的模型  H4 Q7 N( H9 W- s6 Y. l6 i5 K
-libsvm_options:预测的参数,与训练的参数形式一样。
1 n- b/ r( A- t) y/ W6 w* X$ k) ilibsvmpredict函数有三个返回值,不需要的值在Matlab可以用 ~ 进行代替。5 S' u1 t5 q" }

0 m% V% e" X8 N6 D" e) ~& ~1 A+ r-predicted_label:第一个返回值,表示样本的预测类标号。  U9 ~3 s, m4 ^' P  `2 y. V. U
-accuracy:第二个返回值,一个3 x 1的数组,表示分类的正确率、回归的均方根误差、回归的平方相关系数。6 e4 H1 d+ W; K5 K% K, N; |
-decision_values/prob_estimates:第三个返回值,一个矩阵包含决策的值或者概率估计。对于n个预测样本、k类的问题,如果指定“-b 1”参数,则n x k的矩阵,每一行表示这个样本分别属于每一个类别的概率;如果没有指定“-b 1”参数,则为n x k*(k-1)/2的矩阵,每一行表示k(k-1)/2个二分类SVM的预测结果。) _' Y# r, r$ P/ w; h
3. 训练的参数3 T, ^& T/ W! D! o' ~% \
LIBSVM训练时可以选择的参数很多,包括:
0 S) y# W3 W; J. v1 G) W5 O3 o/ `  ]- L& F: i
-s svm类型:SVM设置类型(默认0)
+ A; l2 x: l9 }# s: b& H& d0 — C-SVC; 1 –v-SVC; 2 – 一类SVM; 3 — e-SVR; 4 — v-SVR
% w6 ~" T2 A7 O-t 核函数类型:核函数设置类型(默认2)
  V! H8 b$ k5 C5 ^0 i0 – 线性核函数:u’v
7 ]1 F; b; N; c' B1 Q8 ^1 f& Q1 – 多项式核函数:(r*u’v + coef0)^degree
5 q8 u# s  p5 u( j' C2 – RBF(径向基)核函数:exp(-r|u-v|^2)3 f" o3 J& I7 ~; }3 J) o
3 – sigmoid核函数:tanh(r*u’v + coef0)
0 x6 }/ l& V, E& c9 F; k1 R-d degree:核函数中的degree设置(针对多项式核函数)(默认3)' X7 }4 u) z! m; D# Y
-g r(gamma):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)(默认1/k,k为总类别数). e. M0 {' H; p0 @
-r coef0:核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)& j7 `3 v9 W  |% L3 w' m1 ]! g3 k
-c cost:设置C-SVC,e -SVR和v-SVR的参数(损失函数)(默认1)& s. g. D6 ?- N, t* l
-n nu:设置v-SVC,一类SVM和v- SVR的参数(默认0.5)2 R  u! C1 C$ f7 z) |$ G
-p p:设置e -SVR 中损失函数p的值(默认0.1)
& E& b: Q, k1 z8 `0 A-m cachesize:设置cache内存大小,以MB为单位(默认40)8 ~/ W* a3 z! Q: m
-e eps:设置允许的终止判据(默认0.001)
/ H' U. W4 y$ s-h shrinking:是否使用启发式,0或1(默认1)
% U* o2 Y( W% @0 w8 m( q-wi weight:设置第几类的参数C为weight*C (C-SVC中的C) (默认1)3 z1 S2 t, @) U7 u# T7 H  i
-v n: n-fold交互检验模式,n为fold的个数,必须大于等于2; g5 Q/ u. I5 x( P* p
以上这些参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。; y: m0 C5 v# Y/ }' s/ T# }

" P* A5 I& C1 _5 H# K6 n5 E) j6 |5 t4. 读取或保存% f( m9 ?' d- o, m  U1 y# Z9 a
libsvmread函数可以读取以LIBSVM格式存储的数据文件。
( O5 N+ a; U/ C  ~' Z* z- f# N) @/ C
[label_vector, instance_matrix] = libsvmread(‘data.txt’);2 @/ T: y9 v$ c( l% S
8 f0 ?* K+ F# ^+ u+ M. k$ f7 ], m
这个函数输入的是文件的名字,输出为样本的类标和对应的特征。9 O% l5 p- S$ f6 f: e9 Q
% U4 X% t2 Y- Y
libsvmwrite函数可以把Matlab的矩阵存储称为LIBSVM格式的文件。
1 X8 B; V# C; L8 L5 @
4 M% Q  U2 ]  n: G$ @1 `$ Qlibsvmwrite(‘data.txt’, label_vector, instance_matrix]: [' F: w; O. D+ c

  O2 Z; m$ R/ f; W& C* U) N这个函数有三个输入,分别为保存的文件名、样本的类标和对应的特征(必须为double类型的稀疏矩阵)。

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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