LibSVM学习 all
2010年07月20日
LibSVM学习(一)--初识LibSVM
LibSVM是台湾林智仁(Chih-Jen Lin) 教授2001年开发的一套支持向量机的库,这套库运算速度还是挺快的,可以很方便的对数据做分类或回归。由于libSVM程序小,运用灵活,输入参数少,并且是开源的,易于扩展,因此成为目前国内应用最多的SVM的库。
这套库可以从http://www.csie.ntu.edu.tw/~cjlin/免费获得,目前已经发展到2.89版。下载.zip格式的版本,解压后可以看到,主要有5个文件夹和一些c++源码文件。
Java --主要是应用于java平台;
Python --是用来参数优选的工具,稍后介绍;
svm-toy --一个可视化的工具,用来展示训练数据和分类界面,里面是源码,其编译后的程序在windows文件夹下;
tools --主要包含四个python文件,用来数据集抽样(subset),参数优选(grid),集成测试(easy), 数据检查(checkdata);
windows --包含libSVM四个exe程序包,我们所用的库就是他们,里面还有个heart_scale,是一个样本文件,可以用记事本打开,用来测试用的。
其他.h和.cpp文件都是程序的源码,可以编译出相应的.exe文件。其中,最重要的是svm.h和svm.cpp文件,svm-predict.c、svm-scale.c和svm-train.c(还有一个svm-toy.c在svm-toy文件夹中)都是调用的这个文件中的接口函数,编译后就是windows下相应的四个exe程序。另外,里面的 README 跟 FAQ 也是很好的文件,对于初学者如果E文过得去,可以看一下。
下面以svm-train为例,简单的介绍下,怎么编译:(这步很简单,也没必要,对于仅仅使用libsvm库的人来说,windows下的4个exe包已经足够了,之所以加这步,是为了那些做深入研究的人,可以按照自己的思路改变一下svm.cpp,然后编译验证)
我用的是VC 6.0,新建一个控制台(win32 console application)程序,程序名叫svm-train(这个可以随意),点击OK后,选择empty。
进入程序框架后,里面什么都没有,然后找到你的程序目录,把svm-train.c、svm.h和svm.cpp拷贝过去(.c文件是c语言的,要是你习惯了c++,你尽可以改成.cpp),然后把这3个文件添加到工程,编译。。。如果没错误,到debug下面看看,是不是有个svm-train.exe。其实windows下的svm-train.exe就是这样编译出来的。
哈哈,怎么样是不是很简单。但是,这样的程序直接运行没意义,他要在dos下运行,接收参数才行。下面开始我们的libsvm的体验之旅。
LibSVM学习(二)--第一次体验libSvm
1. 把LibSVM包解压到相应的目录(因为我只需要里面windows文件夹中的东东,我们也可以只把windows文件夹拷到相应的目录),比如D:\libsvm。
2. 在电脑"开始"的"运行"中输入cmd,进入DOS环境。定位到d:\ libsvm下,具体命令如下:
d: (回车)
cd \libsvm\windows (回车)
(上面第一行是先定位到盘符d,第二行cd 是定位到相应盘符下的目录)
3. 进行libsvm训练,输入命令:(这里要注意文件的名字,2.89以前版本都是svmtrain.exe)
svm-train heart_scale train.model
heart_scale --是目录下的已经存在的样本文件,要换成自己的文件,只需改成自己的文件名就可以了
train.model --是创建的结果文件,保存了训练后的结果
可以看到结果:
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 为标准支持向量个数(0 来另存为(假设为out.txt):
svmscale test.txt > out.txt
运行后,我们就可以看到目录下多了一个out.txt文件,那就是规范后的数据。假如,我们想设定数据范围[0,1],并把规则保存为test.range文件:
svmscale l 0 u 1 s test.range test.txt > out.txt
这时,目录下又多了一个test.range文件,可以用记事本打开,下次就可以用-r test.range来载入了。
3. svmtrain的用法
svmtrain我们在前面已经接触过,他主要实现对训练数据集的训练,并可以获得SVM模型。
用法: svmtrain [options] training_set_file [model_file]
其中,options为操作参数,可用的选项即表示的涵义如下所示:
-s 设置svm类型:
0 C-SVC
1 v-SVC
2 one-class-SVM
3 ε-SVR
4 n - SVR
-t 设置核函数类型,默认值为2
0 -- 线性核:u'*v
1 -- 多项式核: (g*u'*v+ coef 0)degree
2 -- RBF 核:exp(-γ*||u-v||2)
3 -- sigmoid 核:tanh(γ*u'*v+ coef 0)
-d degree: 设置多项式核中degree的值,默认为3
-gγ: 设置核函数中γ的值,默认为1/k,k为特征(或者说是属性)数;
-r coef 0:设置核函数中的coef 0,默认值为0;
-c cost:设置C-SVC、ε-SVR、n - SVR中从惩罚系数C,默认值为1;
-n v :设置v-SVC、one-class-SVM 与n - SVR 中参数n ,默认值0.5;
-p ε:设置v-SVR的损失函数中的e ,默认值为0.1;
-m cachesize:设置cache内存大小,以MB为单位,默认值为40;
-e ε:设置终止准则中的可容忍偏差,默认值为0.001;
-h shrinking:是否使用启发式,可选值为0 或1,默认值为1;
-b 概率估计:是否计算SVC或SVR的概率估计,可选值0 或1,默认0;
-wi weight:对各类样本的惩罚系数C加权,默认值为1;
-v n:n折交叉验证模式;
model_file:可选项,为要保存的结果文件,称为模型文件,以便在预测时使用。
默认情况下,只需要给函数提供一个样本文件名就可以了,但为了能保存结果,还是要提供一个结果文件名,比如:test.model,则命令为:svmtrain test.txt test.model
结果说明见LibSVM学习(二)。
4. svmpredict 的用法
svmpredict 是根据训练获得的模型,对数据集合进行预测。
用法:svmpredict [options] test_file model_file output_file
其中,options为操作参数,可用的选项即表示的涵义如下所示
:
-b probability_estimates--是否需要进行概率估计预测,可选值为0 或者1,默认值为0。
model_file --是由svmtrain 产生的模型文件;
test_file--是要进行预测的数据文件,格式也要符合libsvm格式,即使不知道label的值,也要任意填一个,svmpredict会在output_file中给出正确的label结果,如果知道label的值,就会输出正确率;
output_file --是svmpredict 的输出文件,表示预测的结果值。
至此,主要的几个接口已经讲完了,满足一般的应用不成问题。对于要做研究的,还需要深入到svm.cpp文件内部,看看都做了什么。
LibSVM学习(四)--逐步深入LibSVM
其实,在之前上海交大模式分析与机器智能实验室对2.6版本的svm.cpp做了部分注解,(在哪里?google一下你就知道)。但是,这个注释只是针对代码而注释,整篇看下来,你会发现除了理解几个参数的含义,还是会对libsvm一头雾水。当然作为理解程序的辅助材料,还是有很大用处的。特别是,对几个结构体的说明,比较清楚。但是要清楚程序具体做了什么,还是要追踪程序中去。
由于svm涉及的数学知识比较多,我们这篇只是讲一些基本的思路,所以就从最基本的C-SVC型svm,核函数采用常用的RBF函数。LibSVM就采用2.6版本的好了,因为后续的版本作者又加了很多内容,不易理解作者最初的思路。我是做模式识别,主要从分类的角度来解析函数的调用过程,我们从svmtrain.c看起,其调用的函数过程如下:
上图是整个C-SVC的计算过程,下面对一些重要的内容进行具体说明
:
1. svm_group_class
在2.6版中没有此函数的,其功能直接在svm_train实现,为了增强可读性,2.89版中设置了这个函数,其实所作的工作都是一样的。需要说明的是其重新排列后perm中只存储的是各个样本在原始位置的序号,而非数据。这样做的好处有两个:
1)不必破坏原始数据(也就是读进来的x的数据);
2)检索起来方便,只需要L维的数据检索,得到序号后,然后定位到原始数据中相应的位置就可以。
perm是中各类的排列顺序是按照原始样本中各类出现的先后顺序排列的,不一定是按照你原始样本的label序号排列,假如原始样本的label是{-1,0,1},而最先出现的label为1的样本,那么perm中就把label为1的作为类0最先排列。而start中记录的是各类的起始序号,而这个序号是在perm中的序号。
2. 多类判别的one-against-one
svm做判别是用的分界线(面),两类之间只有一个分界线(面),因此分类器也只有1种,要么是1类要么是2类。但是对于多类,分类方式就有多种。目前,存在的方法主要有:
1)1-V-R方式
对于k类问题,把其中某一类的n个训练样本视为一类,所有其他类别归为另一类,因此共有k个分类器。最后预测时,判别式使用竞争方式,也就是哪个类得票多就属于那个类。
2)1-V-1方式
也就是我们所说的one-against-one方式。这种方法把其中的任意两类构造一个分类器,共有(k-1)×k/2个分类器。最后预测也采用竞争方式。
3)有向无环图(DAG-SVM)
该方法在训练阶段采用1-V-1方式,而判别阶段采用一种两向有向无环图的方式。
LibSVM采用的是1-V-1方式,因为这种方式思路简单,并且许多实践证实效果比1-V-R方式要好。
上图是一个5类1-V-1组合的示意图,红色是0类和其他类的组合,紫色是1类和剩余类的组合,绿色是2类与右端两类的组合,蓝色只有3和4的组合。因此,对于nr_class个类的组合方式为:
for(i = 0; i 2的情况,分类器个数为k×(k-1)/2个,那么对应的b值(也就是rho)应该也是k×(k-1)/2个。那么每个支持向量对应的系数α是多少呢?是k-1个,因为每个支持向量(sv)与其他每个类都有一个系数相对应。当然,和有的类对应时可能不是标准支持向量(0python文件,是用来对参数优选的。其中,常用到的是easy.py和grid.py两个文件。其实,网上也有相应的说明,但很不系统,下面结合本人的经验,对使用方法做个说明。
这两个文件都要用python(可以在http://www.python.org上下载到,需要安装)和绘图工具gnuplot(可以在ftp://ftp.gnuplot.info/pub/gnuplot/上下载,不需要安装)。假设python安装在d:\libsvm\tools\python26下,而gnuplot解压到d:\libsvm\tools\gnuplot,libsvm放在了d:\libsvm\program中(这时easy.py和grid.py文件的目录为d:\libsvm\program\tools)。另外,需要注意的是版本,我的是python 2.6、gnuplot 4.2 和libsvm 2.89,操作系统是WINXP。
1. grid.py使用方法
文件grid.py是对C-SVC的参数c和γ做优选的,原理也是网格遍历,假设我们要对目录d:\libsvm\program\tools下的样本文件heart_scale做优选,其具体用法为:
第一步:打开d:\libsvm\program下的tools文件夹,找到grid.py文件。用python打开(不能双击,而要右键选择"Edit with IDLE"),修改svmtrain_exe和gnuplot_exe的路径。
svmtrain_exe = r"D:\libSVM\program\svm-train.exe"
gnuplot_exe = r"D:\libSVM\gnuplot\pgnuplot.exe"
(这里面有一个是对非win32的,可以不用改,只改# example for windows下的就可以了)
第二步:运行cmd,进入dos环境,定位到d:\libsvm\program\tools文件夹,这里是放置grid.py的地方。怎么定位可以参看第一节。
第三步:输入以下命令:
d:\libsvm\python26\python grid.py heart_scale
你就会看到dos窗口中飞速乱串的[local]数据,以及一个gnuplot的动态绘图窗口。大约过10秒钟,就会停止。Dos窗口中的[local]数据时局部最优值,这个不用管,直接看最后一行:
2048.0 0.0001220703125 84.0741
其意义表示:C = 2048.0;γ=0.0001220703125(γ是哪个参数?参看LibSVM学习(三)中svmtrain的参数说明);交叉验证精度CV Rate = 84.0741%,这就是最优结果。
第四步:打开目录d:\libsvm\program\tools,我们可以看到新生成了两个文件:heart_scale.out和heart_scale.png,第一个文件就是搜索过程中的[local]和最优数据,第二文件就是gnuplot图像。
现在,grid.py已经运行完了,你可以把最优参数输入到svmtrain中进行训练了。当然了,你在当中某一步很可能出现问题,不过不要紧,我也不是一下子成功的,摸索了半天才成功。下面就需要注意的问题说明一下:
1)grid.py和svm-train的版本要统一,也就是说你不能用2.6的grid.py去调用2.89的svm-train。
2)你的目录中如果有空格,比如d:\program files\ libsvm\...,那么无论是在第一步还是第二步,请把目录改成d:\progra~1\ libsvm\...
3) 第三步的命令问题。首先要看你定位到哪个目录,那么其下的文件就不需要带路径,否则就要带。像我们上面的命令,我当前的目录是d:\libsvm\program\,那么其下的easy.py和heart_scale文件就不需要加路径,而python.exe是在d:\libsvm\python26\下,因此不在当前目录下,所以要加路径。比如,当我首先用dos定位到d:\libsvm\python26时,其命令就可以改成:
python d:\libsvm\program\tools\grid.py d:\libsvm\program\tools\heart_scale
总起来说,命令为python 目标文件样本文件,其原则是要让系统找得到文件。假如系统提示你"不是内部或外部命令",说明你python的路径错误,而如果是'not found file'的提示,很可能是其他两个文件路径错误。
4)假如,你仍旧出现问题,那么请换一下python或者gnuplot的版本,目前python最新版本是3.1,但是好像会出问题,老一点的版本2.4或2.5的兼容性会更好。
2. easy.py使用方法
文件easy.py对样本文件做了"一条龙服务",从参数优选,到文件预测。因此,其对grid.py、svm-train、svm-scale和svm-predict都进行了调用(当然还有必须的python和gnuplot)。因此,运行easy.py需要保证这些文件的路径都要正确。当然还需要样本文件和预测文件,这里样本文件还是用heart_scale,预测文件我们复制一份然后改名heart_test,下面说一下使用方法:
第一步:打开easy.py,修改# example for windows下的几个路径:
第二步:运行cmd,进入dos环境,定位到放置easy.py的目录d:\libsvm\program\tools。
第三步:输入命令:
d:\libsvm\python26\python easy.py heart_scale heat_test
你就会看到一个gnuplot的动态绘图窗口。大约20s以后停止,dos窗口显示为:
Scaling training data...
Cross validation...
Best c=2048.0, g=0.0001220703125 CV rate=84.0741
Training...
Output model: heart_scale.model
Scaling testing data...
Testing...
Accuracy = 85.1852% (230/270) (classification)
Output prediction: heart_test.predict
这就是最终预测结果,可以看到第三行就是调用grid.py的结果。在d:\libsvm\program\tools下你会看到又多了7个文件,都是以前我们碰到的过程文件,都可以用记事本打开。
3. 常见的问题解析:
1)
Scaling training data...
Cross validation...
Traceback (most recent call last):
File "easy.py", line 61, in ?
c,g,rate = map(float,last_line.split())
ValueError: need more than 0 values to unpack
[解析] 说明你的grid.py运行出现错误,你可以参照第一部分"grid.py使用方法"运行一下就会发现问题。另外,有的说是相对路径的问题,建议找到easy.py的以下部分:
cmd = "%s -svmtrain %s -gnuplot %s %s" % (grid_py, svmtrain_exe, gnuplot_exe, scaled_file)
改成
cmd = "%s %s -svmtrain %s -gnuplot %s %s" % (python_path, grid_py, svmtrain_exe, gnuplot_exe, scaled_file)
2)
Traceback (most recent call last)
File "grid.py", line 349, in ?
main()
File "grid.py", line 344, in main
redraw(db)
File "grid.py", line 132, in redraw gnuplot.write("set term windows\n") IOError [Errno 22] Invalid argument [解析] 说明你的gnuplot.exe在调用过程中出现问题,要么是你的路径不对,要么是你的版本不对,请检查。
3)
Traceback (most recent call last):
File "C:\Python24\lib\threading.py", line 442, in __bootstrap
self.run()
File "c:\libsvm\tools\gridregression.py", line 212, in run
self.job_queue.put((cexp,gexp,pexp))
File "C:\Python24\lib\Queue.py", line 88, in put
self._put(item)
File "c:\libsvm\tools\gridregression.py", line 268, in _put
self.queue.insert(0,item)
AttributeError: 'collections.deque' object has no attribute 'insert
[解析] 很显然,你调用的是gridregression.py,其是用来做回归用的。如果你调用easy.py也出现这种问题按照原作者的说法,这里是因为你的python调用出现错误,很可能是版本不对,如果是2.4的版本,请把easy.py中的
self.queue.insert(0,item)
改成
if sys.hexversion >= 0x020400A1:
self.queue.appendleft(item)
else
self.queue.insert(0,item)
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/flydreamGG/archive/2009/08/21 /4470477.aspx
发表评论
-
库的学习(先前发过一次,后来不小心删了)
2012-01-20 09:44 726库的学习(先前发过一次,后来不小心删了) 2010年06月2 ... -
Lua 5.1.4 在DSP上的移植
2012-01-20 09:44 1341Lua 5.1.4 在DSP上的移植 2 ... -
使用 cURL 和 libcurl 通过 Internet 进行对话
2012-01-20 09:44 638使用 cURL 和 libcurl 通过 Internet 进 ... -
Ogre 的相关工具和库
2012-01-20 09:44 702Ogre 的相关工具和库 2011年04月14日 学无止 ... -
从事无限极事业该怎样制定目标和计划(下集)
2012-01-19 14:48 1053从事无限极事业该怎样 ... -
执一不二 跬步千里-王子密码2011年11月份心得(十)
2012-01-19 14:48 823执一不二 跬步千里-王 ... -
haha
2012-01-19 14:48 642haha 2011年07月09日 您的位置:首页-> ... -
2011年不给自己留下任何遗憾
2012-01-19 14:48 5572011年不给自己留下任何遗憾 2011年12月17日 ... -
7位模式服务体系
2012-01-19 14:48 6187位模式服务体系 2011年 ... -
WinCE驱动开发问题精华集锦
2012-01-17 04:32 831WinCE驱动开发问题精华 ... -
C#面试题集锦(你值得拥有!)
2012-01-17 04:32 627C#面试题集锦(你值得拥有!) 2011年04月22日 ... -
Grub4dos命令索引
2012-01-17 04:32 647Grub4dos命令索引 2010年07月22日 Gru ... -
字节流与结构、类之间的转换
2012-01-17 04:32 629字节流与结构、类之间的转换 2011年04月26日 1. ... -
Linux System and Performance Monitoring(I/O篇)
2012-01-17 04:32 673Linux System and Performance Mo ... -
潮阳“陈”姓源流
2012-01-16 03:24 907潮阳“陈”姓源流 2010 ... -
东方犹太人
2012-01-16 03:24 605东方犹太人 2010年10月07日 潮商是中国传统的 ...
相关推荐
这是一个学习使用libsVM工具包的入门文档,详细介绍libSVM工具包的使用方法及参数意义,适合初学者阅读!
libsvm学习手册及工具箱等资料,好东西
学习支持向量机SVM时采用LIBSVM工具箱可以很好的解决小样本的分类问题。
libSVM学习资料,里面包括一些libsvm实验教学资料
将数据库查询结果转化为可用于libsvm学习的svm_problem
LibSVM学习笔记是根据网上博客整理的,非常适合初学者
【LIBSVM】使用C++和LIBSVM实现机器学习+样本分类
libsvm学习[归纳].pdf
libsvm可嵌入到MATLAB中的程序包,很好的LibSvm 使用说明 学习心得
牛人的libsvm学习心得,有对各个源文件的使用说明和对这个软件的使用方法,受益匪浅
NULL 博文链接:https://luchi007.iteye.com/blog/2267674
LibSVM的编程向导,可以很好的介绍LibSVM的编程思想和过程
libsvm libsvm-weights-2.91 libsvm svm 分类器 分类 支持向量机
通过libsvm的学习,理解机器学习的内涵。
matlab libsvm工具包,非常好用
libsvm工具箱(libsvm-3.22版),已经包含了matlab数据集heart_scale.mat。该工具箱为用C++编写的代码,使用前要在MATLAB中调用C++编译器进行编译(如Visual Studio 2013)。
matlab使用libsvm进行分类代码实例, 这里包括一个数据集合, 一个代码(包括详细注释),而且代码经过修改,已经符合最新的libsvm调用格式,不会出错,用于SVM分类。 首先通过博客,安装好libsvm库,博客地址:...
MATLAB自带的svm实现函数仅有的模型是C-SVC(C-support vector classification); 而libsvm工具箱有C-SVC(C-support vector classification)
libsvm 入门经典 超好的资源
在libsvm-3.16的python文件夹下主要包括了两个文件svm.py和svmutil.py。 svmutil.py接口主要包括了high-level的函数,这些函数的使用和LIBSVM的MATLAB接口大体类似 svmutil中主要包含了以下几个函数: svm_train...