libSVM是台湾林智仁(Chih-Jen Lin) 教授2001年开发的一套支持向量机库,这套库运算速度挺快,可以很方便的对数据做分类或回归。由于libSVM程序小,运用灵活,输入参数少,并且是开源的,易于扩展,因此成为目前国内应用最多的SVM的库。
本实验使用libSVM3.18版本
首先必须了解libSVM数据格式,格式如下:
< label > < index1>:< value1> < index2>:< value2> …//实际使用时无尖括号<>
<类别> <索引1>:<属性值1> <索引2>:<属性值2>…//实际使用时无尖括号<>
注意:<类别>一般表示正样本或负样本,也就是整数1或-1,索引1、索引2是从1开始的正整数,也就是维数。属性值1、属性值2表示样本的属性。比如,有一个男生一个女生,假设男生为1、女生为-1。有两个属性体重和身高,则格式如下:
+1 1:70 2:178
-1 1:50 2:165
上面格式中,70和50分别代表属性-体重,175和165代表属性-身高
svm-scale是用来对原始样本进行缩放的,范围可以自己定,一般是[0,1]或[-1,1]。缩放的目的主要是 (1)防止某个特征过大或过小,从而在训练中起的作用不平衡; (2)为了计算速度,因为在核计算中,会用到内积运算或exp运算,不平衡的数据可能造成计算困难。
用法:svm-scale [-l lower] [ -u upper]
[-y y_lower y_upper]
[-s save_filename]
[-r restore_filename] filename
其中,
[]中都是可选项:
-l:设定数据下限;
lower:设定的数据下限值,缺省为-1 ;
-u设定数据上限;
upper:设定的数据上限值,缺省为 1;
-y:是否对目标值同时进行缩放;y_lower为下限值,y_upper为上限值;
-s save_filename:表示将缩放的规则保存为文件save_filename;
-r restore_filename:表示将按照已经存在的规则文件restore_filename进行缩放;
filename:待缩放的数据文件,文件格式按照libSVM格式。默认情况下,只需要输入要缩放的文件名就可以了:比如(已经存在的文件为)heart_scale。比如:svmscale –l 0 –u 1 –s test.rangeheart_scale out.txt,其中-l是数据下限,-u是数据上限,-s是保存文件,规则信息保存的文件名为test.range,需要缩放的文件时heart_scale,数据缩放的结果文件保存为out.txt。
svm-train主要实现对训练数据集的训练,并可以获得SVM模型。用法: svm-train [options] training_set_file [model_file],其中options为操作参数,可用的选项即表示的涵义如下所示:
-s 设置svm类型:
0 – C-SVC ;1 – v-SVC ; 2 – one-class-SVM ; 3 – ε-SVR ; 4 – n - SVR
-t 设置核函数类型,默认值为2
0 – 线性核:u’v ; 1 – 多项式核: (gu’v+ coef 0)degree
2 – RBF 核:exp(-γ||u-v||2) 3 – sigmoid 核:tanh(γ*u’*v+ coef 0)
-d degree: 设置多项式核中degree的值,默认为3
-gγ: 设置核函数中γ的值,默认为1/k,k为特征(或者说是属性)数;
-r coef 0:设置核函数中的coef 0,默认值为0;
-c cost:设置C-SVC、ε-SVR、n - SVR中从惩罚系数C,默认值为1;
-n v :设置v-SVC、one-class-SVM 与n - SVR 中参数n ,默认值0.5;
-p ε :设置v-SVR的损失函数中的e ,默认值为0.1;
-m cachesize:设置cache内存大小,以MB为单位,默认值为40;
-e ε :设置终止准则中的可容忍偏差,默认值为0.001;
-h shrinking:是否使用启发式,可选值为0 或1,默认值为1;
-b 概率估计:是否计算SVC或SVR的概率估计,可选值0 或1,默认0;
-wi weight:对各类样本的惩罚系数C加权,默认值为1;
-v n:n折交叉验证模式;
model_file:可选项,为要保存的结果文件,称为模型文件,以便在预测时使用。
训练完了之后,我们就可以对数据进行预测了,但是,训练的数据未必是最优参数,所以需要进一步优化。LibSVM提供了优化工具,就是tools文件夹,其中包含了grid.py文件和easy.py文件,grid文件可以针对训练数据优选出最佳参数值,而easy则提供了对样本文件做了“一条龙服务”,从参数优选,到文件预测。
1.首先解压工具包,切记工具包解压到英文的目录,因为很多DOS无法输入中文;
2.由于SVM的执行必须有参数,所以必须在DOS下输入执行文件,并输入参数才能运行,所以先打开MS-DOS,Win+R;
3. 定位到SVM中的windows目录下,DOS命令见附录1,我的目录是:F:\下载\libsvm-master\libsvm-master\windows>;
4.进行训练,输入命令:svm-train …/heart_scale train.model,其中heart_scale是训练文本下载LibSVM自带的、train.Model是训练后的输 出文本,输出权系数及各支持向量。
5.运行后,可以在DOS界面看到如下结果:
其中,#iter为迭代次数,nu
是你选择的核函数类型的参数,obj为SVM文件转换为的二次规划求解得到的最小值,rho为判决函数的偏置项b,nSV
为标准支持向量个数(0<a<c),nBSV为边界上的支持向量个数(a=c),Total
nSV为支持向量总个数(对于两类来说,因为只有一个分类模型Total nSV = nSV,但是对于多类,这个是各个分类模型的nSV之和)。
1.在LibSVM路径下找到windows
目录下的svm-toy.exe
2.绘制点
3.点击运行
1.打开libsvm文件下的windows文件里面的svm-toy程序
2.在程序中进行手工绘制数据并保存数据
1.打开IDEA,导入文件如下
2.新建个Test类用于训练
代码如下
package test; import java.io.IOException; import java.sql.SQLOutput; import test.svm_train; public class Test { public static void main(String args[]) throws IOException { //存放数据以及保存模型文件路径 String filepath = "F:\\IDEAproject\\test\\"; /** * -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+"my.txt",filepath+"line.txt"}; System.out.println("----------------线性-----------------"); //训练函数 svm_train.main(arg); arg[5]="1"; arg[7]=filepath+"poly.txt";//输出文件路径 System.out.println("---------------多项式-----------------"); svm_train.main(arg); arg[5]="2"; arg[7]=filepath+"RBF.txt"; System.out.println("---------------高斯核-----------------"); svm_train.main(arg); } }
1.代码运行结果
2.输出文件
多项式模型
高斯核模型
根据公式f(x)=wT*x+b以及模型数据可以求得最终的决策函数。
本次实验了解了 libSVM的背景、原理、训练文本的格式等,如何用libsvm绘制鸢尾花数据集图像,以及libSVM绘制图像的具体方法。
libsvm简介和函数调用参数说明
基于LibSVM得到决策函数