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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

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

注意不是matlab自带的svm实现函数,自带的svm实现函数仅支持分类问题,不支持回归问题;而libsvm不仅支持分类问题,亦支持回归问题,参数可调节,功能更强大。

libsvm的配置很简单,只需要下载高级版本的matlab和libsvm,VC或VS编译实现很简单的,这里就不细讲了。

两个步骤:训练建模——>模型预测

分类 model = svmtrain(trainlabel, traindata, ‘-s 0 -t 2 -c 1.2 -g 2.8’);

回归 model = svmtrain(trainlabel, traindata, ‘-s 3 -t 2 -c 2.2 -g 2.8 -p 0.01’);

参数说明:

-s svm类型:SVM设置类型(默认0) 6 j# y; J2 j* s6 i, o
0 — C-SVC
/ e0 f8 }' L  J/ p& ]0 O/ c! f1 –v-SVC
& P$ Y! z  `$ f5 X5 r2 – 一类SVM
+ T" _3 n2 {' M4 x0 [1 E* J1 _3 — e -SVR 0 W" t6 ~2 n0 v) U* ^( G2 F
4 — v-SVR

-t 核函数类型:核函数设置类型(默认2) ' f* b/ Q! N) ?* H! d7 g, v
0 – 线性:u’v ( s% t4 C6 h: Z) [/ @% u
1 – 多项式:(r*u’v + coef0)^degree
2 T7 X! Q9 \0 w2 – RBF函数:exp(-r|u-v|^2) ) x. H; F' h( G4 z
3 –sigmoid:tanh(r*u’v + coef0)

-g r(gama):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)

-c cost:设置C-SVC,e -SVR和v-SVR的参数(损失函数)(默认1),惩罚系数

-n nu:设置v-SVC,一类SVM和v- SVR的参数(默认0.5)

-p p:设置e -SVR 中损失函数p的值(默认0.1)

-d degree:核函数中的degree设置(针对多项式核函数)(默认3)

-wi weight:设置第几类的参数C为weight*C(C-SVC中的C)(默认1)

-v n: n-fold交互检验模式,n为fold的个数,必须大于等于2

libsvm使用误区———————-

(1) 直接将训练集合和测试集合简单归一化到[0,1]区间,可能导致实验结果很差。

(2) 如果样本的特征数非常多,那么就不必使用RBF核将样本映射到高维空间。

a) 在特征数非常多的情况下,使用线性核,结果已经非常好,并且只需要选择参数C即可。
) Y( a) n& k: t& bb) 虽然说RBF核的结果至少比线性核好,前提下搜索整个的空间。   G  ~% j8 I$ n5 \8 X! u7 U- V
(3) 样本数<<特征数的情况:推荐使用线性核,可以达到与RBF同样的性能。

(4) 样本数和特征数都非常多:推荐使用liblinear,更少的时间和内存,可比的准确率。

(5) 样本数>>特征数:如果想使用线性模型,可以使用liblinear,并且使用-s 2参数

详解:

  • 训练 4 W9 s  }6 j9 \
    格式:
    % ~; ]8 B$ z) U$ z7 |; Dmodel = libsvmtrain(training_label_vector, training_instance_matrix [, ‘libsvm_options’]);
    # A" t/ X8 [4 l% |2 k% H; }- L

这个函数有三个参数,其中

-training_label_vector:训练样本的类标,如果有m个样本,就是m x 1的矩阵(类型必须为double)。这里可以是二分类和多分类,类标是(-1,1)、(1,2,3)或者其他任意用来表示不同的类别的数字,要转成double类型。
# j& I( M, @# A-training_instance_matrix:训练样本的特征,如果有m个样本,每个样本特征是n维,则为m x n的矩阵(类型必须为double)。 # a# G* _4 W1 l+ y: G5 r3 _+ c
-libsvm_options:训练的参数,在第3点详细介绍。 ' Y( X2 ?' X1 ?5 \+ J/ u$ j& m
libsvmtrain函数返回训练好的SVM分类器模型model是一个结构体,包含以下成员:

-Parameters: 一个5 x 1的矩阵,从上到下依次表示:
% k6 D5 J' s" H: D, ?& |-s SVM类型(默认0);
; H3 A- g3 t6 q-t 核函数类型(默认2)
! \  ]) X$ U. P2 e+ x1 V-d 核函数中的degree设置(针对多项式核函数)(默认3); 5 V* p2 W! [9 Q, q8 b0 X5 o
-g 核函数中的r(gamma)函数设置(针对多项式/rbf/sigmoid核函数) (默认类别数目的倒数);
  f* k+ n# t: c6 B) ]( D+ i+ k; g-r 核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)
4 z7 ^% v+ A( Q  Y4 Y2 g( I-nr_class: 表示数据集中有多少类别,比如二分类时这个值即为2。 1 G( j! J8 l* u6 K% R
-totalSV: 表示支持向量的总数。 + d4 U4 O  F+ Q, b" B, b
-rho: 决策函数wx+b中的常数项的相反数(-b)。 8 n7 o# V2 `2 H- a5 g8 J& u2 L' v
-Label: 表示数据集中类别的标签,比如二分类常见的1和-1。
" G  |+ V, v7 j5 {5 e7 y-ProbA: 使用-b参数时用于概率估计的数值,否则为空。
4 R1 i# q( `' f% j1 k2 y-ProbB: 使用-b参数时用于概率估计的数值,否则为空。 0 D5 b9 H$ c: s: a
-nSV: 表示每类样本的支持向量的数目,和Label的类别标签对应。如Label=[1; -1],nSV=[63; 67],则标签为1的样本有63个支持向量,标签为-1的有67个。 ) ^4 D/ g* [+ y  L! u& s& ?
-sv_coef: 表示每个支持向量在决策函数中的系数。
2 o, ~; n0 A9 m# x" h-SVs: 表示所有的支持向量,如果特征是n维的,支持向量一共有m个,则为m x n的稀疏矩阵。
) f  {( {' e0 i* j另外,如果在训练中使用了-v参数进行交叉验证时,返回的不是一个模型,而是交叉验证的分类的正确率或者回归的均方根误差。

当构建完成model后,还要为上述参数选择合适的值,方法主要有Gridsearch,其他的感觉不常用,Gridsearch说白了就是穷举。

网格参数寻优函数(分类问题):SVMcgForClass

[bestCVaccuracy,bestc,bestg]=SVMcgForClass(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,accstep) % [8 i& F; \/ f
输入:

train_label:训练集的标签,格式要求与svmtrain相同。
2 i' U0 H" U  n  n' |" W! ntrain:训练集,格式要求与svmtrain相同。
& o! |; x/ W* \2 E; icmin,cmax:惩罚参数c的变化范围,即在[2^cmin,2^cmax]范围内寻找最佳的参数c,默认值为cmin=-8,cmax=8,即默认惩罚参数c的范围是[2^(-8),2^8]。
* c/ U4 O& J) E3 @gmin,gmax:RBF核参数g的变化范围,即在[2^gmin,2^gmax]范围内寻找最佳的RBF核参数g,默认值为gmin=-8,gmax=8,即默认RBF核参数g的范围是[2^(-8),2^8]。
: S4 ]: I- g5 B; z0 C! s( S8 F0 Sv:进行Cross Validation过程中的参数,即对训练集进行v-fold Cross Validation,默认为3,即默认进行3折CV过程。 9 ?6 }: t6 I% v8 w$ `
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 X( @1 s# g- u$ U5 m- a+ yaccstep:最后参数选择结果图中准确率离散化显示的步进间隔大小([0,100]之间的一个数),默认为4.5。
4 Z/ c- e* A) ?0 j/ K# @输出:

bestCVaccuracy:最终CV意义下的最佳分类准确率。 $ ^6 ~' j. j" Q0 r" {2 t1 G
bestc:最佳的参数c。
5 }$ s8 m6 q$ @: m6 `bestg:最佳的参数g。

网格参数寻优函数(回归问题):SVMcgForRegress

[bestCVmse,bestc,bestg]=SVMcgForRegress(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,msestep)
( [* G5 Q! \  B6 a其输入输出与SVMcgForClass类似,这里不再赘述。

SVM 怎样能得到好的结果

  • 对数据做归一化(simple scaling)

  • 应用 RBF kernel

  • 用cross-validation和grid-search 得到最优的c和g

  • 用得到的最优c和g训练训练数据

  • 测试

    0 X, ]* Q1 ~$ L# v& u: W8 j* g

关于svm的C以及核函数参数设置———————-

C一般可以选择为:10^t , t=- 4..4就是0.0001 到10000

选择的越大,表示对错误例惩罚程度越大,可能会导致模型过拟合

在LIBSVM中-t用来指定核函数类型(默认值是2)。

0)线性核函数

(无其他参数)

1)多项式核函数

(重点是阶数的选择,即d,一般选择1-11:1 3 5 7 9 11,也可以选择2,4,6…)

2)RBF核函数

