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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

. r- a, G+ E7 x; LLIBSVM是台湾大学林智仁(Lin Chih-Jen)教授等开发设计的一个简单、易于使用和快速有效的SVM模式识别与回归的软件包,他不但提供了编译好的可在Windows系列系统的执行文件,还提供了源代码,方便改进、修改以及在其它操作系统上应用;该软件对SVM所涉及的参数调节相对比较少,提供了很多的默认参数,利用这些默认参数可以解决很多问题;并提供了交互检验(Cross Validation)的功能。该软件可以解决C-SVM、ν-SVM、ε-SVR和ν-SVR等问题,包括基于一对一算法的多类模式识别问题。& ~) K+ U5 v6 Y5 k& A  v) W9 y1 X+ g

& H% k4 \3 v! M注意不是matlab自带的svm实现函数,自带的svm实现函数仅支持分类问题,不支持回归问题;而libsvm不仅支持分类问题,亦支持回归问题,参数可调节,功能更强大。
" U. H5 \/ Z: e0 a  c( `% E+ _
  R  z9 r# z) b3 j! u! Jlibsvm的配置很简单,只需要下载高级版本的matlab和libsvm,VC或VS编译实现很简单的,这里就不细讲了。
* Q; q  N2 g+ R" B. g, Z! |6 R
1 F; E2 L' D8 [+ ^3 I& J, f两个步骤:训练建模——>模型预测
0 `# E; x1 I6 n3 A# r+ G* O  ]$ t  R" I& |
分类  model = svmtrain(trainlabel, traindata, ‘-s 0 -t 2 -c 1.2 -g 2.8’);& l& R% |' I2 L8 u2 @, I& D6 l$ [

1 ]2 j& {7 O, L& i  ?" ?9 p回归  model = svmtrain(trainlabel, traindata, ‘-s 3 -t 2 -c 2.2 -g 2.8 -p 0.01’);8 S, w; M8 J2 k

, K: n7 ?( K3 |7 d6 o+ @0 y9 S2 P参数说明:4 V; s5 m9 A" N! v& E- f

% f# }) l+ a. D  }3 ^% U-s svm类型:SVM设置类型(默认0)
" M9 d: L9 J2 V0 — C-SVC* X, M+ J" G5 X( ?6 B7 r# G% i; U2 i
1 –v-SVC
- S6 z, A6 e0 f" f; q0 n2 – 一类SVM7 |  ~  t; e/ c; \0 A3 f
3 — e -SVR4 }9 E" G" N3 m: v
4 — v-SVR/ c+ {  q: \3 G% I2 P
  R; a  z* p' G9 [& G
-t 核函数类型:核函数设置类型(默认2)
- ?0 q; p. w& H; k. ?* b0 – 线性:u’v$ K! {3 V7 N8 b! d/ r" d
1 – 多项式:(r*u’v + coef0)^degree
+ ^% w. B6 E6 N3 m6 y) u3 r2 – RBF函数:exp(-r|u-v|^2)( U. D  s* V: L
3 –sigmoid:tanh(r*u’v + coef0)
/ T' ~  l8 h! R) {. E& m+ {1 t- g4 L
-g r(gama):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)
4 h3 x' u# [( ]: g( \& ], j" w" r/ M+ y6 G4 r+ r
-c cost:设置C-SVC,e -SVR和v-SVR的参数(损失函数)(默认1),惩罚系数" L  f' h& o3 k! [& ]6 w
4 \9 [7 c3 q: W
-n nu:设置v-SVC,一类SVM和v- SVR的参数(默认0.5)4 @3 l0 b! m  U& A) ]% A5 H4 Z) N

! {2 \% N. ^, |) F* d, P; F7 |-p p:设置e -SVR 中损失函数p的值(默认0.1)
/ v* `9 T* k# k: Z' y- F! H+ H# [" ]3 F# s6 K8 U
-d degree:核函数中的degree设置(针对多项式核函数)(默认3)
2 \$ _/ C4 g' m9 n
* [+ B! L8 B3 n' J# k8 T-wi weight:设置第几类的参数C为weight*C(C-SVC中的C)(默认1)6 _2 c( O- S: N" u1 v$ D, G

* {6 P3 v6 K) ?( z-v n: n-fold交互检验模式,n为fold的个数,必须大于等于2
9 F+ a$ N7 _8 S: o* l7 {) e! _( \6 S
libsvm使用误区———————-
4 Y6 \, s( B$ ~) L% C. q. `" P! X: d& j& w
(1) 直接将训练集合和测试集合简单归一化到[0,1]区间,可能导致实验结果很差。
2 Z( Z  G0 F7 K* l( _6 h% C  |1 X0 D8 O7 i
(2) 如果样本的特征数非常多,那么就不必使用RBF核将样本映射到高维空间。' U2 l2 t; w2 q3 f. k

3 Y6 }# o7 W/ O) l3 e5 t# l" n% Ma) 在特征数非常多的情况下,使用线性核,结果已经非常好,并且只需要选择参数C即可。! Y6 }1 v; l/ w$ y4 I
b) 虽然说RBF核的结果至少比线性核好,前提下搜索整个的空间。2 c1 n4 @) l$ d+ W
(3) 样本数<<特征数的情况:推荐使用线性核,可以达到与RBF同样的性能。
8 K8 h* v( r6 L6 r
# O  t* L4 }8 }4 X0 I(4) 样本数和特征数都非常多:推荐使用liblinear,更少的时间和内存,可比的准确率。
8 c  h4 Z" G( N& \& q1 p$ l$ A
  `' k* `. n, O* P9 b5 q  J. l5 A(5) 样本数>>特征数:如果想使用线性模型,可以使用liblinear,并且使用-s 2参数+ V+ E0 s2 M  n. `+ V1 s) N5 _
' d  W% O. t& ~0 Z0 ]+ M* a9 @) C5 p
) t  h: M; n% l% l+ y3 X

- u3 _# y$ I# a详解:5 J5 J0 s* d, F' [' L. S
. P: [) u, S& s) N1 n
1. 训练
7 P+ n: C& x+ c8 n' ?8 f# E/ ?格式:# u4 \1 h4 w2 B* f* Z% H
model = libsvmtrain(training_label_vector, training_instance_matrix [, ‘libsvm_options’]);
( C$ j: `, R$ _$ W0 V# j
% s+ C! N0 Q& p6 a8 w这个函数有三个参数,其中1 `" W" B9 N4 G8 P! Z4 h
% @" |/ d6 K+ n( l1 R
-training_label_vector:训练样本的类标,如果有m个样本,就是m x 1的矩阵(类型必须为double)。这里可以是二分类和多分类,类标是(-1,1)、(1,2,3)或者其他任意用来表示不同的类别的数字,要转成double类型。
2 z: h+ {0 S4 u! @* [-training_instance_matrix:训练样本的特征,如果有m个样本,每个样本特征是n维,则为m x n的矩阵(类型必须为double)。# V- N9 J0 o, r" ?4 a) S, e6 s! n
-libsvm_options:训练的参数,在第3点详细介绍。% X- ]& }9 Q, H* }" z# R7 s
libsvmtrain函数返回训练好的SVM分类器模型model是一个结构体,包含以下成员:
( j3 ?2 c. f6 c3 Q& d% n8 _7 W& K1 G4 A$ ~/ |
-Parameters: 一个5 x 1的矩阵,从上到下依次表示:, S- q3 |, d" {- e
-s SVM类型(默认0);
- x  ]2 |7 q; a$ ^-t 核函数类型(默认2)
/ ]. I+ a0 Y+ N, b; ]/ h-d 核函数中的degree设置(针对多项式核函数)(默认3);' S" {2 r) U# G) \$ _/ J- \
-g 核函数中的r(gamma)函数设置(针对多项式/rbf/sigmoid核函数) (默认类别数目的倒数);0 e# s/ q; p3 U- V
-r 核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)
* \( _5 }' I7 P-nr_class: 表示数据集中有多少类别,比如二分类时这个值即为2。5 d9 F, U2 D9 \# v0 |9 y
-totalSV: 表示支持向量的总数。/ e0 m: K5 f9 a/ T$ ~6 _  E- q
-rho: 决策函数wx+b中的常数项的相反数(-b)。3 K  A8 }" O: {  C+ x% r- b+ f8 q
-Label: 表示数据集中类别的标签,比如二分类常见的1和-1。
" K! [: \: a7 f4 `-ProbA: 使用-b参数时用于概率估计的数值,否则为空。* A( }. p8 w9 t1 a% w
-ProbB: 使用-b参数时用于概率估计的数值,否则为空。
. H2 ~. ^8 A- ]- C-nSV: 表示每类样本的支持向量的数目,和Label的类别标签对应。如Label=[1; -1],nSV=[63; 67],则标签为1的样本有63个支持向量,标签为-1的有67个。
& T  L& z8 A4 Q" F. [- `-sv_coef: 表示每个支持向量在决策函数中的系数。
! x9 [; E6 K" Y+ N-SVs: 表示所有的支持向量,如果特征是n维的,支持向量一共有m个,则为m x n的稀疏矩阵。2 S7 s; u; R  J1 \* ]
另外,如果在训练中使用了-v参数进行交叉验证时,返回的不是一个模型,而是交叉验证的分类的正确率或者回归的均方根误差。7 W+ F: u: _) [- A: }4 {9 q
* \+ n; W5 {! c' Q+ u% s- }' b% E
当构建完成model后,还要为上述参数选择合适的值,方法主要有Gridsearch,其他的感觉不常用,Gridsearch说白了就是穷举。$ A" `$ \) a: k% {
/ R+ |! y, o2 x/ J& ^% B+ _# D

1 O: v7 \, S8 v7 ?, `7 Q6 Z5 T( z" Z' O; n" N% x) t; e9 q
网格参数寻优函数(分类问题):SVMcgForClass0 M2 c0 B& Z, n8 X) K! z
6 E1 Z, }  k7 p) B
[bestCVaccuracy,bestc,bestg]=SVMcgForClass(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,accstep): t" I( o8 ?8 Y& _; ^
, \& u2 h& h( H" p7 D
输入:3 w- o  H' j) k+ ~3 Q- Y

$ ]! M. B4 k1 {* s" ]% Qtrain_label:训练集的标签,格式要求与svmtrain相同。9 T. L9 v7 @: a
train:训练集,格式要求与svmtrain相同。( E% Y2 O1 p: [8 Z+ `
cmin,cmax:惩罚参数c的变化范围,即在[2^cmin,2^cmax]范围内寻找最佳的参数c,默认值为cmin=-8,cmax=8,即默认惩罚参数c的范围是[2^(-8),2^8]。
$ b8 p- c- O* F6 Cgmin,gmax:RBF核参数g的变化范围,即在[2^gmin,2^gmax]范围内寻找最佳的RBF核参数g,默认值为gmin=-8,gmax=8,即默认RBF核参数g的范围是[2^(-8),2^8]。/ J" G. s* I9 C! Z% J* a
v:进行Cross Validation过程中的参数,即对训练集进行v-fold Cross Validation,默认为3,即默认进行3折CV过程。
1 r1 r7 z5 M9 Ucstep,gstep:进行参数寻优是c和g的步进大小,即c的取值为2^cmin,2^(cmin+cstep),…,2^cmax,,g的取值为2^gmin,2^(gmin+gstep),…,2^gmax,默认取值为cstep=1,gstep=1。
4 ~( _; C2 X# T$ q" \" g- }accstep:最后参数选择结果图中准确率离散化显示的步进间隔大小([0,100]之间的一个数),默认为4.5。
" [- N$ A% b, h' P0 i9 f3 T0 W输出:, |6 D9 g# O# n* a: |  \  A
: X0 _. {$ e: M% B2 H, v
bestCVaccuracy:最终CV意义下的最佳分类准确率。
# b' T7 {2 t. _: ybestc:最佳的参数c。+ ?2 f/ _. {% W
bestg:最佳的参数g。' V' }9 Y6 I5 ~: `

6 r0 b! b# P# o( {* H- z2 k6 c8 T/ o2 Y
网格参数寻优函数(回归问题):SVMcgForRegress
. }; b* K, Q: K9 @# o/ h- r+ F/ e6 z- P( Z% {& x
[bestCVmse,bestc,bestg]=SVMcgForRegress(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,msestep); w: w1 d: K5 l/ G. n

5 @7 C$ z* ]* B+ e5 H其输入输出与SVMcgForClass类似,这里不再赘述。' y2 j" Y: S' z* U; w2 T
4 {6 l: g0 [4 g1 \, \) G; H* O
SVM 怎样能得到好的结果
& c& M# d) e6 H7 e7 V6 m& ]3 g6 ?) ?/ S: [
1.   对数据做归一化(simple scaling)7 P' d3 b% t* U7 t' o& N

% e2 Q. W: K& b/ J: C$ C2.   应用 RBF kernel
7 p  U0 |: l# U
' i  h4 ^* J- n% P; z3.   用cross-validation和grid-search 得到最优的c和g: a1 X( z/ a; [7 [' o2 p- o

- P: ~* E3 S2 b# T4.   用得到的最优c和g训练训练数据" S' y+ v1 h3 B+ B6 E
8 Z+ j! T0 p, q- X, a
5.   测试
0 u: A% V$ @4 P) Y; o7 _; @% K& t3 m4 E8 P
; J) f: k1 |: z+ _

$ W' G. A/ j$ I7 e7 ~关于svm的C以及核函数参数设置———————-) ^- k1 W4 t% A3 M# e
* E) d9 ?, c: a' d6 e' I% i
C一般可以选择为:10^t , t=- 4..4就是0.0001 到10000
( l  i! z& c6 K1 J3 s4 Y% j0 Y; F& M2 b5 V+ k5 g% S. H
选择的越大,表示对错误例惩罚程度越大,可能会导致模型过拟合
* n# A/ G1 a% b
3 n; M$ P* H. i0 T- _  w, f 4 D; J& l  u6 B- b+ \5 `+ S, Q- w

2 t: X8 I& g5 ~" H  {在LIBSVM中-t用来指定核函数类型(默认值是2)。3 _% w( q; t- r' `
! n4 E& y$ X( i  D! m
0)线性核函数$ ?& c# m6 P2 L% `- N  ~
& V3 g, q7 r% t# n9 H
(无其他参数)* a! ?( `' g3 C1 m3 j! Q

/ D" ?+ V+ w% i$ W, P. D1)多项式核函数
6 `! g" d+ y) P$ G7 R0 M1 h; e! f5 e* W' o5 P  \# X: _
(重点是阶数的选择,即d,一般选择1-11:1 3 5 7 9 11,也可以选择2,4,6…)3 M8 b0 b& V" p7 n

& }0 V6 p; [5 q0 a2)RBF核函数
6 c( v  W6 c1 a7 y4 _9 U% k. p1 h8 R4 L" J6 |) Q
(径向基RBF内核,exp{-|xi-xj|^2/均方差},其中均方差反映了数据波动的大小。  w+ D9 A: W) R
! c" u& o1 @9 m
参数通常可选择下面几个数的倒数:0.1 0.2 0.4 0.6 0.8 1.6 3.2 6.4 12.8,默认的是类别数的倒数,即1/k,2分类的话就是0.5)
0 M, }& [- @: A4 m- o; K5 [1 Q+ u7 z0 @& R. l! P# z' M: a4 x
3)sigmoid核函数 又叫做S形内核0 r! F) P: ]6 c
  _0 A: k1 l. T7 Q7 l9 d1 T9 o
两个参数g以及r:g一般可选1 2 3 4,r选0.2 0.4 0.60.8 1
* L+ T+ X; s2 R& {) S4 b/ {' v) W& q2 f; s. N" }
4)自定义核函数
9 j  v: Q% N  Y1 s. }: a9 _$ I  J% V. v0 _; Q
# V6 h; z+ H5 S% q
! u/ k7 I; f* P( x2 D, w% I9 i
与核函数相对应的libsvm参数:9 D+ _3 |1 B1 [

2 Q/ T3 O+ m5 g4 S/ E1)对于线性核函数,没有专门需要设置的参数/ e& f5 S. t6 w; l) `; j/ n
4 y  w) ^* o9 o& m# b
2)对于多项式核函数,有三个参数。-d用来设置多项式核函数的最高此项次数,也就是公式中的d,默认值是3。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/k(k是类别数)。-r用来设置核函数中的coef0,也就是公式中的第二个r,默认值是0。
; h$ g+ L0 C! `' ^2 ?" o; [) o5 P7 f7 b
3)对于RBF核函数,有一个参数。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/k(k是类别数)。
- R& J  m/ t0 @% P+ L' O/ {' s3 d% U9 I# q
4)对于sigmoid核函数,有两个参数。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/k(k是类别数)。-r用来设置核函数中的coef0,也就是公式中的第二个r,默认值是0。
1 Y$ S# J8 [- f/ {4 b/ C' d4 t
; |* G9 P% f! Q9 _2. 预测3 O0 x% E: w. L  q8 D
格式:
8 a& }) w! Y1 M4 A[predicted_label, accuracy, decision_values/prob_estimates]
: D% C4 ^% Y) G0 G7 p= libsvmpredict(testing_label_vector, testing_instance_matrix, model [, ‘libsvm_options’]);6 d9 I; Q" X: A; X1 Q

