svm理论与实验之11:svm开发工具包LibSVM


徐海蛟博士 Teaching.


光说不练,很难真正理解svm的妙处,也难以真正实用。所以,有必要跟着徐海蛟老师一起练习svm。svm理论和工具已经很成熟了。童鞋们并不需要手写每一行代码。一个非常好用的开发工具包是LibSVM,支持C++、Java、Matlab语言。libSVM只是众多SVM实现版本中的其中之一。


LibSVM是台湾大学林智仁(Chih-Jen Lin) 教授2001年开发的一套svm支持向量机的库,这套库运算速度还是挺快的,可以很方便的对数据做分类或回归。由于libSVM程序小,运用灵活,输入参数少,并且是开源的,易于扩展,因此成为目前国内应用最多的SVM的库。


这套库可以从官网免费获得,目前已经发展到3.17版(2013年4月)。Libsvm ReadMe中文说明文件在。下载.zip格式的版本,解压后可以看到,主要有6个文件夹和一些c++源码文件。


Java ―― 主要是应用于java平台;
Matlab ―― 主要是应用于matlab平台;
Python ―― 是用来参数优选的工具,稍后介绍;
svm-toy ―― 一个可视化的工具,用来展示训练数据和分类界面,里面是源码,其编译后的程序在windows文件夹下;
tools ―― 主要包含四个python文件,用来数据集抽样(subset),参数优选(grid),集成测试(easy), 数据检查(checkdata);
windows ―― 包含libSVM四个exe程序(svm-scale,svm-toy,svm-train,svm-predict)。


svm-scale:一个用于对输入数据进行归一化的简易工具;
svm-toy:一个带有图形界面的交互式SVM二分类功能演示小工具;
svm-train:对用户输入的数据进行SVM训练。其中,训练数据是按照以下格式输入的:
<类别号> <索引1>:<特征值1> <索引2>:<特征值2>...
svm-predict:根据SVM训练得到的模型,对输入数据进行预测,即分类。


在目录libsvm-3.17\下,还有heart_scale,是一个样本文件,包含270个正反例样本点,可以用记事本打开,用来测试用的。


其他.h和.cpp文件都是程序的源码,可以编译出相应的.exe文件。其中,最重要的是svm.h和svm.cpp文件,svm-predict.c、svm-scale.c和svm-train.c(还有一个svm-toy.c在svm-toy\windows\文件夹中)都是调用的这个文件中的接口函数,编译后就是windows\下相应的四个exe程序。

另外,里面的 README 跟 FAQ 也是很好的文件,对于初学者如果E文过得去,可以看一下。PS:《libsvm最新ReadMe中文档New2013》在csdn里面有下载。


下面以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的体验之旅。


类似地,如果是使用Java版本的Libsvm,在myeclipse里面很快搞定。


windows\的子文件夹,里面有一个名为svm-toy.exe的可执行文件,这个小玩意儿是比较直观地感受下svm的分类效果,它是一个带有图形界面的交互式SVM二分类功能演示小工具。直接双击,运行该可执行文件。


点击第二个按钮“Run”,然后,在左上部分,用鼠标左键随机点几下,代表你选择的第一类模式的数据分布。


之后,点击“Change”,接着,用鼠标左键在窗口右下方随便点击几下,代表你选择的第二类模式的数据分布,如下图所示:

Center


接着,点击“Run”,libSVM就帮你把这两类模式分开了,并用两种不同的颜色区域来代表两类不同的模式,如下图所示:

Center

图中左上方色的区域,是第一类模式所在的区域,右下方的区域,是你选择的第二类模式所在的的区域,而两者的分界面,也就是SVM的最优分类面。当然,SVM是通过核函数将原始数据映射到高维空间,在高维空间进行线性分类。换句话说,在高维空间,这两类数据应该是线性可分的,即:最优分类面应该是一条直线,而这里看到的,是将高维空间分类的结果又映射回原始空间所呈现的分类结果,即:非线性的分类面。

细心的朋友可能已经发现,在上述界面的右下角,有一个编辑框,里面写着“-t 2 -c 100”,显然,这是libSVM的一些参数: 径向基核函数,惩罚因子100,你也可以试着更改这些参数,来选择不同的核函数、不同的SVM类型等来达到最好的分类效果。


你可能感兴趣的:(数据挖掘,大数据,SVM,智能搜索)