LIBSVM使用说明、简介及感悟

        使用LIBSVM需要用到的其他工具:Python(相信搞SVM的或多或少都知道Python吧,安装时注意一点就是记得要添加环境变量!)。以下内容是指windows平台的。

        配套论文:LIBSVM: A Library for support vector machines 

一、LIBSVM简介:

       使用LIBSVM必须要知道SVM是个什么东西,可以不懂SVM具体怎么实现的,但是必须知道SVM的流程——最简单的 ,SVM可以用于人脸检测、车辆检测、行人检测。注意:SVM用于检测并不是直接使用SVM去检测人脸,而是通过另一种方式,比如,HOG特征或其他的特征。HOG特征的作用是把人脸用向量表示(简单点就是一大串的数字)。这里有一堆正样本(人脸、车辆、行人)图像,用HOG特征在图像上提取特征(一大串数字),另有一堆负样本(非人脸、非车辆、非行人) 也用HOG提取特征(也是一大堆数字),然后才到SVM起作用,使用SVM训练就可以把这两堆数字分开,并且可以得到支持向量,支持向量的意思简单的说就是你给我一张图像,我拿它去和支持向量处理后就可以知道它是正样本还是负样本。

        SVM是有严格的数学推导的,自己实现的话可能有点困难,因为你得写代码,让它成为这样一种实现——我给两组正负样本的一大串数字就可以得到支持向量,再者,我给你一张图像,输入之,就可到一个预测(是正样本或负样本)。之所以说困难,是因为你得理解SVM的理论,包括,朗格朗日乘子、对偶算法、SMO算法等。等你理解了,你还得写代码,一步步实现(对我来说好困难的LIBSVM使用说明、简介及感悟)。  LIBSVM是什么呢,他就是一个机器,这个机器实现了算法,达到了你想要的效果——你输入两组数据就能得到支持向量,你输入一张图像(该图像的特征,即向量表示)就能知道是正样本还是负样本(你就不用写代码了)。

      LIBSVM是*大学林智仁(Lin Chih-Jen)教授等开发设计的一个简单、易于使用和快速有效的SVM软件。网上搜LIBSVM很容易找到官网下载。

     这里说一下学习 LIBSVM时可能走的弯路(我自己走的弯路LIBSVM使用说明、简介及感悟):不要一有不懂的就网上搜答案,其实答案早就在下载的LIBSVM压缩包里了(目前版本是libsvm-3.22,本问所述均指libsvm-3.22)。1)解压后目录里有个README文件(推荐使用Notepad++,不推荐用记事本打开,推荐使用该文件讲述了使用方法,英文不难,不懂的谷歌翻译一下)。2)有个文件tools,该文件夹里也有个README文件(推荐使用Notepad++,不推荐用记事本打开)。3)根目录下有个FAQ.html,这个网站是官方的问答网页,可以参考有没有自己想问的问题。

       上述说的两个README文件,第一个是对LIBSVM的整体的介绍,包括如何训练、如何预测等。第二个README文件是介绍了对训练SVM有作用的python程序,比如检测输入数据格式正确与否、随机的对大样本分成两个小的子集的程序。

二、LIBSVM需要的数据格式

    虽然LIBSVM已经实现了最简单的使用方式:输入数据即可得出结果。但是,这里输入数据时得符合一定格式,这样LIBSVM才能去正确的运行。LIBSVM训练文件和测试文件的的格式要求如下:

<label> <index1>:<value1> <index2>:<value2> ...//实际使用时无尖括号<>

<类别> <索引1>:<属性值1> <索引2>:<属性值2>...//实际使用时无尖括号<>

注意:<类别>一般表示正样本或负样本,也就是整数1或-1,索引1、索引2是从1开始的正整数,也就是维数。属性值1、属性值2表示样本的属性。比如,有一个男生一个女生,假设男生为1、女生为-1。有两个属性体重和身高,则格式如下:

+1 1:70 2:178

-1 1:50 2:165

