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测试,常用的程序为:
- svm-scale 用于对样本数据集中的数据进行缩放,保证数据在某个自定义的范围内
- svm-train 用于训练样本数据集,生成训练后的模型
- 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]。缩放的目的主要是:
- 防止某个特征过大或过小, 从而在训练中起的作用不平衡。
- 为了计算速度, 因为在核计算中,会用到内积运算或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的图像文件提供了直观的说明。