libsvm使用步骤

转载自:http://blog.renren.com/share/201313277/12978504740#nogo

一、Libsvm之初相识

1、libsvm简介(略)

  Libsvm主要是用来模式识别与回归,这部分可以自己上网去看,在此略。

2、Libsvm、python、gnuplot下载

  会不会奇怪为什么还要下载python和gnuplot这两个软件很重要,是后面搜索最优参数要用到的,也是很关键的一步。

我用的版本:libsvm-3.12,Python2.4,对于gnuplot,我用的是gp400win32.zip,下面是下载地址:

Libsvm-3.12:http://www.csie.ntu.edu.tw/~cjlin/(libsvm创始人台湾大学林智仁副教授个人主页) 
Python2.4:http://download.csdn.net/detail/linghu9990/3512232(这个是不要积分的)

gp400win32.zip:http://ishare.iask.sina.com.cn/f/14895214.html?from=like

Gridregression.py:http://download.csdn.net/detail/killa11/2225384

将其复制到libsvm下的python2.4文件夹下。

将Libsvm-3.12和gp400win32.zip解压,这两个都不用安装。Python2.4要安装。下面是它们的路径(个人习惯,可以重命名文件或者对文件夹进行整理,以便后续运行):

Libsvm:G:\shukong下面(这里我将libsvm-3.12重命名为libsvm)

Python:G:\shukong\libsvm下面(python2.4重命名为python)记得将python下面的python.exe复制到libsvm下的tools中

gp400win32.zip:G:\shukong\libsvm下面(只保留了gnuplot这个文件夹)

 

3、环境变量的设置以及如何在DOS下寻找路径

1)环境变量的设置(不明白为什么要设置环境变量@_@,但为了避免后续出了问题不知怎么解决,还是设置了)

添加环境变量到path:右击“计算机(我的电脑)”->属性->高级系统设置->高级->环境变量->系统变量列表里双击path在变量值最后添加“;G:\shukong\libsvm\windows”,这就对Libsvm环境变量设置好了,然后设置python环境变量,也和上面一样,在变量值最后添加“;G:\shukong\libsvm\tools”。如图1:

                                libsvm使用步骤_第1张图片

2)如何在DOS下寻找路径(这部分会的可以不用看,像我这种菜鸟,还是百度才知道的%>_<%)

 点击“开始”按钮,进入“命令提示符”,默认路径是“C:\User\acer>”。这里有两种情况:一是像我是放在G盘的,所以要将路径改为G盘,方法是:直接在命令提示符里输入“G:”然后回车,就进入G盘的根目录了。如图2:

                 libsvm使用步骤_第2张图片

      还有就是虽然在C盘,但是不在“C:\User\acer>”,这时就先要进入C盘的根目录,方法如下:在命令提示符下输入“cd\”然后回车即可。如图3:

                libsvm使用步骤_第3张图片

 

以上两种情况,进入根目录以后,我们就可以进入libsvm的路径,在这里,我们先进入“G:\shukong\libsvm>”(只是我自己在G盘,你要根据自己实际路径进入),方法如下:

   在命令提示符中输入“cd shukong”,然后回车,再输入“cd libsvm”然后回车即可。如图4:

                    libsvm使用步骤_第4张图片

二、Libsvm之再体验

怎么样,初相识还不是很难的吧,下面个人感觉就有点麻烦了。大家耐心哈。

1、将原始数据改为libsvm所规定的数据格式。

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

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

       目标值 第一维特征编号:第一维特征值 第二维特征编号:第二维特征值…

例如:2.3 1:5.6 2:3.2 

表示训练用的特征有两维,第一维是5.6,第二维是3.2,目标值是2.3 

原始数据改为libsvm所规定的数据格式有2种方法:

1)使用网络上FormatDataLibsvm.xls来完成(我的excel版本不支持宏命令,所以此种方法没有用)。 

FormatDataLibsvm.xls使用说明: 

a. 先将数据按照下列格式存放(注意label放最后面): 

value1 value2 … label 

value1 value2 … label 

value1 value2 … label

b. 然后将以上数据粘贴到FormatDataLibsvm.xls中的最左上角单元格,接着工具->宏->执行FormatDataToLibsvm宏。就可以得到libsvm要求的数据格式。

 

2)采用编程实现

a. 先将数据按照下列格式存放(注意label放最后面): 

value1 value2 … label 

value1 value2 … label 

value1 value2 … label