(径向基RBF内核,exp{-|xi-xj|^2/均方差},其中均方差反映了数据波动的大小。

参数通常可选择下面几个数的倒数:0.1 0.2 0.4 0.6 0.8 1.6 3.2 6.4 12.8,默认的是类别数的倒数,即1/k,2分类的话就是0.5)

3)sigmoid核函数 又叫做S形内核

两个参数g以及r:g一般可选1 2 3 4,r选0.2 0.4 0.60.8 1

4)自定义核函数

与核函数相对应的libsvm参数:

1)对于线性核函数,没有专门需要设置的参数

2)对于多项式核函数,有三个参数。-d用来设置多项式核函数的最高此项次数,也就是公式中的d,默认值是3。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/k(k是类别数)。-r用来设置核函数中的coef0,也就是公式中的第二个r,默认值是0。

3)对于RBF核函数,有一个参数。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/k(k是类别数)。

4)对于sigmoid核函数,有两个参数。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/k(k是类别数)。-r用来设置核函数中的coef0,也就是公式中的第二个r,默认值是0。

  • 预测
    0 k7 }# _. ?+ ~" x# }1 i5 o格式: 8 `3 H5 d" M: G+ R
    [predicted_label, accuracy, decision_values/prob_estimates] = libsvmpredict(testing_label_vector, testing_instance_matrix, model [, ‘libsvm_options’]);# \( T: N  G7 q. G- \8 x! T/ T! m

