libsvm支持向量机工具箱在MATLAB中的安装与使用

这几天帮别人做一个关于svm分类的东西,由于是多类多特征的分类,发现徒手写对于我这样的菜鸟来说太难了,网上也没有相关的资料,但是最后发现了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、php等数十种语言版本。最常使用的是C、Matlab、Java和命令行(c语言编译的工具)的版本。

关于这个工具箱的安装方法,我参考了两篇网友的博客,对我帮助很大,我当时出现的情况是第二个网友出现的情况,而常规的是第一个网友的情况(你可以先从第一个网友的看,出现什么情况后再看第二个网友的,前提是matlab没有出报错),我在转的这两篇博客某些地方会有点小更改,不过不会有什么影响:

第一个网友博客:http://blog.csdn.net/loadstar_kun/article/details/7712308

第二个网友博客:http://m.blog.csdn.net/article/details?id=51331299

第一个网友博客:

一.下载libsvm

http://www.csie.ntu.edu.tw/~cjlin/libsvm/

libsvm的网站上下载 libsvm-3.22.zip文件,解压后放在任意目录下,最好放在MATLAB工具箱中,比如 D:\Program Files\MATLAB\R2016a\toolbox\libsvm-3.22下。

二.配置编译器

打开 matlab,将工作目录切换到D:\Program Files\MATLAB\R2016a\toolbox\libsvm-3.22\matlab目录下,在命令行键入以下命令:

mex –setup

出现提示语句

Please choose your compiler for building MEX-files:

Would you like mex to locate installed compilers [y]/n?n %这次是选择编译器,输入n,选择自定义的编译器

出现以下选项(因电脑而异,!!!!!! 注意 !!!!!!如果输入 mex -setup后出现 MEX 配置为使用 ‘Microsoft Visual C++ 2012 (C)’ 以进行 C 语言编译。 警告: MATLAB C 和 Fortran API 已更改,现可支持包含 2^32-1 个以上元素的 MATLAB 变量。不久以后,您需要更新代码以利用新的 API。您可以在以下网址找到相关详细信息:等等的话,那么这个时候你就要参考我转的这两篇博客的第二个网友的博客了)

Select a compiler:

[1] Intel C++ 11.1 (with Microsoft Visual C++ 2008 SP1 linker)

[2] Intel Visual Fortran 11.1 (with Microsoft Visual C++ 2008 SP1 linker)

[3] Intel Visual Fortran 11.1 (with Microsoft Visual C++ 2008 Shell linker)

[4] Lcc-win32 C 2.4.1

[5] Microsoft Visual C++ 6.0

[6] Microsoft Visual C++ 2005 SP1

[7] Microsoft Visual C++ 2008 SP1

[8] Microsoft Visual C++ 2010

[9] Microsoft Visual C++ 2010 Express

[10] Open WATCOM C++

 

[0] None

 

Compiler: 8%可以用其他的,出现以下提示语句

Your machine has a Microsoft Visual C++ 2010 compiler located at

C:\Program Files\Microsoft Visual Studio 10.0. Do you want to use this compiler [y]/n?

 

编译器默认路径,确认正确输入y,更改路径,输入n

输入y出现再次确认

Please verify your choices:

 

Compiler: Microsoft Visual C++ 2010 

Location: C:\Program Files\Microsoft Visual Studio 10.0

 

Are these correct [y]/n? y

 

编译器配置完成

Trying to update options file: C:\Documents and Settings\zhangduokun\Application Data\MathWorks\MATLAB\R2011a\mexopts.bat

From template:              C:\PROGRA~1\MATLAB\R2011a\bin\win32\mexopts\msvc100opts.bat

 

Done …

 

三.编译

 

输入命令

>> make

>> 

%编译完成

 

系统就会生成svmtrain.mexw32svmpredict.mexw32libsvmread.mexw32libsvmwrite.mexw32等文件(对于 Matlab 7.1以下上版本,生成的对应文件为svmtrain.dllsvmpredict.dll read_sparse.dll,没做测试),然后可以在matlab的菜单 File->Set Path->add with subfolders(可直接用Add Folder)里,把 C:\Program Files\MATLAB\R2011a\toolbox\libsvm-3.12\matlab目录添加进去,这样以后在任何目录下都可以调用 libsvm的函数了。

 

四.测试

为了检验 libsvm matlab之间的接口是否已经配置完成,可以在 matlab下执行以下命令:

 

>>load heart_scale

 

完成该步骤后发现Workspace中出现了heart_scale_inst heart_scale_label,说明正确

 

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

Accuracy = 86.6667% (234/270) (classification)%  done

