LIBSVM学习笔记(一)
参考资料:http://www.matlabsky.com/thread-11925-1-1.html
一、LibSVM
LIBSVM是台湾大学林智仁(Lin Chih-Jen)教授等开发设计的一个简单、易于使用和快速有效的SVM模式识别与回归的软件包,他不但提供了编译好的可在Windows系列系统的执行文件,还提供了源代码,方便改进、修改以及在其它操作系统上应用;该软件对SVM所涉及的参数调节相对比较少,提供了很多的默认参数,利用这些默认参数可以解决很多问题;并提供了交互检验(Cross Validation)的功能。该软件可以解决C-SVM、ν-SVM、ε-SVR和ν-SVR等问题,包括基于一对一算法的多类模式识别问题。
目前,LIBSVM拥有C、Java、Matlab、C#、Ruby、Python、R、Perl、Common LISP、Labview等数十种语言版本。最常使用的是C、Matlab、Java和命令行(c语言编译的工具)的版本。
1、下载
LIBSVM的官网http://www.csie.ntu.edu.tw/~cjlin/libsvm/上下载最新版本的LIBSVM,当前版本为libsvm-3.22.zip(大小为858kB)
下面下载MATLAB版本:
libsvm-3.22.zip解压后的安装包:包含(MATLAB版、java、Python、C版本)
2、安装过程
配置方法:LIBSVM(MATLAB版)的配置说明位于\libsvm-3.22\libsvm-3.22\matlab\目录下的README文档中。
(1)设置路径Set Path(Add with Subfolders)
MATLAB菜单中的“-File—Set Path—Add with Subfolders”然后保存。
-工作搜索目录(路径):是指当使用某一函数的时候,MATLAB可以进行搜索该函数的所有的目录集合。
-当前目录【Current Folder】:是指MATLAB当前所在的路径,MATLAB菜单栏下面有一个Current Folder可以在这里进行当前所在目录的更改。
MATLAB布局的设置:MATLAB菜单“Desktop”-“Desktop Layout”-Default(或者其他选择)。
(2)选择编译器(mex -setup注意:两者之间有一个空格)
操作如下:
(1)在命令窗口输入:mex -setup。出现Done...说明选择编译器成功。
(3)编译文件(make)
make.m中的代码如下:
% This make.m is for MATLAB and OCTAVE under Windows, Mac, and Unix
function make()
try
% This part is for OCTAVE
if (exist ('OCTAVE_VERSION', 'builtin'))
mex libsvmread.c
mex libsvmwrite.c
mex -I.. svmtrain.c ../svm.cpp svm_model_matlab.c
mex -I.. svmpredict.c ../svm.cpp svm_model_matlab.c
% This part is for MATLAB
% Add -largeArrayDims on 64-bit machines of MATLAB
else
mex CFLAGS="\$CFLAGS -std=c99" -largeArrayDims libsvmread.c
mex CFLAGS="\$CFLAGS -std=c99" -largeArrayDims libsvmwrite.c
mex CFLAGS="\$CFLAGS -std=c99" -I.. -largeArrayDims svmtrain.c ../svm.cpp svm_model_matlab.c
mex CFLAGS="\$CFLAGS -std=c99" -I.. -largeArrayDims svmpredict.c ../svm.cpp svm_model_matlab.c
end
catch err
fprintf('Error: %s failed (line %d)\n', err.stack(1).file, err.stack(1).line);
disp(err.message);
fprintf('=> Please check README for detailed instructions.\n');
end
— .mexw32编译后的文件是加密过的,打开是乱码,函数本身没有帮助。
— 运行help svmtrain得到的是MATLAB自带的svmtrain函数的帮助文件。
— 工具箱中的README文件可以算是帮助文件。
小技巧:Shortcuts的使用
3、测试使用
— load heart_scale;
— model=svmtrain(heart_scale_label,heart_scale_inst);
—
[predict_label,accuracy]=svmpredict(heart_scale_label,heart_scale_inst,model);
错误解决:
load heart_scale这一步报错
??? Error using ==>load
Number of columns on line 2 of ASCII file D:\ProgramFiles\MATLAB2010\matlab\toolbox\
libsvm-3.13\heart_scale must be the same as previous lines.
官方现在不给heart_scale.mat,给的都是VC++下的格式。一些旧版本的工具箱还可以找到mat文件,新版本都没有了。所以load会报错:heart_scale must be same as previous lines)。
一种解决方法是:使用给的一个函数,转化数据。此函数为libsvmread()
使用如下: [label_vector, instance_matrix] =libsvmread('filename');
为了跟官方统一名称可以[heart_scale_label,heart_scale_inst] =libsvmread('heart_scale');
注意:由于heart_scale在libsvm-3.11目录下,不是在matlab下,所以直接用libsvmread命令会报错,要买改变当前路径,或者使用
[heart_scale_label,heart_scale_inst]=libsvmread('../heart_scale');../代表返回上层路径。
但是最简单的方法是,找到旧版本工具箱的mat文件添加上即可!
更多测试数据的下载:
(1)Libsvm官方提供的测试数据:(原始数据格式是给libsvm C++版本使用,在MATLAB平台上需要使用libsvmread进行格式转换)
网址:http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/
(2)UCI数据库
网址:http://archive.ics.uci.edu/ml/
转换代码:
[label_vector,instance_matrix]=libsvmread('breast-cancer_scale.txt'); model=svmtrain(label_vector,instance_matrix); [ predicted_label,accuracy, prob_estimates]=svmpredict(label_vector,instance_matrix,model)
使用Import Data数据导入:将UCI下的数据转换成MATLAB平台下可以使用数据格式
进行数据的抽取和保存。
>>wine_label=wine(:,1); >> wine_data=wine(:,2:end); >> save winedata.mat
等到使用时可以直接进行加载:
load winedata.mat modelw = svmtrain(wine_label,wine_data); [plabelw,accuracyw] = svmpredict(wine_label,wine_data,modelw);