b.本人使用的是简单的matlab编程来实现(以下是本人部分数据)

原数据(data1.txt)如图5:

                       libsvm使用步骤_第5张图片

 

转换之后的数据(svmdata1.txt)如图6:

                             libsvm使用步骤_第6张图片

 

用matlab进行数据转换之后,把svmdata1.txt复制到libsvm文件夹下的tools文件夹即可。

3)数据格式转换好了,那么在libsvm的tools文件夹下还有一个工具,可以用来检查你的数据格式是否正确,那就是checkdata.py。方法是:

打开"命令提示符",进入到libsvm中的tools文件夹下,(怎么样进入我已在上面介绍过),然后输入命令“checkdata.py svmdata1.txt”回车,若显示“No error”,则表示数据格式正确。我的数据结果如图7。(注:如果用这个matlab程序转换的话,一定是no error的。^_^)

                   libsvm使用步骤_第7张图片

 

这一步一般不会有太大的问题。

2、用svm-scale.exe对数据集进行归一化处理。

因为原始数据可能范围过大或过小, svmscale可以先将数据重新scale (縮放) 到适当范围使训练与预测速度更快。通常将数据缩放至[-1,1]或者[0,1]之间。

使用方法:svm-scale.exe [-l lower] [-u upper] [-y y_lower y_upper] [-s save_name] [-r store_name] filename;其中

    -l:数据下限标记;

lower:缩放后数据下限 缺省值: lower = -1;

-u:数据上限标记;

upper:缺省值: upper =  1,代表着没有对y进行缩放;

-y:是否对目标值同时进行缩放;

y_lower:为下限值;

y_upper:为上限值;(回归需要对目标进行缩放,因此该参数可以设定为 –y -1 1 );

-s save_name:表示将缩放的规则保存为文件save_name;

-r store_name:表示将缩放规则文件store_name载入后按此缩放; 

filename:待缩放的数据文件(要求满足前面所述的格式)。

在进行这一步的时候,我们要用到的数据是上一步已经改好格式的数据,即svmdata1.txt,所以要把svmdata1.txt复制到libsvm中的windows文件夹下。

具体操作,打开“命令提示符”,进入libsvm中的windows下,输入命令“svm-scale.exe -l 0 -u 1 svmdata1.txt>data.txt”。如图8。

                       libsvm使用步骤_第8张图片              

 

这里,我们把svmdata1.txt里面的数据缩放为[0,1]之间,并另存为data.txt,这时,在windows下面会多出一个data.txt,里面就是你要的数据。我没有保存规则,就不用-s。这里也有几个问题:

a.请看下图9:

                       libsvm使用步骤_第9张图片

 

和上图对比,感觉输入的命令是一样的,但是却提示错误,打开data.txt却并没有数据,却是英文的svm-scale的用法,刚开始,一直这样,我痛苦死了,后来仔细一看才明白,原来那个是英文的‘l’而我写的是数字‘1’,这样一改就好了。图10:

           libsvm使用步骤_第10张图片

归一化后的数据如图11:

     libsvm使用步骤_第11张图片

 

可以看到前几行索引没有‘3’,这是因为索引为‘3’的value是0,所以为了节省内存,就不显示了,这并不是错误,不要担心。

3、用gridregression.py搜索最优参数,主要是c和g。

数据都准备好了之后,就可以用svm-train来训练模型了,然而,了解svm-train的都知道,训练的时候又很多的参数,而这些参数又不能随便选,会有最优的,但是人工去选的话,会很麻烦,我看好多人都说用libsvm自带的grid.py进行参数的搜索,但是我查了,也实践了,好像grid.py不支持回归的,于是我用gridregression.py来搜索最优参数。

有关gridregression.py的下载,在第一步已经说了,不在赘述。先打开gridregression.py,注意用Eidt with IDLE打开,然后里面有些参数要改一下。

改前如图12:

          libsvm使用步骤_第12张图片

改后如图13:

         libsvm使用步骤_第13张图片

 

其实要改的就这些,主要是把svmtain_exe和gnuplot_exe的路径改为自己的路径就行。

然后就可以进行寻优了。要先把路径调好,注意调到G:\shukong\libsvm\python2.4下。