如果运行正常并生成了model这个结构体(其中保存了所有的支持向量及其系数),那么说明 libsvmmatlab 之间的接口已经完全配置成功。

 

注意:

1. matlab自带了C编译器Lcc-win32C,但是libsvm原始版本是C++实现的,因此需要C++的编译器来编译,这就是不适用matlab默认编译器而选择其他C++编译器的原因。

matlab支持的编译器也是有限的,可以查看不同版本matlab支持的编译器列表

 

2. 如果matlab版本太低,如matlab 7.0是不能用VS作为编译器的,只能用VC++ 6.0

 

3. .mexw32 文件是经过加密的,打开是乱码,函数本身没有帮助。

例如输入 help svmpredict会出现报错: svmpredict not found

工具箱libsvm-3.12\matlabREADME文件才是帮助文件。

但是输入help svmtrain会出现帮助信息,其实出现的是系统自带的svmtrain函数,没有libsvm工具箱中的好用。

 

4.在新版本libsvm3.12中,文件夹libsvm-3.12\windows中已经有编译好的程序,可以直接使用,只需要把libsvm-3.12\windows添加到matlab路径中即可,不需要编译的过程。当然最好还是自己编译一遍,因为编译环境不同会导致一些不可预估的小问题,自己编译的过程是可控的。

 

5. 测试用数据集,libsvm官网上提供了很多数据集

测试使用的heart_scale数据集是C++版本的(类标签 1:第一个属性 2:第二个属性),可以用libsvmread来转换为matlab版本的(它们的区别在类标签)。

[label_vector, instance_matrix] = libsvmread(‘C++版本数据集’); %得到类标签和属性矩阵,然后可以使用它们训练了model = svmtrain(label_vector, instance_matrix);

 

 

>> load heart_scale

>> model = svmtrain(heart_scale_label,heart_scale_inst); 

*

optimization finished, #iter = 162

nu = 0.431029

obj = -100.877288, rho = 0.424462

nSV = 132, nBSV = 107

Total nSV = 132

>> [predict_label,accuracy] = svmpredict(heart_scale_label,heart_scale_inst,model);

Accuracy = 86.6667% (234/270) (classification)

 

6.参考资料

libsvm库下载:http://www.csie.ntu.edu.tw/~cjlin/libsvm/

视频:http://v.youku.com/v_showMini/id_XMjc2NTY3MzYw_ft_131.html(有小问题,等下会提到)

详解:http://www.matlabsky.com/thread-11925-1-1.html

第二个网友博客:

大家在看着教程出现问题后,如果本文没有提到,先搜索错误,如果没有明确给出答案,多尝试不同的版本也许就可以用了,我的就是一样的教程换了4个工具箱后才可以使用(版本问题)。

     首先是下载好安装压缩包,我这里下载的是libsvm-3.1.zip,下载好,解压,然后将其放到MATLAB安装文件夹toolbox文件夹下,这里说明一点:并不是必须要到这个文件夹下,只是为了规范,这样应用的时候,工具箱就全在toolbox工具箱文件夹里了。便于管理和操作。

以我的电脑为例,我的MATLAB安装在D盘Program Files文件夹中,那么我需要将解压好的libsvm-3.1文件夹放在D:\Program Files\MATLAB\R2012b\toolbox文件夹下

然后我们需要将这个路径设定进来。

点击 file- set path

会弹出下面这个界面,这里要注意了,很多教程中都是说点击add folders-,但是很多情况下,都会发生错误,这是因为如果你的工具箱文件夹中含有子文件夹,那么久无法添加到路径当中来,那么应用的时候肯定会发生错误。

正确添加方法(如下图):单击-add with subfolders,找到刚才的libsvm-3.1文件夹,确定,然后最后保存就可以了。

说明:

并不是到这一步,就代表工具箱导入成功了,要具体看工具箱的说明,例如对这一个工具箱libsvm,工具箱还不可以用,还需要进行编译、make等操作。

一、具体步骤(c++6.0)


切换matlab运行目录致:D:\Program Files\MATLAB\R2014b\toolbox\libsvm-3.1\matlab\


在MATLAB主窗口中依次输入

mex -setup 回车,这里注意-前面是有空格的

y  回车

然后在出现的选项中选择含有C++6.0的那个选项的序号,例如我的是2,那么输入 2 回车,如果是vs2012参考下面的mex-setup

y 回车

make 回车

等待自动执行完毕,导入全部完成,可以使用了。

二、具体步骤(vs2012)


切换matlab运行目录致:D:\Program Files\MATLAB\R2014b\toolbox\libsvm-3.1\matlab\

在MATLAB主窗口中依次输入

