1: 了解libsvm工具包
LIBSVM是台湾大学林智仁(Lin Chih-Jen)教授等2001年开发设计的一个简单, 易于使用和快速有效的SVM模式识别与回归的软件包, 他不但提供了编译好的可在Windows系列系统的执行文件, 还提供了源代码, 方便改进, 修改以及在其它操作系统上应用; 该软件对SVM所涉及的参数调节相对比较少, 提供了很多的默认参数, 利用这些默认参数可以解决很多问题; 并提供了交互检验(Cross Validation)的功能. 该软件包可在http://www.csie.ntu.edu.tw/~cjlin/ 免费获得. 该软件可以解决C-SVM, ν-SVM, ε-SVR和ν-SVR等问题, 包括基于一对一算法的多类模式识别问题.
这套库可以从http://www.csie.ntu.edu.tw/~cjlin/libsvm/index.html免费获得, 目前已经发展到3.12版(2012.4.1更新).下载.tar.gz格式的版本, Windows下也可以直接解压, 主要有6个文件夹和一些源码文件.
Java: 主要是应用于java平台;
matlab: windows下64位matlab平台;
python: 是用来参数优选的工具, 稍后介绍;
svm-toy: 一个可视化的工具, 用来展示训练数据和分类界面, 里面是源码, 其编译后的程序在windows文件夹下;
tools: 主要包含四个python文件, 用来数据集抽样(subset), 参数优选(grid), 集成测试(easy), 数据检查(checkdata);
windows: 包含libSVM四个exe程序包, 我们所用的库就是他们.
其他.h和.cpp文件都是程序的源码, 可以编译出相应的.exe文件. 其中, 最重要的是svm.h和svm.cpp文件, svm-predict.c, svm-scale.c和svm-train.c(还有一个svm-toy.c在svm-toy文件夹中)都是调用的这个文件中的接口函数, 编译后就是windows下相应的四个exe程序. 另外, 里面的README跟FAQ也是很好的文件, 对于初学者如果W文较好的话, 可以看一下.
对于仅仅使用libsvm库的人来说, windows下的4个exe包已经足够了, 如果是为了做深入研究, 可以按照自己的思路文件夹中的.cpp和.c文件, 然后编译验证)
2: 下面开始测试libsvm工具包
1). 把LibSVM包解压到相应的目录(因为我只需要里面windows文件夹中的exe程序包, 我们也可以只把windows文件夹拷到相应的目录), 比如C:jacoxutestlibsvm-3.12
2). 在电脑”开始”的”运行”中输入cmd, 进入DOS环境. 定位到C:jacoxutestlibsvm-3.12下, 具体命令如下:
3). 进行libsvm训练, 输入命令:
svm-train ../heart_scale train.model
train.model: 是创建的结果文件, 保存了训练后的结果:
其中, #iter 为迭代次数;
nu 是选择的核函数类型的参数;
obj 为SVM文件转换为的二次规划求解得到的最小值;
rho 为判决函数的偏置项b;
nSV 为标准支持向量个数(0<a[i]<c);
nBSV 为边界上的支持向量个数(a[i]=c);
Total nSV为支持向量总个数(对于两类来说, 因为只有一个分类模型Total nSV = nSV
但是对于多类, 这个是各个分类模型的nSV之和).
在目录下, 还可以看到产生了一个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 //以下为各个类的权系数及相应的支持向量
- 1 1:0.166667 2:1 3:-0.333333 … 10:-0.903226 11:-1 12:-1 13:1
- 0.5104832128985164 1:0.125 2:1 3:0.333333 … 10:-0.806452 12:-0.333333 13:0.5
- ………
- -1 1:-0.375 2:1 3:-0.333333…. 10:-1 11:-1 12:-1 13:1
- -1 1:0.166667 2:1 3:1 …. 10:-0.870968 12:-1 13:0.5
这里注意, 第二行出现的权系数为小数(0.5104832128985164)是因为这个点属于非边界上的支持向量, 即: (0<a[i]<c).
其他的两个(svm-predict, svm-scale)的使用过程类似.
3: libsvm使用规范
1). libSVM的数据格式
Label 1: value 2:value ….
Label: 是类别的标识, 比如上节train.model中提到的1 -1, 你可以自己随意定, 比如-10, 0, 15. 当然, 如果是回归, 这是目标值, 就要实事求是了.
Value: 就是要训练的数据, 从分类的角度来说就是特征值, 数据之间用空格隔开.
比如: -15 1:0.708 2:1056 3:-0.3333
需要注意的是, 如果特征值为0, 特征冒 前面的(姑且称做序 )可以不连续. 如:
-15 1:0.708 3:-0.3333
表明第2个特征值为0, 从编程的角度来说, 这样做可以减少内存的使用, 并提高做矩阵内积时的运算速度. 我们平时在matlab中产生的数据都是没有序 的常规矩阵, 所以为了方便最好编一个程序进行转化.
2). svmscale的用法
svmscale是用来对原始样本进行缩放的, 范围可以自己定, 一般是[0,1]或[-1,1]. 缩放的目的主要是
1) 防止某个特征过大或过小, 从而在训练中起的作用不平衡;
2) 为了计算速度. 因为在核计算中, 会用到内积运算或exp运算, 不平衡的数据可能造成计算困难.
用法: svmscale [-l lower] [-u upper]
[-y y_lower y_upper]
[-s save_filename]
[-r restore_filename] filename
其中, []中都是可选项:
-l: 设定数据下限; lower: 设定的数据下限值, 缺省为-1
-u: 设定数据上限; upper: 设定的数据上限值, 缺省为1
-y: 是否对目标值同时进行缩放; y_lower为下限值, y_upper为上限值;
-s save_filename: 表示将缩放的规则保存为文件save_filename;
-r restore_filename: 表示将按照已经存在的规则文件restore_filename进行缩放;
filename: 待缩放的数据文件, 文件格式按照libsvm格式.
默认情况下, 只需要输入要缩放的文件名就可以了: 比如(已经存在的文件为test.txt)
svmscale test.txt
这时, test.txt中的数据已经变成[-1,1]之间的数据了. 但是, 这样原来的数据就被覆盖了, 为了让规划好的数据另存为其他的文件, 我们用一dos的重定向符>来另存为(假设为out.txt):
 
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!