向量机libsvm库使用

1. 关于libsvm库

LIBSVM是台湾大学林智仁(Lin Chih-Jen)教授等开发的易于使用和快速有效的SVM模式识别与回归的软件包,主要使用C++开发因此算法的效率也比较高。由于libSVM程序小,运用灵活,输入参数少,并且是开源的,易于扩展,因此成为目前国内应用最多的SVM的库。libsvm想相关论文:libsvm

源码可以从 林智仁个人网站 免费下载,zip格式直接下载 或者 github下载 当前最新版本Version 3.21 released on December 14, 2015.

2. libsvm程序组成

├── COPYRIGHT    版权声明
├── FAQ.html        FAQ文件
├── Makefile         Unix或者Linux环境下的Make文件
├── Makefile.win Windows上的Make文件
├── README
├── heart_scale     heart_scale为样本文件,可以用记事本打开查看
├── java                 java接口相关文件
│   ├── Makefile
│   ├── libsvm
│   │   ├── svm.java
│   │   ├── svm.m4
│   │   ├── svm_model.java
│   │   ├── svm_node.java
│   │   ├── svm_parameter.java
│   │   ├── svm_print_interface.java
│   │   └── svm_problem.java
│   ├── libsvm.jar
│   ├── svm_predict.java
│   ├── svm_scale.java
│   ├── svm_toy.java
│   ├── svm_train.java
│   └── test_applet.html
├── matlab          matlab接口相关文件
│   ├── Makefile
│   ├── README
│   ├── libsvmread.c
│   ├── libsvmwrite.c
│   ├── make.m
│   ├── svm_model_matlab.c
│   ├── svm_model_matlab.h
│   ├── svmpredict.c
│   └── svmtrain.c
├── python        python接口相关文件
│   ├── Makefile
│   ├── README
│   ├── svm.py
│   └── svmutil.py
├── svm-predict.c    svm预测文件代码  *
├── svm-scale.c       svm参数缩放源代码文件  *
├── svm-toy            一个可视化的工具,用来展示训练数据和分类界面
│   ├── gtk
│   │   ├── Makefile
│   │   ├── callbacks.cpp
│   │   ├── callbacks.h
│   │   ├── interface.c
│   │   ├── interface.h
│   │   ├── main.c
│   │   └── svm-toy.glade
│   ├── qt
│   │   ├── Makefile
│   │   └── svm-toy.cpp
│   └── windows
│          └── svm-toy.cpp
|
├── svm-train.c    svm训练数据源程序 *
├── svm.cpp         svm实现的cpp源代码 *
├── svm.def          svm的导出符号定义,主要用于windows下
├── svm.h             svm实现的h头代码  *
├── tools              使用python开发的辅助工具
│   ├── README
│   ├── checkdata.py     用于数据检查
│   ├── easy.py               集成测试
│   ├── grid.py                参数优化
│   └── subset.py         数据集抽样
└── windows      windows下生成的相关文件
├── libsvm.dll
├── libsvmread.mexw64
├── libsvmwrite.mexw64
├── svm-predict.exe
├── svm-scale.exe
├── svm-toy.exe
├── svm-train.exe
├── svmpredict.mexw64
└── svmtrain.mexw64

     10 directories, 63 files

在Windows平台上,libsvm已经提供了相关的exe文件,在根目录的windows目录下。
在Unix类似的平台,则需要调用make命令生成相关的程序。

综述: 对于libsvm测试,常用的程序为:

  1. svm-scale  用于对样本数据集中的数据进行缩放,保证数据在某个自定义的范围内
  2. svm-train  用于训练样本数据集,生成训练后的模型
  3. svm-predict 对需要预测的数据进行预测或者检验样本集的准确率

3. libsvm数据格式

类别      序号:值       序号:值    数据使用空格分割
label    1: value     2:value ….
-15       1:0.708      2:1056      3:-0.3333   # 样例

备注: 如果特征值为0, 特征冒号前面的序号可以不连续. 如:
-15  1:0.708   3:-0.3333
表明第2个特征值为0, 减少内存的使用, 并提高做矩阵内积时的运算速度.

4. 数据预处理

svm-scale是用来对原始样本进行缩放的, 范围可以自定义, 一般是[0,1]或[-1,1]。缩放的目的主要是:

  1. 防止某个特征过大或过小, 从而在训练中起的作用不平衡。
  2. 为了计算速度, 因为在核计算中,会用到内积运算或exp运算,不平衡数据可能造成计算困难。