>> mex -setup
MEX 配置为使用 ‘Microsoft Visual C++ 2012 (C)’ 以进行 C 语言编译。
警告: MATLAB C 和 Fortran API 已更改,现可支持包含 2^32-1 个以上元素的 MATLAB 变量。不久以后,您需要更新代码以利用新的 API。您可以在以下网址找到相关详细信息:
 要选择不同的语言,请从以下选项中选择一种命令:
mex -setup C++ 
mex -setup FORTRAN
后来按照libsvm提供的最原始办法:make 解决了
具体步骤如下:
1、下载libsvm,我下载的是libsvm-3.1版本
2、解压后放到matlab的安装目录下,我个人喜欢直接放到matlab下面的toolbox里面,毕竟这也是其中的工具之一。
3、在matlab主界面找到“设置路径”,添加文件夹及其子文件,索性把整个libsvm-3.1全添加进去,反正可能都要用到。
4、切换matlab运行目录致:D:\Program Files\MATLAB\R2014b\toolbox\libsvm-3.1\matlab,在命令行输入make,也就是该目录下的那个make文件。这时候就像以前安装libsvm一样,会自动make出来很多文件,不用管,主要是会看到make出带有mexm64后缀名的文件,这就成功了。
5、拷贝4步骤中matlab文件夹下所有make出来的文件,到libsvm-3.1\windows文件夹下,替换替换替换……,统统替换。
6、over,出一口气,放松一下,距离成功只差后面的第七步
7、验证是否成功:使用数据libsvm试验数据下载
可以将下载后的heart_scale.mat数据复制到刚才的目录下(其实无所谓)。然后输入libsvm工具箱特有的语句,就可以验证成功与否了:
>> load heart_scale.mat
>> 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);

输出:
*
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)

得到了分类精度,这就证明libsvm安装成功!

参考文章:http://blog.csdn.net/loadstar_kun/article/details/7712308


最后:
至于具体怎么使用libsvm工具箱分类,特别是多类,可以参考《MATLAB神经网络43个案例分析》这本书中的14章,里面有关于多类葡萄酒分类和预测,并且每一类葡萄酒都有13类特征。

这几天帮别人做一个关于svm分类的东西,由于是多类多特征的分类,发现徒手写对于我这样的菜鸟来说太难了,网上也没有相关的资料,但是最后发现了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、php等数十种语言版本。最常使用的是C、Matlab、Java和命令行(c语言编译的工具)的版本。

关于这个工具箱的安装方法,我参考了两篇网友的博客,对我帮助很大,我当时出现的情况是第二个网友出现的情况,而常规的是第一个网友的情况(你可以先从第一个网友的看,出现什么情况后再看第二个网友的,前提是matlab没有出报错),我在转的这两篇博客某些地方会有点小更改,不过不会有什么影响:

第一个网友博客:http://blog.csdn.net/loadstar_kun/article/details/7712308

第二个网友博客:http://m.blog.csdn.net/article/details?id=51331299

第一个网友博客:

一.下载libsvm

http://www.csie.ntu.edu.tw/~cjlin/libsvm/

libsvm的网站上下载 libsvm-3.22.zip文件,解压后放在任意目录下,最好放在MATLAB工具箱中,比如 D:\Program Files\MATLAB\R2016a\toolbox\libsvm-3.22下。

二.配置编译器

打开 matlab,将工作目录切换到D:\Program Files\MATLAB\R2016a\toolbox\libsvm-3.22\matlab目录下,在命令行键入以下命令:

mex –setup

出现提示语句

Please choose your compiler for building MEX-files:

Would you like mex to locate installed compilers [y]/n?n %这次是选择编译器,输入n,选择自定义的编译器

出现以下选项(因电脑而异,!!!!!! 注意 !!!!!!如果输入 mex -setup后出现 MEX 配置为使用 ‘Microsoft Visual C++ 2012 (C)’ 以进行 C 语言编译。 警告: MATLAB C 和 Fortran API 已更改,现可支持包含 2^32-1 个以上元素的 MATLAB 变量。不久以后,您需要更新代码以利用新的 API。您可以在以下网址找到相关详细信息:等等的话,那么这个时候你就要参考我转的这两篇博客的第二个网友的博客了)

Select a compiler:

[1] Intel C++ 11.1 (with Microsoft Visual C++ 2008 SP1 linker)

[2] Intel Visual Fortran 11.1 (with Microsoft Visual C++ 2008 SP1 linker)

[3] Intel Visual Fortran 11.1 (with Microsoft Visual C++ 2008 Shell linker)

[4] Lcc-win32 C 2.4.1

