原文:http://blog.csdn.net/meredith_leaf/article/details/6714144

Linux下的Libsvm使用历程录

首先下载Libsvm、Python和Gnuplot:

libsvm的主页http://www.csie.ntu.edu.tw/~cjlin/libsvm/上下载libsvm (偶用3.1版本)

python的主页http://www.python.org下载 python (偶用3.2.1版本)

gnuplot的主页http://www.gnuplot.info/下载gnuplot  (偶用4.4.3版本)

LIBSVM 使用的一般步骤是:

1)按照LIBSVM软件包所要求的格式准备数据集;

2)对数据进行简单的缩放操作;

3)首要考虑选用RBF 核函数;

4)采用交叉验证选择最佳参数C与g ;

5)采用最佳参数C与g 对整个训练集进行训练获取支持向量机模型;

6)利用获取的模型进行测试与预测。

在执行以下操作之前先make生成 svm-scale, svm-train, svm-predict三个可执行文件。

1)LIBSVM使用的数据格式

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

[label] [index1]:[value1] [index2]:[value2] ...

[label] [index1]:[value1] [index2]:[value2] ...

一行一条记录数据,如下(可参看libsvm-3.1/heart_scale):

+1 1:0.708 2:1 3:14:-0.320 5:-0.105 6:-1

注意:由于程序设计的原因,每行数据的最后一个value后面,

还必须加一个空格 ' ' 或Tab '\t' 才能回车换到下一行继续输入下一条数据。

最后一行数据也是必须在最后一个value后面加一个空格 ' ' 或Tab '\t' 的!!!

这里(x,y) -> ((0.708,1,1, -0.320, -0.105, -1), +1)         ( ps: 这话什么意思?  没弄明白!!  )

label 或说是class, 就是你要分类的种类,通常是一些整数。

index 是有順序的索引,通常是连续的整数。

value 就是用来 train 的数据,通常是一堆实数。

 

2)对数据进行简单的缩放操作

扫描数据. 因为原始数据可能范围过大或过小,“svm-scale”可以先将数据重新scale (縮放) 到适当范围使训练与预测速度更快。

svm-scale 的使用示例:

./svm-scale -l 0 heart_origin > heart_scale

默认的归一化范围是[-1,1],可以用参数-l和-u分别调整上界和下届, -l 0 是将范围改成了[0,1]. heart_origin是输入特征文件名; 输出的归一化特征文件名为heart_scale.

3)考虑选用RBF 核函数

训练数据形成模型(model),实质是算出了wx+b=0中的w,b.

svm-train的用法:

./svm-train [options] training_set_file [model_file]

其中options涵义如下:

-s svm类型:设置SVM 类型,默认值为0,可选类型有:

0 -- C- SVC

1 -- nu - SVC

2 -- one-class-SVM

3 -- e - SVR

4 -- nu-SVR

-t 核函数类型:设置核函数类型,默认值为2,可选类型有:

0 -- 线性核:u'*v

1 -- 多项式核:(g*u'*v+ coef0)degree

2 -- RBF 核:exp(-||u-v||*||u-v||/g*g)

3 -- sigmoid 核:tanh(g*u'*v+ coef 0)

-d degree:核函数中的degree设置,默认值为3;

-g r(gama):核函数中的函数设置(默认1/ k);

-r coef 0:设置核函数中的coef0,默认值为0;

-c cost:设置C- SVC、e - SVR、n - SVR中从惩罚系数C,默认值为1;

-n nu :设置nu - SVC、one-class-SVM 与nu - SVR 中参数nu ,默认值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加权,默认值为1;

-v n:n折交叉验证模式。

其中-g选项中的k是指输入数据中的属性数。操作参数 -v 随机地将数据剖分为n 部分并计算交叉检验准确度和均方根误差。以上这些参数设置可以按照SVM 的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM 类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。training_set_file是要进行训练的数据集;model_file是训练结束后产生的模型文件,该参数如果不设置将采用默认的文件名,也可以设置成自己惯用的文件名。

4)采用交叉验证选择最佳参数C与g

通常而言,比较重要的参数是 gamma (-g) 跟 cost (-c) 。而 cross validation (-v) 的参数常用5。那么如何去选取最优的参数c和g呢?libsvm 的 python 子目录下面的 grid.py 可以帮助我们。 此时需要安装好python3.2.1。进入/libsvm/tools目录下,用gedit或vim查看grid.py文件,找到其中关于gnuplot路径的那项(其默认路径为gnuplot_exe = "/usr/bin/gnuplot"),确认gnuplot可执行文件在/usr/bin/目录下存在,如果不在该路径下需要将这里的路径改成你的gnuplot所在的路径。

python grid.py的使用示例:

$ python grid.py heart_scale

屏幕最后显示:

2048.0 0.0001220703125 84.4444

可得到最优参数c=2048和g=0.0001220703125。

另外,至于下libsvm和python的接口的问题,在libsvm2.86中林老师已经帮助我们解决,在/libsvm/windows/python目录下自带了svmc.pyd这个文件,将该文件文件复制到libsvm/python目录下,同时,也将python.exe文件复制到该目录下,键入以下命令以检验效果(注意:.Py文件中关于gnuplot路径的那项路径一定要根据实际路径修改):

python svm_test.py

如果能看到程序执行结果,说明libsvm和python之间的接口已经配置完成,以后就可以直接在python程序里调用libsvm的函数了!

5)采用最佳参数C与g 对整个训练集进行训练获取支持向量机模型

