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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

& x% [: }2 Y# X+ m" ^/ `LIBSVM是台湾大学林智仁(Lin Chih-Jen)教授等开发设计的一个简单、易于使用和快速有效的SVM模式识别与回归的软件包,他不但提供了编译好的可在Windows系列系统的执行文件,还提供了源代码,方便改进、修改以及在其它操作系统上应用;该软件对SVM所涉及的参数调节相对比较少,提供了很多的默认参数,利用这些默认参数可以解决很多问题;并提供了交互检验(Cross Validation)的功能。该软件可以解决C-SVM、ν-SVM、ε-SVR和ν-SVR等问题,包括基于一对一算法的多类模式识别问题。. l9 u" K4 Z1 p- s" B& p7 v
! O2 W( H) U- p3 O* u7 O
注意不是matlab自带的svm实现函数,自带的svm实现函数仅支持分类问题,不支持回归问题;而libsvm不仅支持分类问题,亦支持回归问题,参数可调节,功能更强大。. w$ K. A$ X4 n

* y, p3 O; }4 ]8 S- v$ Z# N; Qlibsvm的配置很简单,只需要下载高级版本的matlab和libsvm,VC或VS编译实现很简单的,这里就不细讲了。
, x) g6 }7 V) E( _/ m
$ u1 b( Z7 m$ n& |! @4 y8 W9 x两个步骤:训练建模——>模型预测
! J5 ^3 O. ^. q8 e! \, H: a( r2 Q: P2 J' F5 O/ C& M: T0 l
分类  model = svmtrain(trainlabel, traindata, ‘-s 0 -t 2 -c 1.2 -g 2.8’);
" e& E4 Q# G* Z* |2 a# B2 o& X+ y3 x; h% G* @. V
回归  model = svmtrain(trainlabel, traindata, ‘-s 3 -t 2 -c 2.2 -g 2.8 -p 0.01’);
* r/ I& Z; @  l' Z' u$ j0 \1 J
; E5 M' r( v$ O! }) d9 e, F% E参数说明:+ p9 t; k7 j& |) N

9 [" g# r1 @% X+ N-s svm类型:SVM设置类型(默认0)
( c+ i6 Y' [  B6 R* B! F- ^0 — C-SVC; W; m. A7 w4 j& Z$ W) R7 @
1 –v-SVC
/ U" D+ P+ h/ O6 r2 – 一类SVM
! N& b' \. |& U- V: T# Y+ J: o3 — e -SVR
/ E9 S* ?9 ~1 n$ a8 ]4 — v-SVR
$ {9 H$ i4 K/ j/ D; `6 o& D6 w3 j2 x! h
-t 核函数类型:核函数设置类型(默认2)
6 w0 ~* s4 R, H* t& o0 – 线性:u’v1 d4 y% t+ `: k3 K9 k1 H' Y
1 – 多项式:(r*u’v + coef0)^degree
$ m5 U2 @; v( D6 D2 – RBF函数:exp(-r|u-v|^2)
# L+ W! [) v" a, _' U$ `' Y% N3 –sigmoid:tanh(r*u’v + coef0)8 H( \0 k! `% ~' J

0 v; j# k- _- y. f7 ~" d% c" [-g r(gama):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)
/ F7 Y6 n/ \  B( g4 a. [2 y$ ~- I8 A* z! o3 [
-c cost:设置C-SVC,e -SVR和v-SVR的参数(损失函数)(默认1),惩罚系数, Z! Q8 q! j& D! G8 s/ G: N
# j& J1 p7 B; |3 c( b% t
-n nu:设置v-SVC,一类SVM和v- SVR的参数(默认0.5)3 I  r& f3 t8 C

/ M  q8 s0 u7 T9 }* Q-p p:设置e -SVR 中损失函数p的值(默认0.1)' N% \4 k2 _9 h0 m5 [8 {% W
) v) e5 E- _5 ]" p8 C
-d degree:核函数中的degree设置(针对多项式核函数)(默认3)
( Z, h: X, B$ Y; ^4 \* ^: |; V- {' }3 P0 c
-wi weight:设置第几类的参数C为weight*C(C-SVC中的C)(默认1)
" X1 A0 c8 c% N4 z
4 V- R2 y8 b3 R& T8 x* Q$ X-v n: n-fold交互检验模式,n为fold的个数,必须大于等于2
6 s0 J2 m& W0 o; e3 o0 Y. y9 ]* x9 v* o- ^( a
libsvm使用误区———————-( z+ f1 e' C% ?6 S6 y6 I: a) @1 g7 ]: G

6 E# b4 q* L( \' _7 K(1) 直接将训练集合和测试集合简单归一化到[0,1]区间,可能导致实验结果很差。
$ B' y8 r6 N* f+ l. Z" K4 _! f4 r3 _; l* R
(2) 如果样本的特征数非常多,那么就不必使用RBF核将样本映射到高维空间。
: O8 A; ]; U$ L5 Q4 r2 v7 T
/ x( h3 @6 E7 D$ G# E. w) Da) 在特征数非常多的情况下,使用线性核,结果已经非常好,并且只需要选择参数C即可。4 f9 _- N/ {; }, n: Z( r: k6 e
b) 虽然说RBF核的结果至少比线性核好,前提下搜索整个的空间。0 Z/ ]3 F2 D6 e( t' t
(3) 样本数<<特征数的情况:推荐使用线性核,可以达到与RBF同样的性能。
; K& }2 R" h+ U! p
, z/ M& H$ B: ]6 V7 @- d( E(4) 样本数和特征数都非常多:推荐使用liblinear,更少的时间和内存,可比的准确率。
+ V) {" G0 K5 a; }% H$ ~/ x
2 _$ t& `, {+ N( ?# J  T4 f# p(5) 样本数>>特征数:如果想使用线性模型,可以使用liblinear,并且使用-s 2参数
; i! g! o- j2 g' y% p0 ^& v0 |
& @9 q& {7 x, M; a, L
$ s% {$ R3 A9 c* H4 t  D
. B+ l8 |. \" x9 F2 k% x详解:. x8 Y' o+ Y6 `0 g

  L1 ?4 K9 |: A7 Y1. 训练/ |3 J# V8 [. ?7 A8 w
格式:
# o/ h8 L9 s2 T" h$ q/ L) Bmodel = libsvmtrain(training_label_vector, training_instance_matrix [, ‘libsvm_options’]);  I/ Z- W, z* W( S* T% y9 R  l' R+ I
: ]3 b' V1 M. q6 v$ }4 B/ u
这个函数有三个参数,其中
4 [% T8 w% B# S6 m7 U! a
$ v  j3 X3 C7 E4 i/ s8 a. o( ~4 _-training_label_vector:训练样本的类标,如果有m个样本,就是m x 1的矩阵(类型必须为double)。这里可以是二分类和多分类,类标是(-1,1)、(1,2,3)或者其他任意用来表示不同的类别的数字,要转成double类型。' X: N1 H7 U- l8 m0 f* T6 N
-training_instance_matrix:训练样本的特征,如果有m个样本,每个样本特征是n维,则为m x n的矩阵(类型必须为double)。
/ l" F/ T# `) P' K7 h6 X3 E-libsvm_options:训练的参数,在第3点详细介绍。; g3 G! P8 {4 x# A0 Z: K
libsvmtrain函数返回训练好的SVM分类器模型model是一个结构体,包含以下成员:
% J7 J8 i/ p2 ^7 l) q! u, l- T
  k, n5 ^7 u  }; M$ r-Parameters: 一个5 x 1的矩阵,从上到下依次表示:
% \4 e* R4 E! V  a" ?6 {% i) F-s SVM类型(默认0);: H. d! C: b, I& p! @
-t 核函数类型(默认2)
" L/ K/ L7 @' |* J# B$ t' F2 |-d 核函数中的degree设置(针对多项式核函数)(默认3);+ K- j4 ~) G# ]
-g 核函数中的r(gamma)函数设置(针对多项式/rbf/sigmoid核函数) (默认类别数目的倒数);
, P* B/ y; `- T. U-r 核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)" k* w1 `) k0 U  \7 {% }/ T
-nr_class: 表示数据集中有多少类别,比如二分类时这个值即为2。
. `* N$ D% B$ v. `$ r; N5 O-totalSV: 表示支持向量的总数。$ Y" j! i: W/ U- `8 |
-rho: 决策函数wx+b中的常数项的相反数(-b)。0 v/ V! {: p- W; a9 b  n
-Label: 表示数据集中类别的标签,比如二分类常见的1和-1。
/ q1 [* `3 x  b8 r0 I-ProbA: 使用-b参数时用于概率估计的数值,否则为空。
- f2 Y+ Z' m/ K9 O-ProbB: 使用-b参数时用于概率估计的数值,否则为空。1 g  v2 F' L6 {' d! T* _$ h
-nSV: 表示每类样本的支持向量的数目,和Label的类别标签对应。如Label=[1; -1],nSV=[63; 67],则标签为1的样本有63个支持向量,标签为-1的有67个。
& G: O' M$ H" F' P-sv_coef: 表示每个支持向量在决策函数中的系数。
5 o6 N3 Z4 ~3 w( Y- i. Z-SVs: 表示所有的支持向量,如果特征是n维的,支持向量一共有m个,则为m x n的稀疏矩阵。2 k  R1 X6 U' x( I% i: q
另外,如果在训练中使用了-v参数进行交叉验证时,返回的不是一个模型,而是交叉验证的分类的正确率或者回归的均方根误差。
4 |& U' f) v8 r
! a! P* g: b; `. `) p当构建完成model后,还要为上述参数选择合适的值,方法主要有Gridsearch,其他的感觉不常用,Gridsearch说白了就是穷举。8 Z$ y% H8 q0 a
# h3 x5 B( n3 u" t4 Q) W7 L. G1 ]/ H

. V2 R. s" [+ n
& K% M, C. a) O- g网格参数寻优函数(分类问题):SVMcgForClass2 n6 O+ P0 g! D) I$ \
% ^* b3 t5 C0 w* l/ d; O
[bestCVaccuracy,bestc,bestg]=SVMcgForClass(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,accstep)
/ `2 I. ~' b% {% `, D
) ]5 W9 m7 }( K5 [% [; l输入:
+ ~8 S( o0 D5 q  Z7 ^- k
' `( _6 r" p. F" x& y+ o0 strain_label:训练集的标签,格式要求与svmtrain相同。# z1 d2 Q# l1 M7 }$ J( ?
train:训练集,格式要求与svmtrain相同。# {' ]; p9 @. e. k0 ]
cmin,cmax:惩罚参数c的变化范围,即在[2^cmin,2^cmax]范围内寻找最佳的参数c,默认值为cmin=-8,cmax=8,即默认惩罚参数c的范围是[2^(-8),2^8]。
+ v8 w6 B, m& [gmin,gmax:RBF核参数g的变化范围,即在[2^gmin,2^gmax]范围内寻找最佳的RBF核参数g,默认值为gmin=-8,gmax=8,即默认RBF核参数g的范围是[2^(-8),2^8]。- J1 J" i+ f2 c( e
v:进行Cross Validation过程中的参数,即对训练集进行v-fold Cross Validation,默认为3,即默认进行3折CV过程。$ f, J3 a8 D& z
cstep,gstep:进行参数寻优是c和g的步进大小,即c的取值为2^cmin,2^(cmin+cstep),…,2^cmax,,g的取值为2^gmin,2^(gmin+gstep),…,2^gmax,默认取值为cstep=1,gstep=1。" I9 L4 S# W9 D# y3 D
accstep:最后参数选择结果图中准确率离散化显示的步进间隔大小([0,100]之间的一个数),默认为4.5。& G) q' F- M* [! \
输出:5 d! J3 N" {# [  x1 ?/ U

# T4 B5 j3 @' M9 M9 lbestCVaccuracy:最终CV意义下的最佳分类准确率。2 j/ I5 T8 I5 l6 l
bestc:最佳的参数c。6 S7 {- W2 u1 g" x* U; J
bestg:最佳的参数g。
1 s/ y5 ~' a+ B" D
% J' `; Z2 }3 t" D, T9 j! W' t1 Q! ~
网格参数寻优函数(回归问题):SVMcgForRegress
/ X2 X9 n! u+ C" e; J0 {. O* D
$ c& f' j/ `. A* r) n- g' T2 v[bestCVmse,bestc,bestg]=SVMcgForRegress(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,msestep)
6 D" N, q) h$ l) u: J* J) |- R) Q' b; B0 h
其输入输出与SVMcgForClass类似,这里不再赘述。2 a) u( V, O1 o/ ^6 A) i
. o8 E! R/ O' k$ |# ^; m7 r
SVM 怎样能得到好的结果
$ ]7 M/ m" ~) D, M% y7 f# m2 y* R$ y$ L& ?& Y$ E& v+ s# J% w
1.   对数据做归一化(simple scaling)) T' L, v# ^8 [' Q6 R

! v& u1 L/ |' X5 M1 @! w. }+ c3 z8 B2.   应用 RBF kernel
2 W. P1 T4 l" O# k; [' E0 B& N( [
3.   用cross-validation和grid-search 得到最优的c和g1 {$ z5 w: t3 |# ^1 n1 w

% v0 b- b( V  x7 q4.   用得到的最优c和g训练训练数据" I  R) C6 s4 k5 r& k
+ }5 K' O4 C7 {: Q
5.   测试! q( I( q/ ^% G' @: R5 h  X% l
. n* t( b+ B. T0 f" F

% P& x' a) o1 l# O
6 T) j5 f  f, Q$ f/ ]. H9 }  E+ i% g- g关于svm的C以及核函数参数设置———————-! R' [& m1 @3 b5 d$ |! b

$ L, `) z1 l* a. d9 XC一般可以选择为:10^t , t=- 4..4就是0.0001 到10000, v  w# Q* S/ h  o4 K# M

+ ]& I! L1 w! S选择的越大,表示对错误例惩罚程度越大,可能会导致模型过拟合# C/ M, p6 @) b3 |
% e$ @8 A, p6 K0 B
2 R5 S: d0 ~4 Y# S8 R  D) `! k

  m. W! N+ R6 Q5 b( O. x' M在LIBSVM中-t用来指定核函数类型(默认值是2)。
0 y2 s, ~) C& l. }9 U/ J
. l5 D+ H! D; J) L0)线性核函数
' q. Q4 ?3 z. s; V" t- J$ r3 l( X5 m: h' l  Y% ?) g: @
(无其他参数)
) t6 G8 z/ z6 k
# p0 N" r# u( D1 ^1 Z! v1)多项式核函数9 s1 A. l$ {& ?$ m
, I# ^$ I6 D) S! K
(重点是阶数的选择,即d,一般选择1-11:1 3 5 7 9 11,也可以选择2,4,6…)7 I: H* n0 _* j) z6 a( _

; K$ t, k4 n0 Y7 R, Z2)RBF核函数
( b6 I' j  @: m
5 @" L/ _, b! V, D4 H(径向基RBF内核,exp{-|xi-xj|^2/均方差},其中均方差反映了数据波动的大小。
  s' E' c! K7 @6 x: o) @
