MATLAB中SVM(⽀持向量机)的⽤法
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)
0 — C-SVC
1 –v-SVC
2 – ⼀类SVM
3 — e -SVR
4 — v-SVR
-t 核函数类型:核函数设置类型(默认2)
0 – 线性:u’v
1 – 多项式:(r*u’v + coef0)^degree
2 – RBF函数:exp(-r|u-v|^2)
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即可。
b) 虽然说RBF核的结果⾄少⽐线性核好,前提下搜索整个的空间。
(3) 样本数<<;特征数的情况:推荐使⽤线性核,可以达到与RBF同样的性能。
(4) 样本数和特征数都⾮常多:推荐使⽤liblinear,更少的时间和内存,可⽐的准确率。
(5) 样本数>>特征数:如果想使⽤线性模型,可以使⽤liblinear,并且使⽤-s 2参数
详解:
1. 训练
格式:
model = libsvmtrain(training_label_vector, training_instance_matrix [, ‘libsvm_options’]);
这个函数有三个参数,其中
-training_label_vector:训练样本的类标,如果有m个样本,就是m x 1的矩阵(类型必须为double)。这⾥可以是⼆分类和多分类,类标是(-1,1)、(1,2,3)或者其他任意⽤来表⽰不同的类别的数字,要转成double类型。
-training_instance_matrix:训练样本的特征,如果有m个样本,每个样本特征是n维,则为m x n的矩阵(类型必须为double)。
-libsvm_options:训练的参数,在第3点详细介绍。
libsvmtrain函数返回训练好的SVM分类器模型model是⼀个结构体,包含以下成员:
-Parameters: ⼀个5 x 1的矩阵,从上到下依次表⽰:
-s SVM类型(默认0);
-t 核函数类型(默认2)
-d 核函数中的degree设置(针对多项式核函数)(默认3);
-g 核函数中的r(gamma)函数设置(针对多项式/rbf/sigmoid核函数) (默认类别数⽬的倒数);
-r 核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)
-nr_class: 表⽰数据集中有多少类别,⽐如⼆分类时这个值即为2。
-totalSV: 表⽰⽀持向量的总数。
-rho: 决策函数wx+b中的常数项的相反数(-b)。
-Label: 表⽰数据集中类别的标签,⽐如⼆分类常见的1和-1。
-ProbA: 使⽤-b参数时⽤于概率估计的数值,否则为空。
-ProbB: 使⽤-b参数时⽤于概率估计的数值,否则为空。
-nSV: 表⽰每类样本的⽀持向量的数⽬,和Label的类别标签对应。如Label=[1; -1],nSV=[63; 67],则标签为1的样本有63个⽀持向量,标签为-1的有67个。
-sv_coef: 表⽰每个⽀持向量在决策函数中的系数。
-SVs: 表⽰所有的⽀持向量,如果特征是n维的,⽀持向量⼀共有m个,则为m x n的稀疏矩阵。
另外,如果在训练中使⽤了-v参数进⾏交叉验证时,返回的不是⼀个模型,⽽是交叉验证的分类的正确率或者回归的均⽅根误差。
当构建完成model后,还要为上述参数选择合适的值,⽅法主要有Gridsearch,其他的感觉不常⽤,Gridsearch说⽩了就是穷举。
⽹格参数寻优函数(分类问题):SVMcgForClass
[bestCVaccuracy,bestc,bestg]=SVMcgForClass(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,accstep)
输⼊:
train_label:训练集的标签,格式要求与svmtrain相同。
train:训练集,格式要求与svmtrain相同。
cmin,cmax:惩罚参数c的变化范围,即在[2^cmin,2^cmax]范围内寻最佳的参数c,默认值为cmin=-8,cmax=8,即默认惩罚参数c的范围是[2^(-8),2^8]。
gmin,gmax:RBF核参数g的变化范围,即在[2^gmin,2^gmax]范围内寻最佳的RBF核参数g,默认值为gmin=-8,gmax=8,即默认RBF核参数g的范围是[2^(-8),2^8]。
v:进⾏Cross Validation过程中的参数,即对训练集进⾏v-fold Cross Validation,默认为3,即默认进⾏3折CV过程。
cstep,gstep:进⾏参数寻优是c和g的步进⼤⼩,即c的取值为2^cmin,2^(cmin+cstep),…,2^cmax,,g的取值为
2^gmin,2^(gmin+gstep),…,2^gmax,默认取值为cstep=1,gstep=1。
accstep:最后参数选择结果图中准确率离散化显⽰的步进间隔⼤⼩([0,100]之间的⼀个数),默认为4.5。
输出:
bestCVaccuracy:最终CV意义下的最佳分类准确率。
bestc:最佳的参数c。
bestg:最佳的参数g。
⽹格参数寻优函数(回归问题):SVMcgForRegress
[bestCVmse,bestc,bestg]=SVMcgForRegress(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,msestep)
其输⼊输出与SVMcgForClass类似,这⾥不再赘述。
SVM 怎样能得到好的结果
1. 对数据做归⼀化(simple scaling)
2. 应⽤ RBF kernel
3. ⽤cross-validation和grid-search 得到最优的c和g
4. ⽤得到的最优c和g训练训练数据
5. 测试
关于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。
1. 预测
格式:
[predicted_label, accuracy, decision_values/prob_estimates] = libsvmpredict(testing_label_vector,
testing_instance_matrix, model [, ‘libsvm_options’]);
这个函数包括四个参数,其中
-testing_label_vector:测试样本的类标,如果有m个样本,就是m x 1的矩阵(类型必须为double)。如果类标未知,可以初始化为任意m x 1的double数组。
-testing_instance_matrix:测试样本的特征,如果有m个样本,每个样本特征是n维,则为m x n的矩阵(类型必须为double)。
-model:使⽤libsvmtrain返回的模型
-libsvm_options:预测的参数,与训练的参数形式⼀样。
libsvmpredict函数有三个返回值,不需要的值在Matlab可以⽤ ~ 进⾏代替。
-predicted_label:第⼀个返回值,表⽰样本的预测类标号。
-accuracy:第⼆个返回值,⼀个3 x 1的数组,表⽰分类的正确率、回归的均⽅根误差、回归的平⽅相关系数。
-decision_values/prob_estimates:第三个返回值,⼀个矩阵包含决策的值或者概率估计。对于n个预测样本、k类的问题,如果指定“-b 1”参数,则n x k的矩阵,每⼀⾏表⽰这个样本分别属于每⼀个类别的概率;如果没有指定“-b 1”参数,则为n x k*(k-1)/2的矩阵,每⼀⾏表⽰k(k-1)/2个⼆分类SVM的预测结果。
3. 训练的参数
LIBSVM训练时可以选择的参数很多,包括:
-s svm类型:SVM设置类型(默认0)
0 — C-SVC; 1 –v-SVC; 2 – ⼀类SVM; 3 — e-SVR; 4 — v-SVR
-t 核函数类型:核函数设置类型(默认2)
0 – 线性核函数:u’v
write的返回值1 – 多项式核函数:(r*u’v + coef0)^degree
2 – RBF(径向基)核函数:exp(-r|u-v|^2)
3 – sigmoid核函数:tanh(r*u’v + coef0)
-d degree:核函数中的degree设置(针对多项式核函数)(默认3)
-g r(gamma):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)(默认1/k,k为总类别数)
-r coef0:核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)
-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)
-m cachesize:设置cache内存⼤⼩,以MB为单位(默认40)
-e eps:设置允许的终⽌判据(默认0.001)
-h shrinking:是否使⽤启发式,0或1(默认1)
-wi weight:设置第⼏类的参数C为weight*C (C-SVC中的C) (默认1)
-v n: n-fold交互检验模式,n为fold的个数,必须⼤于等于2
以上这些参数设置可以按照SVM的类型和核函数所⽀持的参数进⾏任意组合,如果设置的参数在函数或SVM类型中没有也不会产⽣影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采⽤默认值。
1. 读取或保存
libsvmread函数可以读取以LIBSVM格式存储的数据⽂件。
[label_vector, instance_matrix] = libsvmread(‘’);
这个函数输⼊的是⽂件的名字,输出为样本的类标和对应的特征。
libsvmwrite函数可以把Matlab的矩阵存储称为LIBSVM格式的⽂件。
libsvmwrite(‘’, label_vector, instance_matrix]
这个函数有三个输⼊,分别为保存的⽂件名、样本的类标和对应的特征(必须为double类型的稀疏矩阵)。
以上内容摘抄⾃CSDN:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。