svmtrain函数:
model= svmtrain(train_label, train_matrix, [‘libsvm_options’]);
其中:
train_label表示训练集的标签。
train_matrix表示训练集的属性矩阵。
libsvm_options是需要设置的一系列参数,各个参数可参见help svmtrain。如果用回归的话,其中的-s参数值应为3。
libsvm在训练model的时候,有如下参数要设置,当然有默认的参数,但是在具体应用方面效果会大大折扣。
libsvm options:可用的选项即表示的涵义如下
> -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(-gamma|u-v|^2)
3 –sigmoid:tanh(r*u'v + coef0)
-d degree:核函数中的degree设置(针对多项式核函数)(默认3)
-g r(gama):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)(默认1/ 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
其中-g选项中的k是指输入数据中的属性数。option -v 随机地将数据剖分为n部
当构建完成model后,还要为上述参数选择合适的值,
方法主要有Gridsearch,其他的感觉不常用,Gridsearch说白了就是穷举。
注意:如果在训练中使用了-v参数进行交叉验证时,返回的不是一个模型,而是交叉验证的分类的正确率或者回归的均方根误差。
model:是训练得到的模型,是一个结构体(如果参数中用到-v,得到的就不是结构体,对于分类问题,得到的是交叉检验下的平均分类准确率;对于回归问题,得到的是均方误差)。
Parameters: [5x1 double] %结构体变量,依次保存的是 -s -t -d -g -r等参数
nr_class: 4 %分类的个数
totalSV: 39 %总的支持向量个数
rho: [6x1 double] %b=-model.rho
Label: [4x1 double]
ProbA: []
ProbB: []
nSV: [4x1 double] %每一类的支持向量的个数
sv_coef: [39x3 double] %支持向量的系数
SVs: [39x12 double] %具体的支持向量,以稀疏矩阵的形式存储
w*x+b=0 其中
w=model.SVs'*model.sv_coef
b=-model.rho
w是高维空间中分类 超平面的法向量,b是常数项。
输出的结果为
optimization finished,
#iter = 162
nu = 0.431029
obj = -100.877288,
rho = 0.424462
nSV = 132,
nBSV = 107
Total nSV = 132
其中,#iter为迭代次数,
nu是你选择的核函数类型的参数,
obj为SVM文件转换为的二次规划求解得到的最小值,
rho为判决函数的偏置项b,
nSV为标准支持向量个数,
nBSV为边界上的支持向量个数(a[i]=c),
Total nSV为支持向量总个数(对于两类来说,因为只有一个分类模型Total nSV = nSV,
但是对于多类,这个是各个分类模型的nSV之和)。
libsvm使用误区----------------------
(1) 直接将训练集合和测试集合简单归一化到[0,1]区间,可能导致实验结果很差。
(2) 如果样本的特征数非常多,那么就不必使用RBF核将样本映射到高维空间。
a) 在特征数非常多的情况下,使用线性核,结果已经非常好,并且只需要选择参数C即可。
b) 虽然说RBF核的结果至少比线性核好,前提下搜索整个的空间。
(3) 样本数<<特征数的情况:
a) 推荐使用线性核,可以达到与RBF同样的性能。
(4) 样本数和特征数都非常多:推荐使用liblinear,更少的时间和内存,可比的准确率。
(5) 样本数>>特征数:如果想使用线性模型,可以使用liblinear,并且使用-s 2参数
SVM 怎样能得到好的结果
- 对数据做归一化(simple scaling)
- 应用 RBF kernel
- 用cross-validation和grid-search 得到最优的c和g
- 用得到的最优c和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。