3 L; i7 y" x* u+ }/ U3 d( D参数通常可选择下面几个数的倒数:0.1 0.2 0.4 0.6 0.8 1.6 3.2 6.4 12.8,默认的是类别数的倒数,即1/k,2分类的话就是0.5)
4 v' e6 q$ l- B  X, ^! X4 J6 a" {; G/ w$ m# k, s
3)sigmoid核函数 又叫做S形内核
2 q" f9 B/ A) j  ]9 {
4 T1 U  }3 _) a; X5 k( Z两个参数g以及r:g一般可选1 2 3 4,r选0.2 0.4 0.60.8 1
; M# g) ?- E$ _: f' h4 f6 O. y  G  C) x' Y) h. O4 z8 b' M$ n
4)自定义核函数9 \9 S- h# L6 D* _: V+ i
% i' @- G/ \0 j9 n# C+ P8 Y! T

* A! }2 V* ^! T. {0 K+ V! |7 b5 b. G4 ^. S
与核函数相对应的libsvm参数:
  f/ b# _) J* R
2 B/ m0 p) I' A0 @5 s8 q5 \1)对于线性核函数,没有专门需要设置的参数# _/ k. [+ p! Q. c3 A/ c
5 a/ A+ ?& Q) m" p) {
2)对于多项式核函数,有三个参数。-d用来设置多项式核函数的最高此项次数,也就是公式中的d,默认值是3。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/k(k是类别数)。-r用来设置核函数中的coef0,也就是公式中的第二个r,默认值是0。4 x- ^5 T! L7 C1 t$ k" s& s% f( ?

