zoukankan      html  css  js  c++  java
  • (转)java +libsvm 安装与测试:

     

     libsvm 用SVM实现简单线性分类

     (转自:http://www.cnblogs.com/freedomshe/archive/2012/10/09/2717356.html)

    0. 下载libsvm压缩包解压到本地目录(from:http://www.csie.ntu.edu.tw/~cjlin/libsvm/index.html) 
    1. 新建JAVA工程,导入libsvm包及其源码
    2. 编写测试代码,使用libsvm函数进行分类预测
    3. 参考贴


    一、新建JAVA工程,导入libsvm包及其源码。

      1. 新建JAVA工程及主函数main后,右键工程=>build path=>configure build path,Java Build Path>Libraries>Add External JARs,导入libsvm.jar。

      2. 关联libsvm源码(方便以后查看源码):点开libsvm.jar=>Source attachment:(None)=>Edit,External location=>External Folder

      选择libsvm-3.12下java目录,一路OK。

    [Go Top]


    二. 编写测试代码,使用libsvm函数进行分类预测

      测试代码如下:

    复制代码
     1 import libsvm.svm;
     2 import libsvm.svm_model;
     3 import libsvm.svm_node;
     4 import libsvm.svm_parameter;
     5 import libsvm.svm_problem;
     6 
     7 public class jmain {
     8 
     9     /**
    10      * @param args
    11      */
    12     public static void main(String[] args) {
    13         //定义训练集点a{10.0, 10.0} 和 点b{-10.0, -10.0},对应lable为{1.0, -1.0}
    14         svm_node pa0 = new svm_node();
    15         pa0.index = 0;
    16         pa0.value = 10.0;
    17         svm_node pa1 = new svm_node();
    18         pa1.index = -1;
    19         pa1.value = 10.0;
    20         svm_node pb0 = new svm_node();
    21         pb0.index = 0;
    22         pb0.value = -10.0;
    23         svm_node pb1 = new svm_node();
    24         pb1.index = 0;
    25         pb1.value = -10.0;
    26         svm_node[] pa = {pa0, pa1}; //点a
    27         svm_node[] pb = {pb0, pb1}; //点b
    28         svm_node[][] datas = {pa, pb}; //训练集的向量表
    29         double[] lables = {1.0, -1.0}; //a,b 对应的lable
    30         
    31         //定义svm_problem对象
    32         svm_problem problem = new svm_problem();
    33         problem.l = 2; //向量个数
    34         problem.x = datas; //训练集向量表
    35         problem.y = lables; //对应的lable数组
    36         
    37         //定义svm_parameter对象
    38         svm_parameter param = new svm_parameter();
    39         param.svm_type = svm_parameter.C_SVC;
    40         param.kernel_type = svm_parameter.LINEAR;
    41         param.cache_size = 100;
    42         param.eps = 0.00001;
    43         param.C = 1;
    44         
    45         //训练SVM分类模型
    46         System.out.println(svm.svm_check_parameter(problem, param)); //如果参数没有问题,则svm.svm_check_parameter()函数返回null,否则返回error描述。
    47         svm_model model = svm.svm_train(problem, param); //svm.svm_train()训练出SVM分类模型
    48         
    49         //定义测试数据点c
    50         svm_node pc0 = new svm_node();
    51         pc0.index = 0;
    52         pc0.value = -0.1;
    53         svm_node pc1 = new svm_node();
    54         pc1.index = -1;
    55         pc1.value = 0.0;
    56         svm_node[] pc = {pc0, pc1};
    57         
    58         //预测测试数据的lable
    59         System.out.println(svm.svm_predict(model, pc));
    60     }
    61 }
    复制代码

      运行结果为:

    复制代码
    null
    *
    optimization finished, #iter = 1
    nu = 0.0033333333333333335
    obj = -0.0033333333333333335, rho = 0.0
    nSV = 2, nBSV = 0
    Total nSV = 2
    -1.0
    复制代码

      第一行null是svm.svm_check_parameter(problem, param)的输出,表示参数设置无误;最后一行的-1.0表示对c点的预测lable是-1.0。

      要注意的几点是:
      1. 主要用了svm.svm_train()做训练,用svm.svm_predict()做预测,其中用到了svm_problem、svm_parameter、svm_model、svm_node几种“结构体”对象。
      2. svm_node表示的是{向量的分量序号,向量的分量值},很多稀疏矩阵均用此方法存储数据,可以节约空间;svm_node[]则表示一个向量,一个向量的最后一个分量的svm_node.index用-1表示;svm_node[][]则表示一组向量,也就是训练集。

    [Go Top]


    参考贴:

      1. 视频: 一个实例搞定libsvm分类《Learn SVM Step by Step》by faruto
      2. 如何使用libsvm进行分类
      3. Felomeng翻译:libsvm2.88之函数库的使用

     
  • 相关阅读:
    【UOJ 53】线段树区间修改
    【洛谷 1057】传球游戏
    【洛谷 2430】严酷的训练
    【UOJ 51】最接近神的人
    【洛谷 1908】逆序对
    【UOJ 50】树状数组2
    Kafka单机安装
    Linux查看磁盘使用情况命令
    CentOS7查看和关闭防火墙
    Kafka学习(三)——Java工具类、Springboot集成批量消费、SparkStreaming集成
  • 原文地址:https://www.cnblogs.com/lifegoesonitself/p/3218017.html
Copyright © 2011-2022 走看看