一、LibSVM原理
(一)libSVM简介
libSVM是台湾林智仁(Chih-Jen Lin) 教授2001年开发的一套支持向量机库,这套库运算速度挺快,可以很方便的对数据做分类或回归。由于libSVM程序小,运用灵活,输入参数少,并且是开源的,易于扩展,因此成为目前国内应用最多的SVM的库。 本实验使用libSVM3.18版本
(二) libSVM 包含的内容
- Java文件夹 ,主要应用于java平台;
- Python文件夹,是用来参数优选的工具,稍后介绍;
- tools文件夹,主要包含四个python文件,用来数据集抽样(subset),参数优选(grid),集成测试(easy), 数据查(checkdata);
- windows文件夹 —— 包含libSVM四个exe程序包,我们所用的库就是他们,里面还有个heart_scale,是一 个样本文件,可以用 记事本打开,用来测试用的。
- svm-toy文件,一个可视化的工具,用来展示训练数据和分类界面,里面是源码,其编译后的程序在windows文件夹下;
- heart_scale文件,是测试用的训练文件
- 其他.h和.cpp文件都是程序的源码,可以编译出相应的.exe文件。其中,最重要的是svm.h和svm.cpp文件,svm-predict.c、svm-scale.c和svm-train.c(还有一个svm-toy.c在svm-toy文件夹中)都是调用的这个文件中的接口函数,编译后就是windows下相应的四个exe程序。另外,里面的 README 跟 FAQ 是很好的帮助文件。
(三) libSVM的训练文本的格式
首先必须了解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
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-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则提供了对样本文件做了“一条龙服务”,从参数优选,到文件预测。
二、 Windows最简单的SVM实验
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.点击运行
四、Sklearn+matlab绘制SVM决策函数
(一)准备数据
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.输出文件
- my.txt训练数据
- line.txt线性模型
- poly多项式模型
- RBF高斯核模型
3.输出模型 线性模型
多项式模型
高斯核模型
(四)决策函数
根据公式f(x)=wT*x+b以及模型数据可以求得最终的决策函数。
- wT为向量的转置矩阵,即为模型数据中的SV
- b为偏置常数,即为数据模型中的rho
五、总结
本次实验了解了 libSVM的背景、原理、训练文本的格式等,如何用libsvm绘制鸢尾花数据集图像,以及libSVM绘制图像的具体方法。
六、参考资料
libsvm简介和函数调用参数说明 基于LibSVM得到决策函数
|