转载自http://blog.sina.com.cn/s/blog_59d470310100guu3.html
1. LIBSVM 软件包简介
LIBSVM 是台湾大学林智仁(Chih-Jen Lin)博士等开发设计的一个操作简单、易于使用、快速有效的通用SVM 软件包,可以解决分类问题(包括C- SVC、n - SVC )、回归问题(包括e - SVR、n - SVR )以及分布估计(one-class-SVM )等问题,提供了线性、多项式、径向基和S形函数四种常用的核函数供选择,可以有效地解决多类问题、交叉验证选择参数、对不平衡样本加权、多类问题的概率估计等。LIBSVM 是一个开源的软件包,需要者都可以免费的从作者的个人主页http://www.csie.ntu.edu.tw/~cjlin/ 处获得。他不仅提供了LIBSVM的C++语言的算法源代码,还提供了Python、Java、R、MATLAB、Perl、Ruby、LabVIEW
以及C#.net 等各种语言的接口,可以方便的在Windows 或UNIX 平台下使用,
也便于科研工作者根据自己的需要进行改进(譬如设计使用符合自己特定问题需要的核函数等)。另外还提供了WINDOWS 平台下的可视化操作工具SVM-toy,并且在进行模型参数选择时可以绘制出交叉验证精度的等高线图。
2. LIBSVM 使用方法简介
LIBSVM 在给出源代码的同时还提供了Windows操作系统下的可执行文件,包括:进行支持向量机训练的svmtrain.exe;根据已获得的支持向量机模型对数据集进行预测的svmpredict.exe;以及对训练数据与测试数据进行简单缩操作的svmscale.exe。它们都可以直接在DOS 环境中使用。如果下载的包中只有C++
的源代码,则也可以自己在VC等软件上编译生成可执行文件。
LIBSVM 使用的一般步骤是:
1) 按照LIBSVM软件包所要求的格式准备数据集;
2) 对数据进行简单的缩放操作;
3) 考虑选用RBF 核函数2 K(x,y) e x y = -g - ;
4) 采用交叉验证选择最佳参数C与g ;
5) 采用最佳参数C与g 对整个训练集进行训练获取支持向量机模型;
6) 利用获取的模型进行测试与预测。
一. LIBSVM 使用的数据格式
LIBSVM使用的训练数据和测试数据文件格式如下:
: :< 2> …
其中 是训练数据集的目标值,对于分类,它是标识某类的整数(支持多个类);对于回归,是任意实数。是以1 开始的整数,表示特征的序号;为实数,也就是我们常说的特征值或自变量。当特征值为0 时,特征序号与特征值都可以同时省略,即index可以是不连续的自然数。与第一个特征序号、前一个特征值与后一个特征序号之间用空格隔开。测试数据文件中的label 只用于计算准确度或误差,如果它是未知的,只需用任意一个数填写这一栏,也可以空着不填。例如:
+1 1:0.708 2:1 3:1 4:-0.320 5:-0.105 6:-1 8:1.21
二. svmscale 的用法
对数据集进行缩放的目的在于:
1)避免一些特征值范围过大而另一些特征值范围过小;
2)避免在训练时为了计算核函数而计算内积的时候引起数值计算的困难。因此,通常将数据缩放到[ -1,1]或者是[0,1]之间。
用法:svmscale [-l lower] [-u upper] [-y y_lower y_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:待缩放的数据文件(要求满足前面所述的格式)。
缩放规则文件可以用文本浏览器打开,看到其格式为:
lower upper
lval1 uval1
lval2 uval2
其中的lower 与upper 与使用时所设置的lower 与upper 含义相同;index 表
示特征序号;lval 为该特征对应转换后下限lower 的特征值;uval 为对应于转换后上限upper 的特征值。
数据集的缩放结果在此情况下通过DOS窗口输出,当然也可以通过DOS的
文件重定向符号“>”将结果另存为指定的文件。
使用实例:
1) svmscale –s train3.range train3>train3.scale
表示采用缺省值(即对属性值缩放到[ -1,1]的范围,对目标值不进行缩放)
对数据集train3 进行缩放操作,其结果缩放规则文件保存为train3.range,缩放集的缩放结果保存为train3.scale。
2) svmscale –r train3.range test3>test3.scale
表示载入缩放规则train3.range 后按照其上下限对应的特征值和上下限值线性的地对数据集test3 进行缩放,结果保存为test3.scale。
三. svmtrain 的用法
svmtrain实现对训练数据集的训练,获得SVM模型。
用法: svmtrain [options] training_set_file [model_file]
其中,
options(操作参数):可用的选项即表示的涵义如下所示
-s svm类型:设置SVM 类型,默认值为0,可选类型有:
0 -- C- SVC
1 -- n - SVC
2 -- one-class-SVM
3 -- e - SVR
4 -- n - SVR
-t 核函数类型:设置核函数类型,默认值为2,可选类型有:
0 -- 线性核:u'*v
1 -- 多项式核: (g*u'*v+ coef 0)deg ree
2 -- RBF 核:e( u v 2) g -
3 -- sigmoid 核:tanh(g*u'*v+ coef 0)
-d degree:核函数中的degree设置,默认值为3; -g g :设置核函数中的g ,默认值为1/ k ;
-r coef 0:设置核函数中的coef 0,默认值为0;
-c cost:设置C- SVC、e - SVR、n - SVR中从惩罚系数C,默认值为1;
-n n :设置n - SVC、one-class-SVM 与n - SVR 中参数n ,默认值0.5;
-p e :设置n - 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加权,默认值为1;
-v n:n折交叉验证模式。
其中-g选项中的k是指输入数据中的属性数。操作参数 -v 随机地将数据剖分为n 部分并计算交叉检验准确度和均方根误差。以上这些参数设置可以按照SVM 的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM 类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。training_set_file是要进行训练的数据集;model_file是训练结束后产生的模型文件,该参数如果不设置将采用默认的文件名,也可以设置成自己惯用的文件名。
使用实例:
1)svmtrain train3.scale train3.model
训练train3.scale,将模型保存于文件train3.model,并在dos窗口中输出如下
结果:
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为支持向量总个数。
训练后的模型保存为文件train3.model,用记事本等文本浏览器打开可以看到其内容如下(其后“%”后内容为笔者所加注释):
svm_type c_svc % 训练所采用的svm类型,此处为C- SVC
kernel_type rbf % 训练采用的核函数类型,此处为RBF核
gamma 0.047619 % 与操作参数设置中的g 含义相同
nr_class 2 % 分类时的类别数,此处为两分类问题
total_sv 604 % 总共的支持向量个数
rho -0.337784 % 决策函数中的常数项b
label 0 1 % 类别标签
nr_sv 314 290 % 各类别标签对应的支持向量个数
SV % 以下为支持向量
1 1:-0.963808 2:0.906788 ... 19:-0.197706 20:-0.928853 21:-1
1 1:-0.885128 2:0.768219 ... 19:-0.452573 20:-0.980591 21:-1
... ... ...
1 1:-0.847359 2:0.485921 ... 19:-0.541457 20:-0.989077 21:-1
% 对于分类问题,上面的支持向量的各列含义与训练数据集相同;对于回归问题,略有不同,与训练数据中的标签label(即y值)所对应的位置在模型文件的支持向量中现在存放的是Lagrange 系数a 值,即为下面决策函数公式中的a 值:
* *
1
() ( )( ( ) ( )) ( ) ( , )
( , )
k
i i i i i i
i i sv
i i
i sv
fx a a x x b a a k x x b
ak x x b
= = - F F + = - +
= + g
四. svmpredict 的用法
svmpredict 是根据训练获得的模型,对数据集合进行预测。
用法:svmpredict [options] test_file model_file output_file
options(操作参数):
-b probability_estimates:是否需要进行概率估计预测,可选值为0 或者1,默认值为0。
model_file 是由svmtrain 产生的模型文件;test_file 是要进行预测的数据文件;output_file 是svmpredict 的输出文件,表示预测的结果值。svmpredict 没有其它的选项。
======================================================================================
最近的工作要用到支持向量机(SVM), 对算法不是很懂, 但是总要把用法弄明白吧, 于是就想把它的文档翻译一下, 自己弄明白吧, 也给其他人带来点方便
先给出libsvm的下载地址: 要下载就点我吧
英文文档请见压缩包内的 README 文件(用写字板打开就可以看到内容了)
其中, tools目录下的README的翻译在这里.
--------------------------------------------------------------------------------
libsvm-2.88中文文档
中文文档由 pwwang 翻译, 欢迎转载, 转载请注明出处!
Libsvm是一个简单、易用、有效的SVM分类和回归软件。它解决了C-SVM分类、nu-SVM分类、one-class-SVM、epsilon-SVM回归和nu-SVM回归。它还为C-SVM提供了一个自动模型选择工具。这个文档将解释libsvm的用法。
Libsvm可以从这里得到:http://www.csie.ntu.edu.tw/~cjlin/libsvm
在使用libsvm之前先阅读COPYRIGHT文件。
目录
=================
-快速开始
-安装和数据格式
-“svm-train”的用法
-“svm-predict”的用法
-“svm-scale”的用法
-实际使用技巧
-例子
(后面的部分不作翻译)
快速开始
=================
如果你是SVM的一个新手,并且数据不大,那么在安装完成之后请打开tools目录使用easy.py。它将把一切全自动化,从数据规化到参数选择。
用法:easy.py training_file [test_file]
你可以在“tools/README”中找到关于参数选择的更多信息。
安装和数据格式
=================
在Unix系统中,输入make来生成“svm-train”和“svm-predict”程序。不带参数地运行它们可以显示他们的用法。
在其他系统中,参考“Makefile”来生成它们(例如:你可以参数这篇文档中的“生成Windows可执行文件”)或者使用预生成二进制文件(Windows二进制文件在”windows“目录中)
训练和测试数据文件中的格式是:
<label> <index1>:<value1> <index2>:<value2> …
.
.
.
每行包含一个实例,并且以“n”(译者注:换行符)结束。对于分类来说,<label>是一个指向该类标志的整数(支持多类)。对于回归来说,<label>是一个可为任何实数的目标值。对于one-class-SVM来说,它不会被用到,所以可以为任何数值。除非使用预先计算的核(将在另一节介绍),<index>:<value>给出了一个特性(属性)值。<index>是一个从1开始的整数,<value>是一个实数。索引必须按升序排列。标签在测试文件中只被用来计算精确度或者错误。如果它们是未知的,把第一列赋任意值。
这个包内的一个分类数据的例子是“heart_scale”。可以使用“tools/checkdata.py”来检测你数据格式是否正确。(详见“tools/README”)。
输入“svm-train heart_scale”,程序将读取训练数据并输出模型文件“hear_scale.model”。如果你有一个测试集叫“heart_scale.t”,那么输入“svm-predict heart_scale.t heart_scale.model output” 来检查预测的准确性。“output”文件包含了预测的类标签。
这个包里还有一些其他的有用的程序:
svm-scale:
规化你的输入数据文件
svm-toy:
这是一个简单的图形界面,它将在一个面板上显示SVM如果分离数据。你可以在窗口里单击来画数据点。使用“change”按钮来选择类1,2或者3(例如:一直到3个类都是支持的),“load”按钮用来从文件里装入数据,“save”按钮用来保存数据到一个文件,“run”按钮用来获取一个SVM模型,“clear”按钮用来清除窗口。
你可以窗口的底部输入选项,选项的符号规则和“svm-train”一样。
注意“load”和“save”只考虑了分类情况下的数据,而没有考虑回归的情况。每一个数据库有一个标签(颜色),它必须是1,2或者3,并且两个属性(x和y值)范围必须是[0,1]。
在各个目录中输入make来生成它们。
你需要Qt库来生成Qt版本(可以在这里得到:http://www.trolltech.com)
你需要GTK+库来生成GTK版本(可以在这里得到:http://www.gtk.org)
预生成的Windows二进制文件可“Windows”目录中。我们使用的是32-位机上的Visual C++,所以最大缓存是2GB。
“svm-train”的用法
=================
用法:svm-train [options] training_set_file [model_file]
选项:
-s svm_type : 设定SVM的类型 (default 0)
0 — C-SVC
1 — nu-SVC
2 — one-class SVM
3 — epsilon-SVR
4 — nu-SVR
-t kernel_type : 设定核函数的类型 (default 2)
0 — linear: u’*v
1 — polynomial: (gamma*u’*v + coef0)^degree
2 — radial basis function: exp(-gamma*|u-v|^2)
3 — sigmoid: tanh(gamma*u’*v + coef0)
4 — precomputed kernel (kernel values in training_set_file)
-d degree : set degree in kernel function (default 3)
-g gamma : set gamma in kernel function (default 1/k)
-r coef0 : set coef0 in kernel function (default 0)
-c cost : set the parameter C of C-SVC, epsilon-SVR, and nu-SVR (default 1)
-n nu : set the parameter nu of nu-SVC, one-class SVM, and nu-SVR (default 0.5)
-p epsilon : set the epsilon in loss function of epsilon-SVR (default 0.1)
-m cachesize : set cache memory size in MB (default 100)
-e epsilon : set tolerance of termination criterion (default 0.001)
-h shrinking: whether to use the shrinking heuristics, 0 or 1 (default 1)
-b probability_estimates: whether to train an SVC or SVR model for probability estimates, 0 or 1 (default 0)
-wi weight: set the parameter C of class i to weight*C in C-SVC (default 1)
-v n: n-fold cross validation mode
-g中的k表示输入数据中属性的数目。
-v选项把数据随机分成n个部分,并计算它们的交叉验证accuracy/mean方差(不知道这个数学术语怎么翻译)
通过libsvm FAQ来查看输出文件的含义。
“svm-predict”的用法
=================
用法: svm-predict [options] test_file model_file output_file
选项:
-b probability_estimates: 是否预测概率估计, 0 或 1 (默认 0); one-class SVM只支持0
model_file是svm-train生成的model文件.
test_file 是你想预测的数据.
svm-predict 将把结果输出到output_file.
"svm-scale" Usage
=================
用法: svm-scale [options] data_filename
选项:
-l lower : x 规化的最小值 (默认 -1)
-u upper : x 规化的最大值 (默认 +1)
-y y_lower y_upper : y 规化的限定 (默认: 不规化y)
-s save_filename : 保存规化参数到 save_filename
-r restore_filename : 从restore_filename恢复规化参数
查看这个文档的’Examples’ 来获取例子。
实际使用技巧
=================
* 你的数据的规化。例如,规化每一个属性到[0,1]或[-1,+1]。
* 对于C-SVC,考虑使用tools目录中的模型选择工具。
* nu in nu-SVC/one-class-SVM/nu-SVR approximates the fraction of training errors and support vectors.
* 如果分类数据不平衡(如太多正数,极少负数),使用-wi尝试一个不同的罚分参数C。
* 为大的问题指定更大的缓存大小(如 larger -m)
Examples
========
> svm-scale -l -1 -u 1 -s range train > train.scale
> svm-scale -r range test > test.scale
Scale each feature of the training data to be in [-1,1]. Scaling factors are stored in the file range and then used for scaling the test data.
> svm-train -s 0 -c 5 -t 2 -g 0.5 -e 0.1 data_file
Train a classifier with RBF kernel exp(-0.5|u-v|^2), C=10, and stopping tolerance 0.1.
> svm-train -s 3 -p 0.1 -t 0 data_file
Solve SVM regression with linear kernel u’v and epsilon=0.1 in the loss function.
> svm-train -c 10 -w1 1 -w-1 5 data_file
Train a classifier with penalty 10 = 1 * 10 for class 1 and penalty 50 = 5 * 50 for class -1.
> svm-train -s 0 -c 100 -g 0.1 -v 5 data_file
Do five-fold cross validation for the classifier using the parameters C = 100 and gamma = 0.1
> svm-train -s 0 -b 1 data_file
> svm-predict -b 1 test_file data_file.model output_file
Obtain a model with probability information and predict test data with probability estimates