LIBSVM是台湾大学林智仁(Lin Chih-Jen)教授等开发设计的一个简单、易于使用和快速有效的SVM模式识别与回归的软件包,他不但提供了编译好的可在Windows系列系统的执行文件,还提供了源代码,方便改进、修改以及在其它操作系统上应用;该软件对SVM所涉及的参数调节相对比较少,提供了很多的默认参数,利用这些默认参数可以解决很多问题;并提供了交互检验(Cross Validation)的功能。
LibSVM的一般使用过程如下:
- (1) 准备数据,使其符合软件包处理的特定格式;
- (2) 利用数据进行缩放操作,此步是为了提高结果的精度和效率;
- (3) 选定核函数;
- (4) 设置相应的参数对训练集进行训练获取SVM模型;
- (5) 利用得到的模型对测试集进行测试预测。
下载网址,最新版3.2.0
http://www.csie.ntu.edu.tw/~cjlin/libsvm/#java
下载后有各种版本的,我们选择java版本的
java版本的包括一个可执行的jar包和源码,可以直接使用jar包方式运行程序(具体参见README文档)
这里我们使用导入源码到eclipse中运行
训练数据和测试数据下载页面
http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/
这里我下载的叫usps的数据集,分成了10类,训练样本7291,测试样本2007,属性(变量)256个
训练数据格式
LibSVM使用的数据格式为<label> <index1>:<value1> <index2>:<value2> …
label表示分类,index表示第几个变量/特征,
(2) 数据缩放
svm-scale.java 帮助提示
归一化后的数据默认显示在控制台上所以我们要重定向到文件里保存
java -classpath libsvm.jar svm_scale -s 1.txt usps > scale
表示将usps训练集进行缩放(默认的规则),将缩放后的数据结果重定向输出到scale,并将这个缩放规则存储在1.txt中以便后面继续使用。
java -classpath libsvm.jar svm_toy
弹出一个图形窗口自己可以在上面绘制不同颜色的点进行测试
(3) 选定核函数
(4) 训练
svm-train帮助提示
java -classpath libsvm.jar svm_train scale model
将归一化后的数据文件scale训练成模型保存在model文件中,训练过程如下
生成的model模型文件如下
5) 测试
svm_predict帮助提示
java -classpath libsvm.jar svm_predict usps.t model output
命令将测试文件usps.t与模型文件model进行对比预测,将结果保存在output文件中。可选参数-b为1的话则保存其概率。
没有归一化后的测试结果
归一化后的结果稍好
预测结果文件output中直接是测试集中每个样本的分类,是属于哪个label。
参考文章:
http://www.tanglei.name/an-example-for-beginning-to-learn-libsvm/
别人翻译的README里面命令参数详解
http://blog.sina.com.cn/s/blog_4c38701d01011ept.html
注:One Class SVM 是指你的training data 只有一类positive (或者negative)的data, 而没有另外的一类。在这时,你需要learn的实际上你training data 的boundary。而这时不能使用 maximum margin 了,因为你没有两类的data。 所以呢,在这边文章中,“Estimating the support of a high-dimensional distribution”, Schlkopf 假设最好的boundary要远离feature space 中的原点。
左边是在original space中的boundary,可以看到有很多的boundary 都符合要求,但是比较靠谱的是找一个比较 紧(closeness) 的boundary (红色的)。这个目标转换到feature space 就是找一个离原点比较远的boundary,同样是红色的直线。当然这些约束条件都是人为加上去的,你可以按照你自己的需要采取相应的约束条件。比如让你data 的中心离原点最远。
这些都是我个人的理解,我不是专门研究machine learning的。如有不妥之处,还望指出。