$./svm-train –c x –g x –v x training_set_file [model_file]

x为上述得到的最优参数c和g的值,v的值一般取5。

svm-train 的使用示例:

./svm-train -c 2048 -g 0.0001220703125 heart_scale heart_model

这里,heart_scale是前面由svm-scale生成的归一化特征文件名; heart_model是训练产生的模型文件名。

屏幕回显信息如下:

..*.*.*

optimization finished, #iter = 1046

nu = 0.363609

obj = -193311.629689, rho = 1.616976

nSV = 103, nBSV = 91

Total nSV = 103

现简单对屏幕回显信息进行说明:

#iter为迭代次数,

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

obj为SVM文件转换为的二次规划求解得到的最小值,???什么意思?!

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

nSV 为支持向量个数,

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

Total nSV为支持向量总个数。

训练后的模型保存为文件train_model,用gedit打开其内容如下:

svm_type c_svc    % 训练所采用的svm类型,此处为C- SVC

kernel_type rbf    %训练采用的核函数类型,此处为RBF核

gamma 0.00012207    %设置核函数中的g ,默认值为1/ k

nr_class 2    %分类时的类别数,此处为两分类问题

total_sv 103    %总共的支持向量个数

rho 1.61698    %决策函数中的常数项b

label 1 -1   %类别标签

nr_sv 51 52    %各类别标签对应的支持向量个数

SV    %以下为支持向量

2048 1:0.166667 2:1 3:-0.333333 4:-0.433962 5:-0.383562 6:-1 7:-1 8:0.0687023 9:-1 10:-0.903226 11:-1 12:-1 13:1

2048 1:0.125 2:1 3:0.333333 4:-0.320755 5:-0.406393 6:1 7:1 8:0.0839695 9:1 10:-0.806452 12:-0.333333 13:0.5

2048 1:0.333333 2:1 3:-1 4:-0.245283 5:-0.506849 6:-1 7:-1 8:0.129771 9:-1 10:-0.16129 12:0.333333 13:-1

2048 1:0.208333 2:1 3:0.333333 4:-0.660377 5:-0.525114 6:-1 7:1 8:0.435115 9:-1 10:-0.193548 12:-0.333333 13:1

2048 1:0.166667 2:1 3:0.333333 4:-0.358491 5:-0.52968 6:-1 7:1 8:0.206107 9:-1 10:-0.870968 12:-0.333333 13:1

. . . . . . . . .

6)利用获取的模型进行测试与预测

使用svm-train训练好的模型进行测试。输入新的X值,给出SVM预测出的Y值。

$ svm-predict  test_file  model_file  output_file

svm-predict使用示例:

./ svm-predict heart_scale heart_model heart_predict

Accuracy = 85.1852% (230/270) (classification)

这里显示的是结果。

一个具体使用的例子。

以libsvm中的heart_scale作为训练数据和测试数据,同时已经将python安装成功。

因为这里的heart_scale文件已经是符合scale的数据文件,所以省略了svm-scale这一步,但实际操作中svm-scale是不可以省略的哦!不然预测结果会很糟糕滴~~

以下是操作过程及结果。。。

(1)不用交叉验证寻找最好的C和g而直接训练并预测的操作过程:

./svm-train heart_scale heart_model

optimization finished, #iter = 162

nu = 0.431029

obj = -100.877288, rho = 0.424462

nSV = 132, nBSV = 107

Total nSV = 132

此时,已经得到heart_model,进行预测:

./svm-predict heart_scale  heart_model  heart_predict

Accuracy = 86.6667% (234/270) (classification)

正确率为Accuracy = 86.6667%。

(2)经过交叉验证寻找到最佳C和g后再进行训练和预测的操作过程:

将heart_scale拷贝到python文件下,寻找最好的c和g。

./python grid.py heart_scale

得到最优参数c=2048,g=0.0001220703125.

./svm-train -c 2048 -g 0.0001220703125 heart_scale heart_model2

得到新的model后,由

./svm-predict heart_scale heart_model2 heart_predict2

得到的正确率为Accuracy = 85.1852%.这块还有点迷惑?为什么正确率降低了???怎么会这样??!!c取2048明显有问题啊!!

当然也可以结合subset.py 和 easy.py 实现自动化过程。

如果要训练多次,可以写个批处理程序省好多事。

这里举个例子:

::@ echo off
cls
:: split the data and output the results
for /L %%i in (1,1,1000) do python subset.py b59.txt 546 b59(%%i).in8 b59(%%i).out2