然后输入下面的语句:python G:\shukong\libsvm\python2.4\gridregression.py -svmtain G:\shukong\libsvm\windows\svm-train.exe -gnuplot G:\shukong\libsvm\gnuplot\bin\pgnuplot.exe -log2c -10,10,1 -log2g -10,10,1 -log2p -10,10,1 -v 10 -s 3 -t 2 G:\shukong\libsvm\tools\data.txt如图14:

    libsvm使用步骤_第14张图片

 

这个比较多字母,容易输错,我是在worrd文档里键入,然后复制到命令提示符中,回车,就开始跑了,在命令提示符窗口中看到运行过程。过程可能会比较长,我的数据少,很快就有结果了。

另:我在网上看的,如果输入python G:\shukong\libsvm\python2.4\gridregression.py -svmtain G:\shukong\libsvm\windows\svm-train.exe -gnuplot G:\shukong\libsvm\gnuplot\bin\pgnuplot.exe -log2c -10,10,1 -log2g -10,10,1 -log2p -10,10,1 -v 10 -s 3 -t 2 G:\shukong\libsvm\tools\data.txt>gridregression_data.parameter比上面的输入多了最后的“>gridregression_data.parameter”,表示将结果保存在gridregression_data.parameter中,会在python文件夹中多出一个gridregression_data.parameter文件,但是在命令提示符中不会看到运行过程,这种方法我也尝试了,但是时间会非常长,大概花了4个小时,而且网上用这个方法的人也是运行了大概24小时,还是没结束,所以,还是不要保存为好,用上面的输入就行。寻优结果如图15:

    libsvm使用步骤_第15张图片

 可以看到寻优的过程,只需关注最后一行即可。最后一行分别为c,g,p,mse,一般来说mse这个参数不是很重要,是越小越好吧(至于为什么是越小越好,我也不清楚哇~~)。

4、用svm-train训练模型。

svmtrain我们在前面已经接触过,他主要实现对训练数据集的训练,并可以获得SVM模型。

        用法: svmtrain [options] training_set_file [model_file]

其中,options为操作参数,至于参数的可的选项及表示的涵义,大家可以在livbsvm中自带的readme里面看得到,很详细,不再赘述。这里只介绍我所选择的参数及其值。

打开命令提示符,进入G:\shukong\libsvm\windows然后输入“svm-train -s 3 -t 2 -c 1024.0 -g 4 .0 -p 0.0625 data.txt”,这里-s是选择SVM的类型。对于回归来说,只能选3或者4,3表示epsilon-support vector regression, 4表示nu-support vector regression。-t是选择核函数,通常选用RBF核函数。然后c,g,p我们已经寻出,直接运行即可。如图16:

        libsvm使用步骤_第16张图片

 

#iter 为迭代次数, nu 与前面的操作参数 -n n 相同, obj 为 SVM 文件

转换为的二次规划求解得到的最小值, rho 为判决函数的常数项 b , nSV 为支持

向量个数, nBSV 为边界上的支持向量个数, Total nSV 为支持向量总个数。

这时在windows中会生成一个data.txt.model文件。可以用来进行下面的预测了。

5、用svm-predict预测。

vmpredict 是根据训练获得的模型,对数据集合进行预测。

   用法: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 的输出文件,表示预测的结果值。

还是在命令提示符windows下输入“svm-predict  test.txt  data.txt.model out.txt”,如图17:

    

 可以看到,第一行是均差,第二行是相关系数,预测结果还是不错的。如果预测结果不好,一可能是你的参数选择不当,还可能是你的特征值选择的有问题。

另外,在windows下会生成一个out.txt文件,可以打开看一下和test.txt文件的差别。


这里面有一些是需要注意改正的地方:

这几个压缩包,最好和博客上说明的版本号一样,不然在gridregression.py调用时会出项语法问题。搜索最优参数时,gridregression.py中的路径必须和cmd命令行中的严格一致。因为路径下有文件夹名字program files,文件夹名字中间有空格的话,识别不到,所以创建一个镜像,例如在cmd中输入 subst w: "D:\program files" 然后可以直接用w:\代替D:\program files了。所以,在gridregression.py文件中,所有的D:\program files也要用w:来表示。开始时没有对应,出现了worker local quit的错误。worker local quit的原因是数据文件为空,或者数据文件太大,出现内存溢出。



有两个博文可以值得学习:

http://blog.sina.com.cn/s/blog_5980835e0100drwx.html

http://blog.sina.com.cn/s/blog_5980835e0100dp52.html

http://freehello.blogspot.com/2009/04/libsvm.html


你可能感兴趣的:(图像处理学习笔记)