libsvm3.22——使用指南

关于libsvm的使用,官方文档和matlab中文论坛大神faruto已经写得很明白,针对libsvm3.22版本稍稍有一点需要改进的。

参考来源:

网址:http://www.csie.ntu.edu.tw/~cjlin/libsvm/

参考文档:《A practical guide to SVM classification》

matlab中文论坛: http://www.matlabsky.com/thread-10966-1-1.html


具体步骤如下:

(1)数据的处理:

LIBSVM使用的数据格式
该软件使用的训练数据和检验数据文件格式如下:

其中

例如:+1 1:0.708 2:1 3:1 4:-0.320 5:-0.105 6:-1 8:1.21


(2)缩放数据:

svmscale [-l lower] [-u upper] [-y y_lowery_upper] [-s save_filename] [-r restore_filename] filename;

缺省值: lower = -1,upper = 1,没有对y进行缩放

其中,
-l:数据下限标记;lower:缩放后数据下限;
-u:数据上限标记;upper:缩放后数据上限;
-y:是否对目标值同时进行缩放;y_lower为下限值,y_upper为上限值;
-s save_filename:表示将缩放的规则保存为文件save_filename;
-r restore_filename:表示将缩放规则文件restore_filename载入后按此缩放;
filename:待缩放的数据文件(要求满足前面所述的格式)。

数据集的缩放结果在此情况下通过DOS窗口输出,当然也可以通过DOS的
文件重定向符号“>”将结果另存为指定的文件。

(缩放规则文件可以用文本浏览器打开,看到其格式为:
lower upper
lval1 uval1
lval2 uval2
其中的lower 与upper 与使用时所设置的lower 与upper 含义相同;index 表
示特征序号;lval 为该特征对应转换后下限lower 的特征值;uval 为对应于转换后上限upper 的特征值。)

使用实例:
例子一: svmscale –s train3.range train3>train3.scale
表示采用缺省值(即对属性值缩放到[ -1,1]的范围,对目标值不进行缩放)
对数据集train3 进行缩放操作,其结果缩放规则文件保存为train3.range,缩放集的缩放结果保存为train3.scale。
例子二: svmscale –r train3.range test3>test3.scale
表示载入缩放规则train3.range 后按照其上下限对应的特征值和上下限值线
性的地对数据集test3 进行缩放,结果保存为test3.scale。

此外,还可以使用matlab中的归一化方法比如mapminmax。


(3)(4)RBF核函数——求最优的C和  ——交叉验证+grid-search 。

一个工具:grid.py 。

具体使用见下一篇文章。 libsvm——参数优化工具grid.py的使用


(5)训练SVM。

Svmtrain的用法:model =svmtrain(training_label_vector, training_instance_matrix 

[, 'libsvm_options']);

training_label_vectorAn m by 1 vector of training labels (type mustbe double)

training_instance_matrixAn m by n matrix of m training instances with nfeatures.libsvm_options:可用的选项即表示的涵义非常多。这些参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。

具体可用参数如下:

-s svm类型:SVM设置类型(默认0)
0 -- C-SVC
1 --v-SVC
2 – one-class-SVM
3 -- e -SVR
4 -- v-SVR
-t 核函数类型:核函数设置类型(默认2)
0 – 线性:u'*v
1 – 多项式:(gamma*u'*v + coef0)^degree
2 – RBF函数:exp(-gamma*|u-v|^2)  
3 –sigmoid:tanh(gamma*u'*v + coef0)
-d degree:核函数中的degree设置(默认3)
-g gamma:核函数中的g函数设置(默认1/ k) ,k是指输入数据中的属性数
-r coef0:核函数中的coef0设置(默认0)
-c cost:设置C-SVC,e-SVR和v-SVR的参数(默认1)
-n nu:设置v-SVC,one-class-SVM和v-SVR的参数(默认0.5)
-p e:设置e-SVR 中损失函数e的值(默认0.1)
-m cachesize:设置cache内存大小,以MB为单位(默认40)
-e e:设置终止准则中的可容忍偏差(默认0.001)
-h shrinking:是否使用启发式,0或1(默认1)

b 概率估计:是否计算SVC或SVR的概率估计,可选值0 或1(默认0);
-wi weight:设置第几类的参数C为weight´C(C-SVC中的C)(默认1)
-v n: n-fold交互检验模式


运行结果(在命令行中显示):
optimization finished, #iter = 1756
nu = 0.464223
obj = -551.002342, rho = -0.337784
nSV = 604, nBSV = 557
Total nSV = 604
其中,#iter为迭代次数;

nu 与前面的操作参数-n n 相同;

obj为SVM文件转换为的二次规划求解得到的最小值;

rho 为判决函数的常数项b;

nSV 为支持向量个数;

nBSV为边界上的支持向量个数;

Total nSV为支持向量总个数。

svmtrain返回一个model结构体(分类问题):

其中的参数意义为:http://www.matlabsky.com/thread-12649-1-1.html


返回结果model的含义:

-Parameters: parameters

       -nr_class: number of classes; = 2 for regression/one-class svm

       -totalSV: total #SV

       -rho: -b of the decision function(s) wx+b

       -Label: label of each class; empty for regression/one-class SVM

       -sv_indices: values in [1,...,num_traning_data] to indicate SVs in thetraining set

       -ProbA: pairwise probability information; empty if -b 0 or in one-classSVM

       -ProbB: pairwise probability information; empty if -b 0 or in one-classSVM

       -nSV: number of SVs for each class; empty for regression/one-class SVM

       -sv_coef: coefficients for SVs in decision functions

       -SVs: support vectors


(6)测试模型。

Svmpredict的用法:svmpredict [options]test_file model_file output_file;

options(操作参数):

-b probability_estimates:是否需要进行概率估计预测,可选值为0 或者1,默认值为0;


返回值含义:

predicted_label预测后得到的label

accuracy3 by 1的向量。包括(分类)准确率accuracy、均方误差mean

squared error、(回归)相关系数误差squared correlation coefficient (for regression)

而且squared correlation coefficient (for regression)越接近你越好,代表回归模型精度越高。



本文精华:

1、如果当前目录在libsvm下,那么就会调用libsvm的svmtrain,而自带的svmtrain的调用格式和libsvm的svmtrain的格式是不一样的,自带的格式是SVMStruct = svmtrain(‘训练矩阵’,‘训练标签’ 'Showplot',ShowplotValue, ...),而libsvm的格式需要把标签写在第一个参数,若想使用自带的,那么把libsvm的路径从搜索路径中删除,即set path然后remove,并且把当前目录切换到toolbox下。

2、不同版本有略微差异。比如安装3.22版本,svmpredict的返回值是三个。而教程上的是两个,导致无法得到结果。





你可能感兴趣的:(SVM)