一、LibSVM概述
LIBSVM是台湾大学林智仁(LinChih-Jen)教授等开发设计的一个简单、易于使用和快速有效的SVM模式识别与回归的软件包,他不但提供了编译好的可在Windows系列系统的执行文件,还提供了源代码,方便改进、修改以及在其它操作系统上应用;该软件对SVM所涉及的参数调节相对比较少,提供了很多的默认参数,利用这些默认参数可以解决很多问题;并提供了交互检验(CrossValidation)的功能。该软件可以解决C-SVM、ν-SVM、ε-SVR和ν-SVR等问题,包括基于一对一算法的多类模式识别问题。
- SVM用于模式识别或回归时,SVM方法及其参数、核函数及其参数的选择,也就是说最优SVM算法参数选择还只能是凭借经验、实验对比、大范围的搜寻或者利用软件包提供的交互检验功能进行寻优。
- LIBSVM拥有C、Java、Matlab、C#、Ruby、Python、R、Perl、CommonLISP、Labview、php等数十种语言版本。最常使用的是C、Matlab、Java和命令行(c语言编译的工具)的版本。
二、用LibSVM制作数据集
-
打开制作数据集的工具
-
制作数据集
-
在上一步的基础上添加一些点生成新的数据集
三、用IDEA建立项目进行训练
-
在IDEA中新建一个项目,然后将下图所示文件全部复制到scr文件目录下
-
在项目之下新建一个名为test的package,将如下图的文件添加进去
-
在test package中新建一个Test类,并在其中添加如下代码:
package test;
import java.io.IOException;
public class Test {
public static void main(String args[]) throws IOException {
//存放数据以及保存模型文件路径
String filepath = "F:\\SVM\\";
/*
* -s 设置svm类型:默认值为0
* 0– C-SVC
* 1 – v-SVC
* 2 – one-class-SVM
* 3 –ε-SVR
* 4 – n - SVR
*
* -t 设置核函数类型,默认值为2
* 0 --线性核
* 1 --多项式核
* 2 -- RBF核
* 3 -- sigmoid核
*
* -d degree:设置多项式核中degree的值,默认为3
*
* -c cost:设置C-SVC、ε-SVR、n - SVR中从惩罚系数C,默认值为1;
*/
String[] arg = {"-s","0","-c","10","-t","0",filepath+"first.txt",filepath+"line.txt"};
String[] arg1 = {filepath+"second.txt",filepath+"line.txt",filepath+"predict1.txt"};
System.out.println("----------------线性-----------------");
//训练函数
svm_train.main(arg);
svm_predict.main(arg1);
arg[5]="1";
arg[7]=filepath+"poly.txt";//输出文件路径
arg1[1]=filepath+"poly.txt";
arg1[2]=filepath+"predict2.txt";
System.out.println("---------------多项式-----------------");
svm_train.main(arg);
svm_predict.main(arg1);
arg[5]="2";
arg[7]=filepath+"RBF.txt";
arg1[1]=filepath+"RBF.txt";
arg1[2]=filepath+"predict3.txt";
System.out.println("---------------高斯核-----------------");
svm_train.main(arg);
svm_predict.main(arg1);
}
}
-
得到的项目结构图如下
-
运行程序得到结果如下:
- 结果分析
optimization finished, #iter = 20 //20表示迭代次数,
nu = 0.06324266557131494 //核函数的参数
obj = -26.661864412550123, rho = -4.156694422061656
//obj是SVM转换为的二次规划求解得到的最小值对偶题的最优目标值,rho是决策函数
//sgn(w^x-rho)中的偏差项(也是b,wx+b)。
nSV = 6, nBSV = 3 //nSV是支持向量的个数,nBSV是边界上支持向量的个数
Total nSV = 6 //支持向量的总的个数
Accuracy = 89.20454545454545% (157/176) (classification) //精度 - 使用LibSVM工具进行线性,多项式,高斯核这三种分类训练后得到的数据文件:
线性核:
多项式:
高斯核:
对结果进行对比可以很容易看出来多项式和高斯核的精度高于线性。
决策树的数学公式: f(x)=SV*x+rho
四、总结
本次实验用LibSVM进行决策树训练,相比之前最大的区别是可以自己建立数据集,调整不同的参数。然后结果更加清晰,一目了然。