$ W- x: C( w0 n5 V3)对于RBF核函数,有一个参数。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/k(k是类别数)。
3 `6 U! I" P' b6 Y( I/ C, Z6 A; s, Y6 z& k  u: ?
4)对于sigmoid核函数,有两个参数。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/k(k是类别数)。-r用来设置核函数中的coef0,也就是公式中的第二个r,默认值是0。" o( K! L- Z; O3 |" O" k
) m- ~# h( }; M- j9 M
2. 预测# g0 [& i6 S! |# u3 \9 \
格式:
7 i1 ^( c9 q2 R# O4 S+ A[predicted_label, accuracy, decision_values/prob_estimates]& ^( x. z5 ^: J" U3 C$ Q8 G
= libsvmpredict(testing_label_vector, testing_instance_matrix, model [, ‘libsvm_options’]);6 L2 ~- d/ C. t' J' v) I" g+ L# |3 n
$ A( F3 s6 I; X
这个函数包括四个参数,其中: R+ c7 q3 s' C5 k% y: `6 G1 A
5 w: o$ Z8 V, Z" B
-testing_label_vector:测试样本的类标,如果有m个样本,就是m x 1的矩阵(类型必须为double)。如果类标未知,可以初始化为任意m x 1的double数组。
+ P% V- s! S" k2 U-testing_instance_matrix:测试样本的特征,如果有m个样本,每个样本特征是n维,则为m x n的矩阵(类型必须为double)。
$ o4 h) q8 T- S3 F' Y$ H-model:使用libsvmtrain返回的模型
/ _3 ~3 p" \: b; V  B6 c-libsvm_options:预测的参数,与训练的参数形式一样。% N) b2 e* b3 W; Y
libsvmpredict函数有三个返回值,不需要的值在Matlab可以用 ~ 进行代替。
- ~0 G. O6 M3 Y" H
1 Y: R% I# `; j4 o$ ~-predicted_label:第一个返回值,表示样本的预测类标号。
- e- C& C6 h9 G  _6 k# @-accuracy:第二个返回值,一个3 x 1的数组,表示分类的正确率、回归的均方根误差、回归的平方相关系数。
* T; o. D# c- f" G  A8 J-decision_values/prob_estimates:第三个返回值,一个矩阵包含决策的值或者概率估计。对于n个预测样本、k类的问题,如果指定“-b 1”参数,则n x k的矩阵,每一行表示这个样本分别属于每一个类别的概率;如果没有指定“-b 1”参数,则为n x k*(k-1)/2的矩阵,每一行表示k(k-1)/2个二分类SVM的预测结果。  Z/ r6 l/ X/ u$ d8 i, V
3. 训练的参数8 ?! N+ \4 o1 I$ _$ P
LIBSVM训练时可以选择的参数很多,包括:$ ~5 x; o0 a0 S) r, ]
) g# X$ z" F) }6 E/ [
-s svm类型:SVM设置类型(默认0)
, W$ |1 a' r1 A, w! e0 — C-SVC; 1 –v-SVC; 2 – 一类SVM; 3 — e-SVR; 4 — v-SVR5 Q: c- t9 w% i7 P
-t 核函数类型:核函数设置类型(默认2)* P) p# j5 M& x5 m1 T
0 – 线性核函数:u’v
, s9 h" l4 |0 ^4 C9 D7 M6 Q1 – 多项式核函数:(r*u’v + coef0)^degree
# z' Y$ m, R1 \$ k2 – RBF(径向基)核函数:exp(-r|u-v|^2)( K+ X9 {4 q8 `1 [9 R$ h
3 – sigmoid核函数:tanh(r*u’v + coef0)' j/ ]6 j1 `& m7 s% G
-d degree:核函数中的degree设置(针对多项式核函数)(默认3)% Y" l, q4 c* b
-g r(gamma):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)(默认1/k,k为总类别数)/ i, m1 _& t: n3 m4 H# j
-r coef0:核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)
# [. V4 E& g4 A. D9 k9 U1 p- I: j-c cost:设置C-SVC,e -SVR和v-SVR的参数(损失函数)(默认1)+ P4 h4 k- ]8 W0 j
-n nu:设置v-SVC,一类SVM和v- SVR的参数(默认0.5)
6 I2 r/ g, t( k2 _* N" u* S0 |$ `8 \-p p:设置e -SVR 中损失函数p的值(默认0.1)
- V# k" M5 I% N( F' z! `0 |) |-m cachesize:设置cache内存大小,以MB为单位(默认40)
! s8 v& P) L: Y8 U8 I, I  I-e eps:设置允许的终止判据(默认0.001)
. G9 p5 t- K" \7 ?$ H5 b% _-h shrinking:是否使用启发式,0或1(默认1)
  [& o& W% v& ^1 Q  K$ h4 `-wi weight:设置第几类的参数C为weight*C (C-SVC中的C) (默认1)
2 H  H  c  R% ~-v n: n-fold交互检验模式,n为fold的个数,必须大于等于2
. Z5 f! j8 W# H' U& \& s5 m/ {6 Z以上这些参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。
" e5 s' k1 D% S4 J
) b# ?3 V% u( c0 O" B# ?4. 读取或保存# B# ^, e/ Y" p2 g  b
libsvmread函数可以读取以LIBSVM格式存储的数据文件。/ W8 ]( S, J7 O% {& ~

- M) v& A8 x* [% N" e6 T( B- A[label_vector, instance_matrix] = libsvmread(‘data.txt’);9 n, U4 U0 N# `
' T2 E0 I4 n8 E4 \% Y  A
这个函数输入的是文件的名字,输出为样本的类标和对应的特征。
3 R3 j( Y6 D$ T( d/ }+ Q' p! U/ a4 q% Z. ^
libsvmwrite函数可以把Matlab的矩阵存储称为LIBSVM格式的文件。( ?* P( e1 ]% `8 G- ?7 w6 i- Z

* m8 j# G* d. r. G/ ~( U, hlibsvmwrite(‘data.txt’, label_vector, instance_matrix]9 S  E6 R, Q* ?1 Q0 [4 {+ U
1 `; b' s. |( ], r
这个函数有三个输入,分别为保存的文件名、样本的类标和对应的特征(必须为double类型的稀疏矩阵)。

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-6 22:43 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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