for /L %%i in (1,1,1000) do python easy.py b59(%%i).in8 b59(%%i).out2 >> result89.txt

这段批处理代码首先调用subset.py对文件b59.txt执行1000次分层随机抽样(对数据进行80-20%分割)然后调用easy.py 进行1000次参数寻优,把记录结果写到result89.txt中

(包括1000次训练的分类准确率和参数对)。

还可以调用fselect.py进行特征选择,调用plotroc.py进行roc曲线绘制。

==================================================================================================================================

上面有几处标记了的地方还是没能弄明白,还有待继续学习~

要是哪位朋友知道是怎么回事儿的话,还请不吝赐教O(∩_∩)O哈! 小生万分感激~

Linux下的Libsvm使用历程录的更多相关文章

  1. linux下常用的截图、录屏工具

    录屏: 在linux下常用的录屏工具有5种,可以baidu或者google下喔,我选用的是recordMydesktop,使用非常方便,用时注意先把每秒桢数调高,否则效果必然很差. 在ubuntu下可 ...

  2. linux下制作镜像文件

    第一:制作iso镜像的方法: 把/dev/cdrom目录制作为镜像,名字为/root/rh1.iso 方法1:dd if=/dev/cdrom of=/root/rh1.iso 方法2:#cat /d ...

  3. Linux下libsvm的安装及简单练习

    引文:常常在看paper的时候.就看到svm算法,可是要自己来写真的是难于上青天呀! 所幸有一个libsvm的集成软件包给我们使用,这真的是太好了.以下简介下怎么来使用它吧! LIBSVM是一个集成软 ...

  4. linux下方便的录屏命令

    linux下方便的录屏命令   ffmpeg -f x11grab -s 1024*768 -r 20 -i :0.0 -sameq ~/recode.mpg -r后是刷新屏率,   推出直接Ctrl ...

  5. Linux下CD/DVD刻录软件

    1.Brasero是一款CD/DVD刻录软件,Gnome桌面环境默认自带,支持单次写入数据DVD和任何类型的CD,并且能够将光盘镜像写入到硬盘,其图形化的操作界面使用户能够轻松而快速的在Linux下烧 ...

  6. 2.linux下Makefile编写规范

    转自陈皓 (CSDN) 概述—— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和 profession ...

  7. (转载)linux下各个文件夹的作用

    linux下的文件结构,看看每个文件夹都是干吗用的/bin 二进制可执行命令 /dev 设备特殊文件 /etc 系统管理和配置文件 /etc/rc.d 启动的配置文件和脚本 /home 用户主目录的基 ...

  8. Linux下的TeXlive 2015 中文问题

    Update: 今日突然发现,我的xeLaTeX编译生成的pdf中文字在TeXMaker内置viewer.evince下查看均无法显示中文,中文字显示为空白,英语正常:但FireFox.Chrome浏 ...

  9. Linux下安装Apache并以mod_wsgi方式部署django站点

    源码编译方式安装Apache 首先下载Apache源码压缩包,地址为http://mirror.bit.edu.cn/apache/httpd/ 继续下载apr和apr-util压缩包,地址为http ...

随机推荐

  1. 向CDH5集群中添加新的主机节点

    向CDH5集群中添加新的主机节点 步骤一:首先得在新的主机环境中安装JDK,关闭防火墙.修改selinux.NTP时钟与主机同步.修改hosts.与主机配置ssh免密码登录.保证安装好了perl和py ...

  2. 淘宝的ruby镜像已无人维护,使用ruby-china的RubyGems镜像

    淘宝的镜像已经无人维护了,参考 https://ruby-china.org/topics/29250 https://gems.ruby-china.org/ 使用新的镜像 $ gem source ...

  3. php 的简单易用的调式方法,打印方法

    简单的调试方法:echo, print_r, var_dump, exit, debug_backtrace(), debug_print_backtrace(), gettype(), get_cl ...

  4. CentOS7 network

  5. Operation not applicable

    ClientDataSet.DataSetProvider1 Operation not applicable ClientDataSet1->Open(); 解决办法 1.update new ...

  6. REST四种请求(get,delete,put,post) 收集整理 之一

    转自:http://blog.csdn.net/cloudcraft/article/details/10087033 资源是REST中最关键的抽象概念,它们是能够被远程访问的应用程序对象.一个资源就 ...

  7. Working with Sprites

    [Working with Sprites] 1.An SKSpriteNode object can be drawn either as a rectangle with a texture ma ...

  8. Wicket Hello World Example

    A simple hello world example in Wicket, show the basic structure of Wicket web application. Tools an ...

  9. [置顶] 如何在浏览器中打开PDF文件并实现预览的思路与代码

    编写项目遇到一个需要在浏览器中打开PDF文件的问题.最终实现效果如下: 其实也就是简单的在浏览器中实现一个打开pdf文件,并有类似预览功能的边框. 其实在网上经常见到类似的页面,在浏览器中打开pdf文 ...

  10. 完整Deploy WebPlayer的Config

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...