[5] Microsoft Visual C++ 6.0

[6] Microsoft Visual C++ 2005 SP1

[7] Microsoft Visual C++ 2008 SP1

[8] Microsoft Visual C++ 2010

[9] Microsoft Visual C++ 2010 Express

[10] Open WATCOM C++

 

[0] None

 

Compiler: 8%可以用其他的,出现以下提示语句

Your machine has a Microsoft Visual C++ 2010 compiler located at

C:\Program Files\Microsoft Visual Studio 10.0. Do you want to use this compiler [y]/n?

 

编译器默认路径,确认正确输入y,更改路径,输入n

输入y出现再次确认

Please verify your choices:

 

Compiler: Microsoft Visual C++ 2010 

Location: C:\Program Files\Microsoft Visual Studio 10.0

 

Are these correct [y]/n? y

 

编译器配置完成

Trying to update options file: C:\Documents and Settings\zhangduokun\Application Data\MathWorks\MATLAB\R2011a\mexopts.bat

From template:              C:\PROGRA~1\MATLAB\R2011a\bin\win32\mexopts\msvc100opts.bat

 

Done …

 

三.编译

 

输入命令

>> make

>> 

%编译完成

 

系统就会生成svmtrain.mexw32svmpredict.mexw32libsvmread.mexw32libsvmwrite.mexw32等文件(对于 Matlab 7.1以下上版本,生成的对应文件为svmtrain.dllsvmpredict.dll read_sparse.dll,没做测试),然后可以在matlab的菜单 File->Set Path->add with subfolders(可直接用Add Folder)里,把 C:\Program Files\MATLAB\R2011a\toolbox\libsvm-3.12\matlab目录添加进去,这样以后在任何目录下都可以调用 libsvm的函数了。

 

四.测试

为了检验 libsvm matlab之间的接口是否已经配置完成,可以在 matlab下执行以下命令:

 

>>load heart_scale

 

完成该步骤后发现Workspace中出现了heart_scale_inst heart_scale_label,说明正确

 

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

Accuracy = 86.6667% (234/270) (classification)%  done

如果运行正常并生成了model这个结构体(其中保存了所有的支持向量及其系数),那么说明 libsvmmatlab 之间的接口已经完全配置成功。

 

注意:

1. matlab自带了C编译器Lcc-win32C,但是libsvm原始版本是C++实现的,因此需要C++的编译器来编译,这就是不适用matlab默认编译器而选择其他C++编译器的原因。

matlab支持的编译器也是有限的,可以查看不同版本matlab支持的编译器列表

 

2. 如果matlab版本太低,如matlab 7.0是不能用VS作为编译器的,只能用VC++ 6.0

 

3. .mexw32 文件是经过加密的,打开是乱码,函数本身没有帮助。

例如输入 help svmpredict会出现报错: svmpredict not found

工具箱libsvm-3.12\matlabREADME文件才是帮助文件。

但是输入help svmtrain会出现帮助信息,其实出现的是系统自带的svmtrain函数,没有libsvm工具箱中的好用。

 

4.在新版本libsvm3.12中,文件夹libsvm-3.12\windows中已经有编译好的程序,可以直接使用,只需要把libsvm-3.12\windows添加到matlab路径中即可,不需要编译的过程。当然最好还是自己编译一遍,因为编译环境不同会导致一些不可预估的小问题,自己编译的过程是可控的。

 

5. 测试用数据集,libsvm官网上提供了很多数据集

测试使用的heart_scale数据集是C++版本的(类标签 1:第一个属性 2:第二个属性),可以用libsvmread来转换为matlab版本的(它们的区别在类标签)。

[label_vector, instance_matrix] = libsvmread(‘C++版本数据集’); %得到类标签和属性矩阵,然后可以使用它们训练了model = svmtrain(label_vector, instance_matrix);

 

 

>> load heart_scale

>> model = svmtrain(heart_scale_label,heart_scale_inst); 

*

optimization finished, #iter = 162

nu = 0.431029

obj = -100.877288, rho = 0.424462

nSV = 132, nBSV = 107

Total nSV = 132

>> [predict_label,accuracy] = svmpredict(heart_scale_label,heart_scale_inst,model);

Accuracy = 86.6667% (234/270) (classification)

 

6.参考资料

libsvm库下载:http://www.csie.ntu.edu.tw/~cjlin/libsvm/

视频:http://v.youku.com/v_showMini/id_XMjc2NTY3MzYw_ft_131.html(有小问题,等下会提到)

详解:http://www.matlabsky.com/thread-11925-1-1.html

猜你喜欢

转载自blog.csdn.net/dmfylb/article/details/72896295