LibSVM在Java中的简单应用

2021/11/16 14:10:02

本文主要是介绍LibSVM在Java中的简单应用,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

目录

  • 一、简介
  • 二、准备工作
    • 1.LibSVM获取
    • 2.文件目录
    • 3. 导入项目
    • 4. 数据准备
  • 三、训练及预测
    • 1. 训练
    • 2. 预测
  • 四、参考

一、简介

JAVA-ML中封装了java开源支持向量机的库。LibSVM是台湾林智仁(Chih-Jen Lin)教授2001年开发的一套支持向量机的库,这套库运算速度还是挺快的,可以很方便的对数据做分类或回归。由于LibSVM程序小,运用灵活,输入参数少,并且是开源的,易于扩展,因此成为目前国内应用最多的SVM的库。

经过Java-ML项目使得LibSVM更易使用,避免了一些不必要参数的输入。

二、准备工作

1.LibSVM获取

https://www.csie.ntu.edu.tw/~cjlin/

2.文件目录


我这采用java进行,所以需要用到的是java,目录如下
在这里插入图片描述

3. 导入项目

将java目录导入项目
在这里插入图片描述

4. 数据准备

  1. 打开libsvm文件下的windows文件里面的svm-toy.exe程序运行

在这里插入图片描述

  1. 进行手工绘制数据并保存数据
    在这里插入图片描述

  2. 我的文件名为mode.txt

在这里插入图片描述

三、训练及预测

1. 训练

  1. 代码
 String filepath = "I:\\IOT\\project\\SVM\\src\\file\\";//自己选择路径

        //train
        String[] arg = {"-s","0","-c","10","-t","0",filepath+"model.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);


说明:

svm-train
用法: svmtrain [options] training_set_file [model_file]
options为操作参数
-s 设置svm类型:默认值为0
0 – C-SVC
1 – v-SVC
2 – one-class-SVM
3 –ε-SVR
4 – n - SVR
-t 设置核函数类型,默认值为2
0 --线性核:u’v
1 --多项式核:(g
u’v+coef0)degree
2 – RBF核:exp(-γ
||u-v||2)
3 – sigmoid核:tanh(γ*u’*v+coef0)
-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:可选项,为要保存的结果文件,称为模型文件,以便在预测时使用。
为了能保存结果,还是要提供一个结果文件名如line.txt,poly.txt,RBF.txt

  1. 结果
    在这里插入图片描述

说明:

#iter为迭代次数,
nu 与前面的操作参数-n nu 相同,
obj为SVM文件转换为的二次规划求解得到的最小值,
rho 为判决函数的常数项b,
nSV 为支持向量个数,
nBSV为边界上的支持向量个数,
Total nSV为支持向量总个数。

  1. 生成的模型

结果文件中数据以RBF核为例

在这里插入图片描述

说明:

svm_type c_svc % 训练所采用的svm类型,此处为C- SVC
kernel_type rbf %训练采用的核函数类型,此处为RBF核
gamma 0.0769231 %设置核函数中的g ,默认值为1/ k
nr_class 2 %分类时的类别数,此处为两分类问题
total_sv 132 %总共的支持向量个数
rho 0.424462 %决策函数中的常数项b
label 1 -1%类别标签
nr_sv 64 68 %各类别标签对应的支持向量个数
SV %以下为支持向量

2. 预测

  1. 准备测试集
    在这里插入图片描述

上面的数据是和训练数据属于同一类型的,即已经知道类别,通过将其作为模拟的待预测数据来验证分类模型的准确度。
2. 代码

String filepath = "I:\\IOT\\project\\SVM\\src\\file\\";//自己选择路径
//predict
        String[] arg1={filepath+"test.txt",filepath+"line.txt",filepath+"line_res.txt"};
        System.out.println("----------------线性-----------------");
        //预测函数
        svm_predict.main(arg1);

        arg1[1]=filepath+"poly.txt"; //输入文件模型路径
        arg1[2]=filepath+"poly-res.txt";//输出文件结果路径
        System.out.println("---------------多项式-----------------");
        svm_predict.main(arg1);

        arg1[1]=filepath+"RBF.txt";
        arg1[2]=filepath+"RBF_res.txt";
        System.out.println("---------------高斯核-----------------");
        svm_predict.main(arg1);

说明:

svm-predict的用法
svm-predict是根据训练获得的模型,对数据集合进行预测。
用法:svmpredict [options] test_file model_file output_file
其中,options为操作参数,可用的选项即表示的涵义如下所示:
-b probability_estimates——是否需要进行概率估计预测,可选值为0或者1,默认值为0。
model_file ——是由svmtrain产生的模型文件;
test_file——是要进行预测的数据文件,格式也要符合libsvm格式,即使不知道label的值,也要任意填一个,svmpredict会在output_file中给出正确的label结果,如果知道label的值,就会输出正确率;
output_file ——是svmpredict的输出文件,表示预测的结果值。

  1. 结果
    在这里插入图片描述

结果文件以line_res.txt为例
在这里插入图片描述

四、参考

https://blog.csdn.net/chl033/article/details/4645544
https://blog.csdn.net/taohuaxinmu123/article/details/20370525



这篇关于LibSVM在Java中的简单应用的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程