Linux下的Libsvm使用历程录
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三个可执行文件。
Ubuntu 10.10 默认是不安装g++的. make的时候会报错"g++: Command not found"
此时输入 g++ 可以获得一下信息:
The program 'g++' can be found in the following packages:
* g++
* pentium-builder
Try: sudo apt-get install <selected package>
根据提示输入:
sudo apt-get install g++
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
注意:数据集从1开始,非0
注意:由于程序设计的原因,每行数据的最后一个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使用历程录相关推荐
- linux 录屏软件 按键,linux下常用的截图、录屏工具
linux下常用的截图.录屏工具 (2010-01-05 10:47:21) 由于和老公一起做一个百度俱乐部的小项目,在编写测试文档时要使用截图.录屏的小工具,于是展开搜索什么工具比较好使. 录屏: ...
- Linux下制作ISO与刻录ISO
Linux下制作ISO与刻录ISO 1.背景: 制作ISO备份和刻录到光盘存储经常用到,Windows下非常方便:工具多阿!如UltraISO.Nero等等数不胜数.但我们今 天说的是Linux下如何 ...
- imgburn 和linux下k3b 不同的刻录效果,什么原因
为什么80%的码农都做不了架构师?>>> 最近刻盘dvd,铼德光刻录机.新出现的情况是用imgburn老是刻废掉,提示指示灯时间超时,而linux下k3b 基本都正常,偶尔有罢 ...
- linux下安装libsvm_在ubuntu下的Matlab中使用libsvm
事情的起因当然是因为一个错误,我平时一直在windows下用libsvm,当把程序放到安装了Ubuntu的服务器上就报错了,错误如下: Error using svmtrain (line 233) ...
- linux下c的串口收发
linux下c的串口收发录 转自: https://blog.csdn.net/weixin_41471318/article/details/116230465 文章目录 linux下c的串口收发录 ...
- Ubuntu(Linux)使用Simple Screen Recorder录屏
录屏可以帮助用户解决一些问题,比如bug重现,或者是视频教学,比单纯的文字描述直观很多,虽然Ubuntu用户数量少,但是有需求总有人去开发,凭着自由理念,github上就有这么一项开源项目,Simpl ...
- linux下安装libsvm_Linux下libsvm的安装及简单练习
引文:经常在看paper的时候,就看到svm算法,但是要自己来写真的是难于上青天呀!所幸有一个libsvm的集成软件包给我们使用,这真的是太好了.下面简单介绍下怎么来使用它吧! LIBSVM是一个集成 ...
- Ubuntu linux下的录屏
Ubuntu linux下的录屏 ################## SimpleScreenRecorder ################## 官方网站:http://www.maartenb ...
- linux刻录光盘空间不足,Linux下的光盘刻录技巧
随着Linux用户的不断增多,许多用户都在Linux中保存了大量信息,那么如何把这些信息刻录到光盘中就成了大家关心的问题.现在就告诉大 家如何在Linux中进行光盘刻录.在刻录软件中,当数Linux版 ...
- linux下刻录光盘读取不了_如何在Linux下刻录数据光盘
caoshun(原作) 本着让Linux精神发扬光大宗旨,我将部门原来的Windows2000服务器上所有的数据与提供的服务全部迁移到新建的Linux服务器上.在我即将要把这台老Windows2000 ...
最新文章
- 【技巧】实现饿了么Element UI的table单击(点击)编辑单元格内容
- pandas read_csv ‘utf-8‘ codec can‘t decode bytes in position 1198-1199: invalid continuation byte解决
- 阅读文献的三大问题:坐不住,记不住,想不开
- 19、任务十八——事件委托、数组处理
- 如何使用Putty登录安装在VirtualBox里的ubuntu
- CF983B XOR-pyramid
- SAP Analytics Cloud里如何基于一个已有的model创建Story
- linux 6.8 安装教程,CentOS 6.8 7.2 安装图解详细教程
- 处理String类常用的方法1
- iOS7新特性的兼容性处理方法 之三
- eXtremeComponents文档
- 数据智能、孪生城市——展望未来智慧城市产业发展
- 基于VUE+SpringBoot的旅游管理系统哦--前后端分离
- device mapper机制详解
- xdm,外包能干吗?实在是....
- java中抓阄_有种取名是让宝宝“抓阄”选,宝妈打开纸条后笑了:你自己选的...
- android 循环弹幕,Android自定义View实现弹幕效果
- 智能网联封闭测试场和开放道路测试政策情况全扫描(2022版)
- matlab去除大跳变,一种快速灰度校正算法(处理亮度不均等情况)(含MATLAB代码)...
- Halcon 3D moments_object_model_3d简介
热门文章
- mongodb之使用explain和hint性能分析和优化
- 【iOS】屏幕适配之NSLayoutConstraint
- 云集新功能:移动 Web 调试从未变得如此简单
- 程序员的恶性循环:加班-没空学习-老是写同等水平代码-无法提升代码质量-老是出BUG-老是需要修改-加班-......
- sql server根据年查询日期_SQL根据日期条件使用between查询数据集应注意事项
- mysql系统调试文字说明_mysql的配置说明
- 南阳oj-----一种排序(优先队列法)
- python 类继承 baseclass_Python:Dataclass继承自base Dataclass,如何将值从base升级到新类?...
- lambda表达式python_python lambda表达式用法
- 【hdu3183】A Magic Lamp(思维+st表(含模版))