基于LibSVM支持向量机并获取决策函数

一、LibSVM简介

  1. LIBSVM是台湾大学林智仁(Lin Chih-Jen)教授等开发设计的一个简单、易于使用和快速有效的SVM模式识别与回归的软件包。
  2. LIBSVM不但提供了编译好的可在Windows系列系统的执行文件,还提供了源代码,方便改进、修改以及在其它操作系统上应用;该软件对SVM所涉及的参数调节相对比较少,提供了很多的默认参数,利用这些默认参数可以解决很多问题;并提供了交互检验(Cross Validation)的功能。该软件可以解决C-SVM、ν-SVM、ε-SVR和ν-SVR等问题,包括基于一对一算法的多类模式识别问题。

二、LibSVM下载及安装

  1. 官网下载地址:https://www.csie.ntu.edu.tw/~cjlin/libsvm/
    在这里插入图片描述
  2. 文件解压缩
    在这里插入图片描述
    文件中包含多种语言的代码,根据需要进行调用

三、构建数据集并获得决策函数

实例

from libsvm.python.svmutil import *
    
y, x = [1,-1], [{1:1, 2:1}, {1:-1,2:-1}]       # 输入的数据
options = '-t 0 -c 4 -b 1'                     # 训练参数设置
model = svm_train(y,x,options)                 # 进行训练
 
yt = [1]
xt = [{1:1, 2:1}]
p_label, p_acc, p_val = svm_predict(yt, xt, model)     # 使用得到的模型进行预测
print(p_label)
  • 说明
  x: 输入的样本的属性值,其中每一个样本的格式是一个字典类型,键值对中键是一个索引值,值是对应的数据属性值

  options: 训练的一些参数设置,主要有以下的一些设置

    -s    SVM的类型(svm_type)

                         0 -- C-SVC(默认)          使用惩罚因子(Cost)的处理噪声的多分类器

                         1 -- nu-SVC(多分类器)           按照错误样本比例处理噪声的多分类器

                         2 -- one-class SVM           一类支持向量机,可参见"SVDD"的相关内容

                         3 -- epsilon-SVR(回归)     epsilon支持向量回归 (也就是使用 E-不敏感损失函数进行回归)

                         4 -- nu-SVR(回归)

    -t   核函数类型(kernel_type)

                        0 -- linear(线性核):             u'*v

                        1 -- polynomial(多项式核):                   (gamma*u'*v + coef0)^degree

                        2 -- radial basis function(RBF,径向基核/高斯核):                 exp(-gamma*|u-v|^2)

                        3 -- sigmoid(S型核):                         tanh(gamma*u'*v + coef0)

                        4 -- precomputed kernel(预计算核):               核矩阵存储在training_set_file中

        下面是调整SVM或核函数中参数的选项:

    -d           调整核函数的degree参数,默认为3

    -g           调整核函数的gamma参数,默认为1/num_features

    -r           调整核函数的coef0参数,默认为0

    -c           调整C-SVC, epsilon-SVR 和 nu-SVR中的Cost参数,默认为1(就是优化问题中的那个C)

    -n           调整nu-SVC, one-class SVM 和 nu-SVR中的错误率nu参数,默认为0.5

    -p           调整epsilon-SVR的loss function中的epsilon参数,默认0.1

    -m           调整内缓冲区大小,以MB为单位,默认100

    -e           调整终止判据,默认0.001

    -wi   调整C-SVC中第i个特征的Cost参数

         调整算法功能的选项:

    -b           是否估算正确概率,取值0 - 1,默认为0

    -h           是否使用收缩启发式算法(shrinking heuristics),取值0 - 1,默认为0

    -v           交叉校验

    -q           静默模式
  1. 启动LibSVM
    • 点击Windows文件下,启动svm-toy.exe
      在这里插入图片描述
      在这里插入图片描述
  2. 手工绘制数据集
    • 鼠标左键进行描点 在这里插入图片描述
    • change切换继续绘制点
      在这里插入图片描述
      在这里插入图片描述
    • Save将数据保存为train.txt
      在这里插入图片描述
    • 新建一组数据集作为测试集test.txt 在这里插入图片描述 在这里插入图片描述
  3. IDEA新建Java项目
    • 将Java文件夹下libsvm文件夹拷贝到项目src下
    • 新建Test类,并把指定文件添加到包内
      在这里插入图片描述
    • 新建Test类,并添加代码
package test;

import java.io.IOException;

public class Test {
    public static void main(String args[]) throws IOException {
        //存放数据以及保存模型文件路径
        String filepath = "D:\\python\\libsvm-3.25\\x\\";
        /*
         * -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+"train.txt",filepath+"line.txt"};
        String[] arg1 = {filepath+"test.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);

    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
输出参数说明

  1. optimization finished,#iter = //迭代次数
  2. nu = //核函数的参数
  3. obj = , rho =
    //obj是SVM转换为的二次规划求解得到的最小值对偶题的最优目标值,rho是决策函数//sgn(w^x-rho)中的偏差项(也是b,wx+b)。
  4. nSV = , nBSV = //nSV是支持向量的个数,nBSV是边界上支持向量的个数
  5. Total nSV = //支持向量的总的个数
  6. Accuracy = //精度
  1. 输出文件
  • data.txt训练数据
  • line.txt线性模型
  • poly多项式模型
  • RBF高斯核模型
    在这里插入图片描述
    • 数据说明
  1. svm_type //所选择的svm类型,默认为c_svc
  2. kernel_type //训练采用的核函数类型
  3. gamma //RBF核的参数γ
  4. total_sv //支持向量总个数
  5. rho //判决函数的偏置项b
  6. label //原始文件中的类别标识
  7. nr_sv //每个类的支持向量机的个数
  8. SV //各个类的权系数及相应的支持向量
  9. nr_class //类别数
  • 线性模型
    在这里插入图片描述
  • 多项式模型
    在这里插入图片描述
  • 高斯核模型
    在这里插入图片描述
  1. 决策函数
    在这里插入图片描述

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

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

四、总结

  • libSVM的训练其实就是,搜集样本->标记label->提取特征->写特征文件->调用train.exe->得到model
  • model可以用来判断新的未知label的特征到底应该属于哪一个label

五、参考

基于LibSVM得到决策函数
【机器学习】基于LIBSVM实现支持向量机核函数训练并获取决策函数
LIBSVM ( 二 ) 参数实例详解

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值