基于LibSVM训练编写决策函数

基于LibSVM训练编写决策函数

一、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的训练文本的格式

首先必须了解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界面看到如下结果:
基于LibSVM训练编写决策函数

其中,#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
基于LibSVM训练编写决策函数
2.绘制点
基于LibSVM训练编写决策函数
3.点击运行
基于LibSVM训练编写决策函数

四、Sklearn+matlab绘制SVM决策函数

(一)准备数据

1.打开libsvm文件下的windows文件里面的svm-toy程序
基于LibSVM训练编写决策函数

2.在程序中进行手工绘制数据并保存数据
基于LibSVM训练编写决策函数

(二)代码实现

1.打开IDEA,导入文件如下
基于LibSVM训练编写决策函数
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.代码运行结果
基于LibSVM训练编写决策函数
2.输出文件

  • my.txt训练数据
  • line.txt线性模型
  • poly多项式模型
  • RBF高斯核模型
    基于LibSVM训练编写决策函数
    3.输出模型
    线性模型
    基于LibSVM训练编写决策函数

多项式模型
基于LibSVM训练编写决策函数

高斯核模型
基于LibSVM训练编写决策函数

(四)决策函数

根据公式f(x)=wT*x+b以及模型数据可以求得最终的决策函数。

  • wT为向量的转置矩阵,即为模型数据中的SV
  • b为偏置常数,即为数据模型中的rho

五、总结

本次实验了解了 libSVM的背景、原理、训练文本的格式等,如何用libsvm绘制鸢尾花数据集图像,以及libSVM绘制图像的具体方法。

六、参考资料

libsvm简介和函数调用参数说明
基于LibSVM得到决策函数

上一篇:拉格朗日乘数,KKT条件,对偶问题


下一篇:SVM核心点