ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

LibSVM在Java中的简单应用

2021-11-16 14:04:18  阅读:233  来源: 互联网

标签:file svm Java 默认值 filepath arg1 LibSVM 应用 txt


目录

一、简介

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

标签:file,svm,Java,默认值,filepath,arg1,LibSVM,应用,txt
来源: https://blog.csdn.net/Mouer__/article/details/121343186

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有