这个函数包括四个参数,其中

-testing_label_vector:测试样本的类标,如果有m个样本,就是m x 1的矩阵(类型必须为double)。如果类标未知,可以初始化为任意m x 1的double数组。
1 z3 R: }1 ]1 P* x; r& n2 Q-testing_instance_matrix:测试样本的特征,如果有m个样本,每个样本特征是n维,则为m x n的矩阵(类型必须为double)。
0 J& M0 \6 z4 W! O2 V-model:使用libsvmtrain返回的模型 " l; l' t" \5 m* h* d
-libsvm_options:预测的参数,与训练的参数形式一样。 , H# k' C4 I6 \$ v' q9 h  Y
libsvmpredict函数有三个返回值,不需要的值在Matlab可以用 ~ 进行代替。

-predicted_label:第一个返回值,表示样本的预测类标号。 ; z! ?6 x& _0 a9 p1 {7 E
-accuracy:第二个返回值,一个3 x 1的数组,表示分类的正确率、回归的均方根误差、回归的平方相关系数。
. j) V( X4 e+ ^, k% [& s+ B! W-decision_values/prob_estimates:第三个返回值,一个矩阵包含决策的值或者概率估计。对于n个预测样本、k类的问题,如果指定“-b 1”参数,则n x k的矩阵,每一行表示这个样本分别属于每一个类别的概率;如果没有指定“-b 1”参数,则为n x k*(k-1)/2的矩阵,每一行表示k(k-1)/2个二分类SVM的预测结果。 5 ?4 ~/ H4 m+ Z; w
3. 训练的参数 . r: |2 H" g, L$ m8 j' ^/ m
LIBSVM训练时可以选择的参数很多,包括:

-s svm类型:SVM设置类型(默认0)
- S; N3 v* k/ Q0 — C-SVC; 1 –v-SVC; 2 – 一类SVM; 3 — e-SVR; 4 — v-SVR # n7 @9 @3 _" L
-t 核函数类型:核函数设置类型(默认2) " h- X1 s$ o6 }; J: I$ V
0 – 线性核函数:u’v . f' t$ ^0 G, c$ [
1 – 多项式核函数:(r*u’v + coef0)^degree + M0 o+ I$ ?7 m" Y& A
2 – RBF(径向基)核函数:exp(-r|u-v|^2)
1 Y2 G! s; L: r- H/ k* I6 O3 – sigmoid核函数:tanh(r*u’v + coef0)
1 I% C- F: C, P! T  g: P, N1 G* y' ?% E7 Q-d degree:核函数中的degree设置(针对多项式核函数)(默认3)
% y; \2 Z7 h* ~; e2 F+ l: X1 A+ q-g r(gamma):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)(默认1/k,k为总类别数)
3 [# t4 \! A& R' i3 M( Q-r coef0:核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0) 5 U# s2 ?; ~, L) Z* n
-c cost:设置C-SVC,e -SVR和v-SVR的参数(损失函数)(默认1) + r7 J; }0 W4 J( M* D( n* \
-n nu:设置v-SVC,一类SVM和v- SVR的参数(默认0.5) 1 N! [8 N3 P; M8 H% `
-p p:设置e -SVR 中损失函数p的值(默认0.1) 8 R, x3 X% ^$ H7 e/ D- v
-m cachesize:设置cache内存大小,以MB为单位(默认40)   n- Y- Z+ [) O) q0 ?- D  y) n
-e eps:设置允许的终止判据(默认0.001) 0 w4 W) @+ C: o& {4 A* f
-h shrinking:是否使用启发式,0或1(默认1) ' i; {) R+ l) l1 \# A1 l; z9 n
-wi weight:设置第几类的参数C为weight*C (C-SVC中的C) (默认1) , A0 d2 S% Y& ]5 e& g6 b
-v n: n-fold交互检验模式,n为fold的个数,必须大于等于2 ) l; \* q  Z5 Z. \
以上这些参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。

  • 读取或保存 4 A2 Q0 G: q4 I
    libsvmread函数可以读取以LIBSVM格式存储的数据文件。/ Z  v, f; T/ g+ Y* @! a6 Y+ v

[label_vector, instance_matrix] = libsvmread(‘data.txt’);

这个函数输入的是文件的名字,输出为样本的类标和对应的特征。

libsvmwrite函数可以把Matlab的矩阵存储称为LIBSVM格式的文件。

libsvmwrite(‘data.txt’, label_vector, instance_matrix]

这个函数有三个输入,分别为保存的文件名、样本的类标和对应的特征(必须为double类型的稀疏矩阵)。


) g. t* H& ~6 l( c# K

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-25 09:57 , Processed in 0.078125 second(s), 23 queries , Gzip On.

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

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

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