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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

! g  Q2 M9 H$ f9 CLIBSVM是台湾大学林智仁(Lin Chih-Jen)教授等开发设计的一个简单、易于使用和快速有效的SVM模式识别与回归的软件包,他不但提供了编译好的可在Windows系列系统的执行文件,还提供了源代码,方便改进、修改以及在其它操作系统上应用;该软件对SVM所涉及的参数调节相对比较少,提供了很多的默认参数,利用这些默认参数可以解决很多问题;并提供了交互检验(Cross Validation)的功能。该软件可以解决C-SVM、ν-SVM、ε-SVR和ν-SVR等问题,包括基于一对一算法的多类模式识别问题。
7 `9 n! N5 c5 O2 M2 v& O
2 [8 |) x0 y5 y0 |: n* u; Z注意不是matlab自带的svm实现函数,自带的svm实现函数仅支持分类问题,不支持回归问题;而libsvm不仅支持分类问题,亦支持回归问题,参数可调节,功能更强大。$ ~9 |# F. w: r8 o/ p

1 ?( x* u* t* glibsvm的配置很简单,只需要下载高级版本的matlab和libsvm,VC或VS编译实现很简单的,这里就不细讲了。& e6 C/ {8 }! {# M! m" c
) l% I7 V  ]- ~& z5 D
两个步骤:训练建模——>模型预测
  ]  a, x: U5 @2 x
2 J4 B6 p) c! u" n' D分类  model = svmtrain(trainlabel, traindata, ‘-s 0 -t 2 -c 1.2 -g 2.8’);
9 p! M% I5 ?( z  i5 G8 P% E; h' k) K$ C4 p- o
回归  model = svmtrain(trainlabel, traindata, ‘-s 3 -t 2 -c 2.2 -g 2.8 -p 0.01’);9 p0 x5 V( @( [5 t

+ ]$ f& l3 g( Q) h9 Q参数说明:
- M5 [; Q- \* s4 L' t( x) j* P3 Z9 A& A' M% r; \' U) _. c
-s svm类型:SVM设置类型(默认0)  m: s0 T1 a* q( o, X" s& Y
0 — C-SVC& X( {: ~+ u& Z7 i0 _0 P# Z
1 –v-SVC
. P  [5 g" G" U3 \/ Y2 – 一类SVM
& I0 D) P; k! i3 — e -SVR  L7 `! j6 y/ g
4 — v-SVR! b  N+ \7 o( Z2 n7 r: l* p
' `$ F- h, L9 t; O. ?# b4 j, L; f
-t 核函数类型:核函数设置类型(默认2)
' G% e9 s0 G9 m, q: L" N0 – 线性:u’v
' d- @. G& A/ @1 ]1 – 多项式:(r*u’v + coef0)^degree) \. _5 V( C8 n2 n5 L6 u& Z8 Z4 v
2 – RBF函数:exp(-r|u-v|^2)! {% S/ h. S, w; P5 B$ n" x$ @
3 –sigmoid:tanh(r*u’v + coef0)
3 N" z5 \0 C8 v, N* y0 s" V1 W4 e  x. q/ o4 b! C3 _. N
-g r(gama):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数). b- V* t: E; J5 g$ E; J

2 P8 [2 ?4 Q5 v* j8 b-c cost:设置C-SVC,e -SVR和v-SVR的参数(损失函数)(默认1),惩罚系数
; ?% E; `7 |' X* y0 n
$ h7 {- `0 c7 E1 [5 _. x, S3 ]-n nu:设置v-SVC,一类SVM和v- SVR的参数(默认0.5)
3 T3 B7 t4 T& s3 [6 {+ P1 v0 Z1 ~  u. d) T6 W. }9 b+ `
-p p:设置e -SVR 中损失函数p的值(默认0.1)
& m) G+ S! R. L1 y
5 S% U9 X' q& V* \( e% W8 k4 A-d degree:核函数中的degree设置(针对多项式核函数)(默认3)
; r) \" x+ t" ]- I8 r8 G0 X. q  T  y( \( a' E* Q2 ~1 w; Y
-wi weight:设置第几类的参数C为weight*C(C-SVC中的C)(默认1)5 x3 B# p# q  p' P
. x  d% l8 D8 [% O% T5 f+ O4 O
-v n: n-fold交互检验模式,n为fold的个数,必须大于等于2
5 H; P  J/ q. A: M9 }
) n7 R6 ^" N6 M$ E) L" Slibsvm使用误区———————-
8 l2 o5 `( E  M7 v9 C- }0 ^, u5 s) r& G  Z+ I# \1 p
(1) 直接将训练集合和测试集合简单归一化到[0,1]区间,可能导致实验结果很差。5 k; \1 e, M8 E1 g7 }  ^( d
9 T7 N/ u# P. w/ P! k
(2) 如果样本的特征数非常多,那么就不必使用RBF核将样本映射到高维空间。8 x, l+ R# M( }# d5 n% S0 ]

# L  b) Z( \0 s6 A% O: |a) 在特征数非常多的情况下,使用线性核,结果已经非常好,并且只需要选择参数C即可。
4 A  y% Y- Z" V% d/ n( Kb) 虽然说RBF核的结果至少比线性核好,前提下搜索整个的空间。
. X, s5 b+ T1 H% J8 g+ d& T(3) 样本数<<特征数的情况:推荐使用线性核,可以达到与RBF同样的性能。5 }) {5 U- A; W" b% o  V' M4 p
1 q( X- q0 }- Q  h$ ~: t
(4) 样本数和特征数都非常多:推荐使用liblinear,更少的时间和内存,可比的准确率。
( T$ z" G# J1 I: [0 y! a- Y
4 Z) e. V/ @' Y. M) Q(5) 样本数>>特征数:如果想使用线性模型,可以使用liblinear,并且使用-s 2参数
* }; M! O9 G: U6 ]! M" n9 P
* z( k! M! _7 J0 s# | 5 ~. ~& O7 J" L% Z9 @
+ @2 d. r  w1 D, P+ X
详解:/ \( U; }" L2 f* Z  d

. M+ o1 p" g/ v/ \7 d. H1. 训练
0 M8 {! L( x. Z  J格式:
8 x( k5 n7 C9 C; F' S6 H2 Umodel = libsvmtrain(training_label_vector, training_instance_matrix [, ‘libsvm_options’]);
$ Y7 A; L; l1 O  c3 D. ^8 Z
" j( `6 R% |, j  K2 ~0 K+ E1 b" E这个函数有三个参数,其中
; Z" E) L3 n/ H& {) Q# r1 Z6 j( D8 ~0 V- _. k; ]. S
-training_label_vector:训练样本的类标,如果有m个样本,就是m x 1的矩阵(类型必须为double)。这里可以是二分类和多分类,类标是(-1,1)、(1,2,3)或者其他任意用来表示不同的类别的数字,要转成double类型。
% X: l& r( ?1 @+ I8 y7 |* p-training_instance_matrix:训练样本的特征,如果有m个样本,每个样本特征是n维,则为m x n的矩阵(类型必须为double)。' U! s& _0 V* H% J
-libsvm_options:训练的参数,在第3点详细介绍。
1 k$ X6 C( I' P  a0 b$ Olibsvmtrain函数返回训练好的SVM分类器模型model是一个结构体,包含以下成员:
' x9 k2 i  a4 L* _
) K! ^: i8 A: }) X-Parameters: 一个5 x 1的矩阵,从上到下依次表示:
: g6 a5 r4 D/ ^* K-s SVM类型(默认0);
, o3 w2 D" `% Z-t 核函数类型(默认2)( Y, C7 A5 g5 C: i
-d 核函数中的degree设置(针对多项式核函数)(默认3);5 M# G/ h' ?: e' q4 @8 L, A* p
-g 核函数中的r(gamma)函数设置(针对多项式/rbf/sigmoid核函数) (默认类别数目的倒数);3 b1 h/ E5 c& N8 d. n
-r 核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)
5 |+ Y) F+ Q, ~/ \-nr_class: 表示数据集中有多少类别,比如二分类时这个值即为2。+ E; l1 L, E4 _( H
-totalSV: 表示支持向量的总数。
* c1 q2 g# `9 ^3 S-rho: 决策函数wx+b中的常数项的相反数(-b)。4 F" ~) ~; C% l
-Label: 表示数据集中类别的标签,比如二分类常见的1和-1。
- q* a* f! `/ U-ProbA: 使用-b参数时用于概率估计的数值,否则为空。
! t8 A8 A" o! u" f-ProbB: 使用-b参数时用于概率估计的数值,否则为空。
+ I9 }7 F0 F( r1 L-nSV: 表示每类样本的支持向量的数目,和Label的类别标签对应。如Label=[1; -1],nSV=[63; 67],则标签为1的样本有63个支持向量,标签为-1的有67个。
2 y* L2 P) I  r$ v! W8 j-sv_coef: 表示每个支持向量在决策函数中的系数。0 _( S. n# `) h
-SVs: 表示所有的支持向量,如果特征是n维的,支持向量一共有m个,则为m x n的稀疏矩阵。4 ?0 y3 A. t5 n- T# z
另外,如果在训练中使用了-v参数进行交叉验证时,返回的不是一个模型,而是交叉验证的分类的正确率或者回归的均方根误差。
( L+ c3 n* \0 {2 j7 o3 I
" u' P. b! S1 \* f! `当构建完成model后,还要为上述参数选择合适的值,方法主要有Gridsearch,其他的感觉不常用,Gridsearch说白了就是穷举。8 {3 f- b6 k3 f+ D4 h# b0 z4 \" ~
$ a: Z7 Z) b" M) [
, [9 @5 |( P4 R/ @
0 g+ k7 I, J6 m! R
网格参数寻优函数(分类问题):SVMcgForClass$ }% h2 n! ^- ~4 g
* d! a! `6 _; c5 {+ Z
[bestCVaccuracy,bestc,bestg]=SVMcgForClass(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,accstep)7 F$ E, Y+ k+ N+ p" H: |+ p

* I, [9 ?; A8 P$ w  B) R输入:& n+ `' h& d  j* p" E, t

2 c. M& ?. c' P! m  w1 E( G) ytrain_label:训练集的标签,格式要求与svmtrain相同。6 }8 F* {" ^: U$ u" S
train:训练集,格式要求与svmtrain相同。
% Z3 d8 w' }" @cmin,cmax:惩罚参数c的变化范围,即在[2^cmin,2^cmax]范围内寻找最佳的参数c,默认值为cmin=-8,cmax=8,即默认惩罚参数c的范围是[2^(-8),2^8]。
# @1 `$ N# h& F, K2 `# z$ Tgmin,gmax:RBF核参数g的变化范围,即在[2^gmin,2^gmax]范围内寻找最佳的RBF核参数g,默认值为gmin=-8,gmax=8,即默认RBF核参数g的范围是[2^(-8),2^8]。
! w  C( E- C) U6 S% Kv:进行Cross Validation过程中的参数,即对训练集进行v-fold Cross Validation,默认为3,即默认进行3折CV过程。
5 @/ h+ n6 _' j, l1 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。
7 S) N  d  W( l6 e+ l) A7 s# Raccstep:最后参数选择结果图中准确率离散化显示的步进间隔大小([0,100]之间的一个数),默认为4.5。
% X1 D% l) U' V  e" l% s$ H5 r输出:/ J) w5 L/ f( h/ j$ a2 a
/ G7 R+ A% o+ A7 H
bestCVaccuracy:最终CV意义下的最佳分类准确率。4 U  \: A2 D# D  H
bestc:最佳的参数c。: K) J! W$ R! q
bestg:最佳的参数g。
# {( ^$ q$ P# I& Q) x% s . {6 W/ v/ |) f. X1 {' G3 l7 C! Z
, ~$ @3 Y) b; \4 N, E' x0 x8 j
网格参数寻优函数(回归问题):SVMcgForRegress0 I0 \3 u5 ^0 y9 x# W
& E& v8 a3 Z4 I. _" D: \7 R
[bestCVmse,bestc,bestg]=SVMcgForRegress(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,msestep)
# U. W/ \7 f, q/ I" }' S: d# X
: c0 K% V0 o8 e* {其输入输出与SVMcgForClass类似,这里不再赘述。
4 @" I5 J4 \4 m' W5 L9 j( ?' F6 d9 c0 ^; g' s0 g2 H
SVM 怎样能得到好的结果
4 e. k0 I3 g2 g% K1 M9 g: C" g, z) A7 j+ |, H; ]- a
1.   对数据做归一化(simple scaling)
# \4 K8 A/ C: i6 W0 A6 g, N$ I3 p( ~
2.   应用 RBF kernel" P/ e' `9 p; p$ m/ g1 H+ @0 z

* ~" X0 E& C! o3.   用cross-validation和grid-search 得到最优的c和g
6 Z" _5 A: h! p( ]7 J# a5 Y/ k6 E4 |4 Z& J( Y# x
4.   用得到的最优c和g训练训练数据- w4 C( J9 @' j

1 M9 _. y* }8 z9 {5.   测试% W8 D, a  X, J1 Y, G  ~

& F0 p) C! C' s# p( X4 v9 y$ `3 S 3 c& a! T2 z/ P4 M/ a/ V2 E

  b! e, ^; m+ O! H# z6 p$ R关于svm的C以及核函数参数设置———————-/ b7 d0 L' M& [) ~) k! V1 b

3 }8 H7 |: a5 S& g- EC一般可以选择为:10^t , t=- 4..4就是0.0001 到10000
7 M0 I) L9 P* E/ {7 K
8 B( O: D! z, q% }3 p( Y* @选择的越大,表示对错误例惩罚程度越大,可能会导致模型过拟合$ r6 t0 M" V! i7 D% \

2 ^+ |7 e( _8 v. F$ t6 Q
  u( L" S; E& T0 W: R5 |8 G
! v  m# D6 ?' n8 B在LIBSVM中-t用来指定核函数类型(默认值是2)。9 C0 K9 e3 x, v' ?, R" s. ]

/ }2 q, O" d) f- U% L6 g; u0)线性核函数
+ z2 t! w9 {7 t+ n; j2 \9 x8 r5 J( _% s8 Q% r
(无其他参数)
$ R8 y& H4 a# |- y) `5 O/ s7 w& D& I; S! h1 p- W
1)多项式核函数. M8 N3 c% B) n' |
4 ?6 L# U! z$ J( E/ _8 Z1 p6 h/ }
(重点是阶数的选择,即d,一般选择1-11:1 3 5 7 9 11,也可以选择2,4,6…)& ]  l# h3 K- _5 f- i1 g+ r, ?1 ]
2 i, X7 _0 J/ Y) I
2)RBF核函数& V; F% u+ m( X/ D
9 s0 F% o' y* A7 P4 e6 x; l
(径向基RBF内核,exp{-|xi-xj|^2/均方差},其中均方差反映了数据波动的大小。- F* ~$ t1 [, X2 Q* J7 z

3 }7 j2 {8 `) V/ t. k参数通常可选择下面几个数的倒数:0.1 0.2 0.4 0.6 0.8 1.6 3.2 6.4 12.8,默认的是类别数的倒数,即1/k,2分类的话就是0.5)  S0 v+ W% y7 E5 z
- A. b3 ?* [: i9 y( \
3)sigmoid核函数 又叫做S形内核7 p; ~3 T3 y9 @, ]) x+ ?
, z) n/ s7 Z, }$ y
两个参数g以及r:g一般可选1 2 3 4,r选0.2 0.4 0.60.8 1& {& O$ Y$ c( x& E; V' ]! G

& [5 E+ i' S5 y4)自定义核函数
, ^) W. ~" w. p* z' Z' y
) @& r' k, P- e. a. k- q 3 o/ b, |4 z0 p) V. U/ w

9 V$ e% s7 }. g$ D+ t3 u& S与核函数相对应的libsvm参数:) j. ~% W2 B# s- {
& c$ z8 C, u" ^: h6 P8 h  ?
1)对于线性核函数,没有专门需要设置的参数- i( ?5 S' j! }9 u. u; f
- q2 V1 |8 i2 f( u0 h
2)对于多项式核函数,有三个参数。-d用来设置多项式核函数的最高此项次数,也就是公式中的d,默认值是3。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/k(k是类别数)。-r用来设置核函数中的coef0,也就是公式中的第二个r,默认值是0。8 L  @# g& v- y8 n) v* w! G
- {& {" B) I) @7 {" b/ Q; @
3)对于RBF核函数,有一个参数。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/k(k是类别数)。
  z- k; g) o4 |$ _9 ]' ?7 u+ L+ X  [# w) Q
( A. x* t  W, z! g/ u. O- r  }& {4)对于sigmoid核函数,有两个参数。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/k(k是类别数)。-r用来设置核函数中的coef0,也就是公式中的第二个r,默认值是0。
; {! x3 H* D/ y* B# T$ _$ c6 \5 l% C8 v
2. 预测5 ~, C" R" R4 w: y0 M, v' S/ D  q! ]" s
格式:
- {6 D: N5 ^& B& P- a[predicted_label, accuracy, decision_values/prob_estimates]
8 o+ b$ b* G- g) i6 T/ E2 e= libsvmpredict(testing_label_vector, testing_instance_matrix, model [, ‘libsvm_options’]);
; m8 v: S6 S1 B' e: L. A. n( P7 }' O1 n: B) M, S2 w
这个函数包括四个参数,其中( D( q4 F7 \: {0 f1 i0 H4 W- w3 g
3 K, b: t( e! n( C% Y- g# s7 T
-testing_label_vector:测试样本的类标,如果有m个样本,就是m x 1的矩阵(类型必须为double)。如果类标未知,可以初始化为任意m x 1的double数组。, a' k. W. i6 f$ D! w
-testing_instance_matrix:测试样本的特征,如果有m个样本,每个样本特征是n维,则为m x n的矩阵(类型必须为double)。
$ l# k/ ?4 Y  B-model:使用libsvmtrain返回的模型4 ]. Q4 J& {" D5 S. F8 r
-libsvm_options:预测的参数,与训练的参数形式一样。' n' E9 ~0 ]/ O, j4 p% _
libsvmpredict函数有三个返回值,不需要的值在Matlab可以用 ~ 进行代替。7 w0 F( v* r( M$ T, c8 b

: M- e# u7 v7 b. T6 c-predicted_label:第一个返回值,表示样本的预测类标号。8 h: [7 L7 E; q; W
-accuracy:第二个返回值,一个3 x 1的数组,表示分类的正确率、回归的均方根误差、回归的平方相关系数。) J" ^/ I/ I, L9 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的预测结果。
+ v/ K+ ?8 ~+ c' u: K0 E3. 训练的参数
# Y; Y# h+ v* U0 ^% j3 v# rLIBSVM训练时可以选择的参数很多,包括:* G) }: p! ]5 b# Y: {
$ Q. [) v9 f0 y  {: s
-s svm类型:SVM设置类型(默认0)
! l+ c; y- w' H4 h0 — C-SVC; 1 –v-SVC; 2 – 一类SVM; 3 — e-SVR; 4 — v-SVR
1 t& y) Q6 S8 L8 e2 Q& c-t 核函数类型:核函数设置类型(默认2)' Q+ a! h# O, K8 |4 z& N
0 – 线性核函数:u’v/ `5 b7 S$ N+ |( @* D' S# _
1 – 多项式核函数:(r*u’v + coef0)^degree8 {% N) J6 u6 J5 Z4 W5 k0 Y& Q
2 – RBF(径向基)核函数:exp(-r|u-v|^2)
! [! _; B2 q+ i. G3 – sigmoid核函数:tanh(r*u’v + coef0)8 r2 n' _. ]" S# }1 N: A
-d degree:核函数中的degree设置(针对多项式核函数)(默认3)
7 {" z; ^3 b# }; v3 R6 \) V-g r(gamma):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)(默认1/k,k为总类别数)
: x% Z- D2 V' Y- b-r coef0:核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)( e) U( a2 |# O* k! D# m' T* e
-c cost:设置C-SVC,e -SVR和v-SVR的参数(损失函数)(默认1)
4 n' y; ^9 h# F2 U, v$ }- g5 `-n nu:设置v-SVC,一类SVM和v- SVR的参数(默认0.5)
/ B' D) I* \) J-p p:设置e -SVR 中损失函数p的值(默认0.1)7 ^3 N, z& A2 I1 Q: [2 u! w
-m cachesize:设置cache内存大小,以MB为单位(默认40)% H! w( M$ c0 A
-e eps:设置允许的终止判据(默认0.001)  C3 W% t/ i# K9 m, n* C0 R
-h shrinking:是否使用启发式,0或1(默认1)
4 Y6 [; |' Y. K* {- g- N/ [-wi weight:设置第几类的参数C为weight*C (C-SVC中的C) (默认1)
+ b& ~2 i0 c1 r$ Z1 x; P1 ]( A-v n: n-fold交互检验模式,n为fold的个数,必须大于等于2$ h# h2 w) Q( @2 M9 y0 D% M
以上这些参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。
( Q: Q& Q! W' T) Q. n9 z, i4 t6 m) G" U: V) A" i
4. 读取或保存/ U! l& l% M! _6 I
libsvmread函数可以读取以LIBSVM格式存储的数据文件。
. }- r" `, b1 o2 A
3 c- W0 V" z9 ?% Q; Y3 s% X* A; G; [[label_vector, instance_matrix] = libsvmread(‘data.txt’);
4 T; q% `) G7 a# l) D; o2 p7 ?) r+ d) I) H+ m/ b3 X7 ]
这个函数输入的是文件的名字,输出为样本的类标和对应的特征。2 @3 w: m% s9 t& ]6 w  v

2 q; g1 X2 \% X5 tlibsvmwrite函数可以把Matlab的矩阵存储称为LIBSVM格式的文件。8 t7 Z9 k1 t; m7 u& x' w0 r/ I: G

# Y( |. n# ~) b2 C$ q2 c( |libsvmwrite(‘data.txt’, label_vector, instance_matrix]
/ d' [4 ^. p7 N/ p3 F: ?  ~9 e
  M9 b, F/ H% Y$ _9 ?这个函数有三个输入,分别为保存的文件名、样本的类标和对应的特征(必须为double类型的稀疏矩阵)。

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-24 12:47 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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