$ G9 {1 U1 t+ _- C+ r这个函数包括四个参数,其中
- @3 x. x% p( G8 g
7 m" I6 j: j9 [, {. n. A4 t% U-testing_label_vector:测试样本的类标,如果有m个样本,就是m x 1的矩阵(类型必须为double)。如果类标未知,可以初始化为任意m x 1的double数组。
, H2 E3 b& f7 N- B1 ?* ^3 M-testing_instance_matrix:测试样本的特征,如果有m个样本,每个样本特征是n维,则为m x n的矩阵(类型必须为double)。: ~" J  |' Z9 @/ C, c8 S
-model:使用libsvmtrain返回的模型8 R) F' ]! M% R6 @3 S
-libsvm_options:预测的参数,与训练的参数形式一样。
1 O4 C3 z  G& }3 e" f: Jlibsvmpredict函数有三个返回值,不需要的值在Matlab可以用 ~ 进行代替。
3 q, o# V3 c  W% H& Z
7 C. t0 c3 n: _' G, w-predicted_label:第一个返回值,表示样本的预测类标号。
9 i3 U4 `; G. M' K0 l-accuracy:第二个返回值,一个3 x 1的数组,表示分类的正确率、回归的均方根误差、回归的平方相关系数。+ k/ K  S* X6 y) X$ F& r5 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的预测结果。
. P) b5 Z8 M3 l4 X4 E2 x7 x3. 训练的参数( A& [' G- ^& t( i! y& [( q
LIBSVM训练时可以选择的参数很多,包括:& X! H8 a1 E/ Y( b$ d* y3 ?" w

7 m" r8 ^# u# n  |9 {" V. I-s svm类型:SVM设置类型(默认0)6 b" Y2 S3 N9 r5 h) g4 L+ G
0 — C-SVC; 1 –v-SVC; 2 – 一类SVM; 3 — e-SVR; 4 — v-SVR: Z- [5 X5 A2 I- b/ o$ N
-t 核函数类型:核函数设置类型(默认2)
* _* z# N. O( u0 – 线性核函数:u’v
* |1 ]5 P& B; M1 – 多项式核函数:(r*u’v + coef0)^degree( W- N# t5 H% d0 ~, ~
2 – RBF(径向基)核函数:exp(-r|u-v|^2)
1 `2 n  G4 a. E( }3 – sigmoid核函数:tanh(r*u’v + coef0)0 A2 p# T, m: N
-d degree:核函数中的degree设置(针对多项式核函数)(默认3)
% l& K* |: l. U+ F* f-g r(gamma):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)(默认1/k,k为总类别数)
# N6 X* Q0 b+ R) u-r coef0:核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)2 ~1 J" P7 _& D  v+ q$ O
-c cost:设置C-SVC,e -SVR和v-SVR的参数(损失函数)(默认1)
: E1 r4 V% y, j-n nu:设置v-SVC,一类SVM和v- SVR的参数(默认0.5)
5 b$ U- F6 m) {$ T, R-p p:设置e -SVR 中损失函数p的值(默认0.1)# s2 z- @( b$ ]7 Z+ b% Z  V
-m cachesize:设置cache内存大小,以MB为单位(默认40)- A6 G) H+ u# h; u' p+ ~5 v; q
-e eps:设置允许的终止判据(默认0.001)
3 o; l+ a2 u) c1 E8 ^$ W# l* {-h shrinking:是否使用启发式,0或1(默认1)
5 X7 u# B/ ?' P6 c) k2 a-wi weight:设置第几类的参数C为weight*C (C-SVC中的C) (默认1)
' F) D9 p# J1 q  k3 r-v n: n-fold交互检验模式,n为fold的个数,必须大于等于2
; }, B4 |% e+ |7 w, A& J以上这些参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。
1 V3 w% W6 c" `' c' X& C8 C' w$ O: F& ~
4. 读取或保存: P; e' ]0 B) X
libsvmread函数可以读取以LIBSVM格式存储的数据文件。
$ z& `: [2 k* [( E2 d
4 A% `! b9 q. ~1 E  q- O[label_vector, instance_matrix] = libsvmread(‘data.txt’);
0 t8 f# e+ X+ u  \; h& F, }. ^  ~% k
这个函数输入的是文件的名字,输出为样本的类标和对应的特征。7 U$ p2 N( A" u* P) w  d
; q$ Q  M# C5 [* }
libsvmwrite函数可以把Matlab的矩阵存储称为LIBSVM格式的文件。
9 g; C: e4 p/ h7 M' o+ x1 _
1 S! h5 k" J. F8 u' glibsvmwrite(‘data.txt’, label_vector, instance_matrix]5 [. k3 j0 w- _8 B; J
) |; ^! g/ m( Q  M: |6 w7 f; b
这个函数有三个输入,分别为保存的文件名、样本的类标和对应的特征(必须为double类型的稀疏矩阵)。

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-2 17:16 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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