上面格式中,70和50分别代表属性-体重,175和165代表属性-身高。      

 以上是对于C-SVC(人脸、车辆、行人等均属于此,均用以上格式)而言,对于回归,one-class SVM格式稍有不同,主要是label可能不是1和-1,索引从0开始还是从1开始的不同。具体README文件有写。

三、LIBSVM自带的例子

    为方便使用,LIBSVM自带了一个例子,是一个文件,根目录下的heart_scale文件,建议使用Notepad++打开查看,该文件是按照LIBSVM格式写的。训练较大数据是耗时的。 有时,应该先在较小的子集上工作。tools文件夹下的python脚本subset.py可以随机选择指定数量的样本。 

     因为LIBSVM提供的例子只有一个heart_scale,没有测试数据,因此我们可以把heart_scale分成两部分,一部分用于训练一部分用于测试。因此,就需要用到生成自己的工具tools文件夹下的subset.py。这里介绍Windows下DOS下的使用方法。调出DOS的方式可用以下方法:首先,Win+R快捷键调出运行窗口,然后输入cmd,然后点击“确定”进入DOS下,进入自己下载的libsvm文件夹,如下图所示:

LIBSVM使用说明、简介及感悟

具体DOS下进入某个文件夹的方法可以网上查一下,根据我的截图也可以的。DOS下默认是进入C,我的libsvm-3.22是在F盘,因此需要进入F:\libsvm-3.22\tools,要使用该文件下的subset.py,必须把heart_scale复制到tools文件夹下,即subset.py和heart_scale必须在 同一目录下。subset.py的使用方法如下:

subset.py [options] dataset number [output1] [output2]

这里[options]可以为1或0,默认是0。0和1的区别可以去看README文件,dataset 代表要划分的数据文件,number 表示第一个自己的数目。[output1]表示第一个子集,数目为number ,[output2]为另一个子集。如下图所示:

LIBSVM使用说明、简介及感悟

则subset.py目录下会生成两个文件,heart_train.txt和heart_test.txt。heart_train.txt有170个数据用于训练,heart_test.txt是剩余的100个文数据用于测试。

这里使用svm-train,使用方法如下

Usage: svm-train [options] training_set_file [model_file]

注意:这里的中括号[],是可选或不可选的意思。即忽略方括号也是可以正常运行的,只不过方括号的意思是可以自己设置各种参数,比如,SVM类型、核函数类型等。如果不选则会调用默认参数,默认情况下SVM类型是C-SVC,核函数是RBF(radial basis function,径向基函数),此处我们使用默认参数,把上面用subset.py划分的两个子集heart_train.txt和heart_test.txt复制到与svm-train.exe同目录下(很重要)。根据svm-train的使用方法,训练如下:

LIBSVM使用说明、简介及感悟

这时在svm-train.exe文件夹下会有训练的结果:train_model.txt.如果DOS下没有指定输出模型的名字(train_model.txt),则会根据训练文件的名字,在名字后面加后缀model,把训练模型写到该文件中。如,heart_train.txt.model,用Notepad++打开即可。分析DOS下训练输出模型的参数意义:

*

optimization finished,#iter = 103     //103表示迭代次数,

nu = 0.461803     //核函数的参数

obj = -66.516593,rho = 0.238985//obj是SVM转换为的二次规划求解得到的最小值对偶题的最优目标值,rho是决策函数                                                   //sgn(w^x-rho)中的偏差项(也是b,wx+b)。

nSV = 88,nBSV = 69     //nSV是支持向量的个数,nBSV是边界上支持向量的个数

Total nSV = 88     //支持向量的总的个数

训练得到了模型,就可以直接用该模型进行预测了,预测使用svm-predict.exe

Usage: svm-predict [options] test_file model_file output_file

DOS下会输出正确率,

LIBSVM使用说明、简介及感悟

svm-predict目录下则会出现自己命名的文件predict_result.txt,里面是预测的结果。

以上就是基本的使用方法,tools文件夹下带有一些实用的工具,比如检查LIBSVM格式的checkdata.py等,都是帮助更好的使用LIBSVM的。