1 LibSVM工具包简介
LIBSVM是台湾大学林智仁(Lin Chih-Jen)教授于2001年开发设计,可在 http://www.csie.ntu.edu.tw/~cjlin/libsvm/ 或 https://github.com/cjlin1/libsvm/releases 免费获得。
下载后解压,主要有6个文件夹和一些源码文件:
- Java: 主要是应用于java平台;
- matlab: windows下64位matlab平台;
- python: 是用来参数优选的工具, 稍后介绍;
- svm-toy: 一个可视化的工具, 用来展示训练数据和分类界面, 里面是源码, 其编译后的程序在windows文件夹下;
- tools: 主要包含四个python文件, 用来数据集抽样(subset), 参数优选(grid), 集成测试(easy), 数据检查(checkdata);
- windows: 包含libSVM四个exe程序包, 我们所用的库就是他们.
2 Win下LIBSVM在Matlab2016b中的安装使用
- 将下载的LIBSVM压缩包
libsvm-3.23.zip
(2018年8月时最新版本)解压,把解压出的文件夹libsvm-3.23
复制到Matlab的安装路径下...\MATLAB\R2016b\toolbox
- 把
...\MATLAB\R2016b\toolbox\libsvm-3.23
添加到Matlab的搜索路径(添加并包含子文件夹)
注:
因为使用的是64位的操作系统和matlab,而...\MATLAB\R2016b\toolbox\libsvm-3.23\windows
下包含了matlab可执行的64位二进制文件libsvmread.mexw64/libsvmwrite.mexw64/svmpredict.mexw64/svmtrain.mexw64,故无需自己编译。
假设你使用的是32位操作系统和matlab,则需要自己编译相应的二进制文件:在matlab命令窗口输入mex –setup,这时matlab会提示你选择编译mex文件的c/c++编译器。选择一个你电脑上安装的c/c++编译器,例如Microsoft Visual C++ 2010,将matlab当前目录设置为:‘…\MATLAB\R2016b\toolbox\libsvm-3.23\matlab’,输入命令make,这时你会看到当前目录生成了二进制文件libsvmread.mexw32/libsvmwrite.mexw32/svmpredict.mexw32/svmtrain.mexw32。将当前目录添加到matlab路径中即可。
- 把当前目录设置为
...\MATLAB\R2016b\toolbox\libsvm-3.23
,输入如下测试代码:
[heart_scale_label,heart_scale_inst]=libsvmread('heart_scale');
model = svmtrain(heart_scale_label, heart_scale_inst, '-c 1 -g 0.07');
[predict_label, accuracy, dec_values] =svmpredict(heart_scale_label, heart_scale_inst, model); % test the traindata
得到如下结果,说明安装成功:
*
optimization finished, #iter = 134
nu = 0.433785
obj = -101.855060, rho = 0.426412
nSV = 130, nBSV = 107
Total nSV = 130
Accuracy = 86.6667% (234/270) (classification)
参考:SVM学习笔记(1)LIBSVM在matlab下的使用安装
3 LIBSVM相关函数说明
3.1 libsvmread
主要用于读取数据
这里的数据是非matlab下的.mat数据,比如说是.txt,.data等等,这个时候需要使用libsvmread函数进行转化为matlab可识别数据,比如自带的数据是heart_scale数据,那么导入到matlab有两种方式,
一种使用libsvmread函数,在matlab下直接libsvmread(heart_scale);
第二种方式为点击matlab的‘导入数据’按钮,然后导向heart_scale所在位置,直接选择就可以了。因为有的数据libsvmread读取不管用,但是‘导入数据’后就可以变成matlab下数据。
3.2 libsvmwrite
写函数,就是把已知数据存起来
使用方式为:libsvmwrite(‘filename’,label_vector, instance_matrix);
label_vector是标签,instance_matrix为数据矩阵(注意这个数据