LIBSVM学习笔记(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liyuqian199695/article/details/55807092

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版、javaPythonC版本)


2、安装过程

配置方法:LIBSVMMATLAB版)的配置说明位于\libsvm-3.22\libsvm-3.22\matlab\目录下的README文档中。

(1)设置路径Set Path(Add with Subfolders)

  • 这一步就是将libsvm工具箱所在的文件夹添加到MATLAB工作搜索目录(路径)

MATLAB菜单中的-FileSet PathAdd with Subfolders然后保存

  • 这一步是使用libsvm工具箱的前提,否则使用时会报错:-???Undefined function or variable‘XXX’
  • 关于MATLAB工作搜索目录(路径)和当前目录(路径)两个概念意思如下:

-工作搜索目录(路径):是指当使用某一函数的时候,MATLAB可以进行搜索该函数的所有的目录集合。

-当前目录【Current Folder】:是指MATLAB当前所在的路径,MATLAB菜单栏下面有一个Current Folder可以在这里进行当前所在目录的更改。


MATLAB布局的设置:MATLAB菜单“Desktop-Desktop Layout-Default(或者其他选择)。

(2)选择编译器(mex -setup注意:两者之间有一个空格

  • Libsvm的原始版本是用C++写的,为了能在MATLAB平台下使用,需要用C++编译器编译一下,生成一个类似于.m文件的东西(.mexw32文件)这样就可以在MATLAB平台下使用libsvm了。
  • 如果编译器没有选择好的话,下一步进行make编译的时候就会出现如下报错:-Unable to complete successfully.这个表示你没有选择好编译器。
  •  本机电脑上需要安装C++编译器(比如Microsoft Visual C++6.0编译器或更高版本)。

操作如下:

1)在命令窗口输入:mex  -setup。出现Done...说明选择编译器成功。


(3)编译文件make

  • 首先需要把MATLAB的当前目录Current Folder调整到libsvm工具箱所在的文件夹下。即D:\software\SVM\libsvm-3.22\libsvm-3.22\matlab
  • 然后在命令窗输入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

  • 编译后文件夹里面会多出svmtrain.mexw32svmpredict.mexw32libsvmread.mexw32libsvmwrite.mexw32等文件,这样就可以在MATLAB平台下使用libsvm工具箱了。

		.mexw32编译后的文件是加密过的,打开是乱码,函数本身没有帮助。
		— 运行help svmtrain得到的是MATLAB自带的svmtrain函数的帮助文件。
		— 工具箱中的README文件可以算是帮助文件。


小技巧:Shortcuts的使用


3、测试使用

  • 使用libsvm自带的测试数据heart_scale.mat
  • 数据内容
    •  heart_scale_inst <270*13 double>
    • heart_scale_label <270*1 double>

		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_scalelibsvm-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);

阅读更多
换一批

没有更多推荐了,返回首页