eclipse + libsvm-3.12 用SVM实现简单线性分类

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之函数库的使用

[Go Top]

posted @ 2012-10-09 21:52 FreedomShe 阅读(...) 评论(...) 编辑 收藏