Usage: svm-scale [options] data_filename
options:
-l lower : x scaling lower limit (default -1)
-u upper : x scaling upper limit (default +1)
-y y_lower y_upper : y scaling limits (default: no y scaling)
-s save_filename : save scaling parameters to save_filename
-r restore_filename : restore scaling parameters from restore_filename

4. 训练数据

Usage: svm-train [options] training_set_file [model_file]
options:
-s svm_type : set type of SVM (default 0)
0 -- C-SVC (multi-class classification)
1 -- nu-SVC (multi-class classification)
2 -- one-class SVM
3 -- epsilon-SVR (regression)
4 -- nu-SVR (regression)
-t kernel_type : set type of kernel function (default 2)
0 -- linear: u'*v
1 -- polynomial: (gamma*u'*v + coef0)^degree
2 -- radial basis function: exp(-gamma*|u-v|^2)
3 -- sigmoid: tanh(gamma*u'*v + coef0)
4 -- precomputed kernel (kernel values in training_set_file)
-d degree : set degree in kernel function (default 3)
-g gamma : set gamma in kernel function (default 1/num_features)
-r coef0 : set coef0 in kernel function (default 0)
-c cost : set the parameter C of C-SVC, epsilon-SVR, and nu-SVR (default 1)
-n nu : set the parameter nu of nu-SVC, one-class SVM, and nu-SVR (default 0.5)
-p epsilon : set the epsilon in loss function of epsilon-SVR (default 0.1)
-m cachesize : set cache memory size in MB (default 100)
-e epsilon : set tolerance of termination criterion (default 0.001)
-h shrinking : whether to use the shrinking heuristics, 0 or 1 (default 1)
-b probability_estimates : whether to train a SVC or SVR model for probability estimates, 0 or 1 (default 0)
-wi weight : set the parameter C of class i to weight*C, for C-SVC (default 1)
-v n: n-fold cross validation mode
-q : quiet mode (no outputs)

不要被过多的命令所吓倒,一般情况下我们使用的为默认的参数。

./svm-train heart_scale train.model    # 对heart_scale样本进行训练,生成svm向量模型
*
optimization finished, #iter = 162
nu = 0.431029
obj = -100.877288, rho = 0.424462
nSV = 132, nBSV = 107
Total nSV = 132

$more train.model
svm_type c_svc          # 所选择的svm类型, 默认为c_svc
kernel_type rbf         # 训练采用的核函数类型, 此处为RBF核 
gamma 0.0769231  # RBF核的参数γ
nr_class 2                 # 类别数, 此处为两分类问题
total_sv 132             # 支持向量总个数
rho 0.424462          # 判决函数的偏置项b
label 1 -1                 # 原始文件中的类别标识
nr_sv 64 68             # 每个类的支持向量机的个数
SV                            # 以下为各个类的权系数及相应的支持向量
------数据区省略-------

5. 使用数据进行预测

Usage: svm-predict [options] test_file model_file output_file
options:
-b probability_estimates: whether to predict probability estimates, 0 or 1 (default 0); for one-class SVM only 0 is supported
-q : quiet mode (no outputs)

test_file: 是要进行预测的数据文件, 格式也要符合libsvm格式, 即使不知道label的值, 也要任意填一个, svmpredict会在output_file中给出正确的label结果, 如果知道label的值, 就会输出正确率

使用样本文件heart_scale来验证svm向量机模型的准确率
$./svm-predict heart_scale train.model res.txt
Accuracy = 86.6667% (234/270) (classification)

6. 如何使用libsvm进行手写体识别

相关资料可以查看: libsvm Minist Hog 手写体识别

7. 使用easy.py进行最优模型训练

easy.py工具可以自动分析样本数据,然后提供出合理的参数,主要是为对于svm向量机原理不熟悉的人使用。需要系统安装了python和gnuplot。

$./easy.py ../heart_scale
Scaling training data...
Cross validation...
Best c=512.0, g=0.001953125 CV rate=84.8148
Training...
Output model: heart_scale.model

# 备注:该目录下会生成heart_scale.scale.png的图像文件提供了直观的说明。

heart_scale.scale

发表评论

电子邮件地址不会被公开。 必填项已用*标注