下载 LibSVM。
了解LibSVM 工具的训练数据集的格式和训练获得的决策函数模型(model)的格式。以鸢尾花Iris数据集为例,手工制作一个 两个特征的二分类的Iris数据集(类似之前作业鸢尾花数据集),用LibSVM工具分别进行线性、多项式、高斯核这三种分类训练,计算预测精度;根据训练获得的决策函数模型,写出决策函数的数学公式。
嘿,我是目录
一、下载LibSVM压缩包
- 下载地址:https://www.csie.ntu.edu.tw/~cjlin/libsvm/
- 我们这里下载的是3.25版本的。
- 滑动页面,找到zip.file,点击下载:
- 解压文件。
二、鸢尾花Iris数据集
2.1 手工制作一个 两个特征的二分类的Iris数据集
- 打开解压的文件:LibSVM-3.25 → windows → svm-toy.exe
- 在界面上点上几十个点,以下一些解释:
Change:改变画点画笔的颜色
Run:运行,画出边界线
Clear:清除界面上所有的点
Save:保存为文件 - 下面是笔主画好点的界面,然后点击run:
- run后的界面
- Save保存为名为iris1.txt文件。
- 增加一些点数后,重新保存为iris2.txt文件。
2.2 实现
利用上述 iris鸢尾花数据集 实现模型训练并写出决策函数的数学公式。
2.2.1 构建项目
- 在IDEA中新建一个项目
- 然后后面一直next,然后拷贝文件:(此处是直接复制 libsvm(libsvm-3.25\java\libsvm) 到新建好的项目的src中粘贴)
- 在src下新建一个名为 text 的包,libsvm-3.25\java 中部分文件复制到 java 项目 src文件下 test文件中,如下:
- 在text包下,新建一个Test.java文件。
- 最终IDEA项目结构如下:
2.2.2 实验代码
- 将代码写入Text.java中:
package text;
import java.io.IOException;
public class Text {
public static void main(String args[]) throws IOException {
//存放数据以及保存模型文件路径,此处为自己保存的数据集的路径
String filepath = "D:\\ProgramData\\wenjian\\iris\\";
/*
* -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+"iris1.txt",filepath+"line.txt"};
String[] arg1 = {
filepath+"iris2.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);
}
}
注意:String filepath 的路径是自己存放数据集文件的路径。
2.2.3 运行结果
- 输出模型参数说明:
optimization finished, #iter = 90 //90表示迭代次数,
nu = 0.2787748550615065 //核函数的参数
obj = -244.6307121544692, rho = -8.092554406036138
//obj是SVM转换为的二次规划求解得到的最小值对偶题的最优目标值,rho是决策函数 //sgn(w^x-rho)中的偏差项(也是b,wx+b)。
nSV = 33, nBSV = 30 //nSV是支持向量的个数,nBSV是边界上支持向量的个数
Total nSV = 33 //支持向量的总的个数
Accuracy = 91.01796407185628% (152/167) (classification) //精度
分析结果可知多项式和高斯核训练的模型精度略高于线性。
决策函数:
公式:f(x)=SV*x+rho
SV的值在生成的txt文件内。
在路径下可以看到生成了如下文件:
它们分别是使用LibSVM工具进行线性,多项式,高斯核这三种分类训练后得到的数据文件,任意打开一个文件如下:
可以看见文件中除了有上述输出参数,还有所有支持向量的数据。
小小的总结
在用IDEA做此实验之前,笔主一直尝试用Acaconda3 的 Jupyter Notebook 来做,但一直出现很多问题,于是改用IDEA。
使用LibSVM工具,特别是构建数据集的时候特别方便;
在进行决策树训练,不仅能够直观地以图形界面显示,也能利用工具中的代码灵活地在项目中使用,并得到相关系数的输出。