1.参考网站:
libsvm库下载:http://www.csie.ntu.edu.tw/~cjlin/libsvm/
视频:http://v.youku.com/v_showMini/id_XMjc2NTY3MzYw_ft_131.html
2.操作流程:
请注意:详细操作流程请参考上面的“详解”网站,这里只说大框架和详解里没有提到的问题。
A.设置path
File->set path ->add with subfolders->加入libsvm-3.11文件夹的路径
B. 在matlab中编译
目的:将libsvm-3.11\matlab 中 libsvmwrite.c 等 C++文件编译成 libsvmread.mexw32 等matlab文件,这样就可以在command window中被直接调用了。
注意:在最外面的Readme中有提到已经有编译好的文件,比如在libsvm-3.11\windows中也会看到libsvmread.mexw32,但这里不要被误导!还是需要你自己再编译一遍的!
如果是最新版MATLAB,mex过程有点不一样,具体如下:
我们要选择的是C++编译器:>>mex –setup MEX 配置为使用 'Microsoft Windows SDK 7.1 (C)' 以进行 C 语言编译。 Warning: The MATLAB C and Fortran API has changed to support MATLAB variables with more than 2^32-1 elements. In the near future you will be required to update your code to utilize the new API. You can find more information about this at: http://www.mathworks.com/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html. 要选择不同的语言,请从以下选项中选择一种命令: mex -setup C++ mex -setup FORTRAN
这样就可以执行make过程了:>> mex -setup C++ MEX 配置为使用 'Microsoft Windows SDK 7.1 (C++)' 以进行 C++ 语言编译。 Warning: The MATLAB C and Fortran API has changed to support MATLAB variables with more than 2^32-1 elements. In the near future you will be required to update your code to utilize the new API. You can find more information about this at: http://www.mathworks.com/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html.
>> make 使用 'Microsoft Windows SDK 7.1 (C)' 编译。 MEX 已成功完成。 使用 'Microsoft Windows SDK 7.1 (C)' 编译。 MEX 已成功完成。 使用 'Microsoft Windows SDK 7.1 (C++)' 编译。 找不到 D:\MATLAB\R2014A\toolbox\libsvm-3.21\matlab\svmtrain.exp 找不到 D:\MATLAB\R2014A\toolbox\libsvm-3.21\matlab\svmtrain.exp MEX 已成功完成。 使用 'Microsoft Windows SDK 7.1 (C++)' 编译。 找不到 D:\MATLAB\R2014A\toolbox\libsvm-3.21\matlab\svmpredict.exp 找不到 D:\MATLAB\R2014A\toolbox\libsvm-3.21\matlab\svmpredict.exp MEX 已成功完成。 >>
C.加载数据集
就是这里搞了我一下午!
加载数据集
load heart_scale ;
有两个数据集,一个是C++的, 一个是matlab的。libsvm库中下载的是C++数据,
所以matlab加载我们下载的heart_scale是会报错的:
法1、下载matlab数据集(http://download.csdn.net/detail/abcjennifer/4215779)
法2、用libsvmread而非load.
这样就可以加载数据集了,完成该步骤后发现Workspace中出现了heart_scale_inst 和 heart_scale_label,说明正确。ok,下一步我们来测试svm的训练和predict
D.train & predict
>> [heart_scale_label, heart_scale_inst] = libsvmread('heart_scale'); >> model = libsvmtrain(heart_scale_label, heart_scale_inst, '-c 1 -g 0.07'); * optimization finished, #iter = 134 nu = 0.433785 obj = -101.855060, rho = 0.426412 nSV = 130, nBSV = 107 Total nSV = 130 >> [predict_label, accuracy, dec_values] = libsvmpredict(heart_scale_label, heart_scale_inst, model); Accuracy = 86.6667% (234/270) (classification)
3.总结
本文借鉴了浙大天才美女http://blog.csdn.net/abcjennifer/article/details/7370177得很多内容,主要在补充了新版MATLAB下的一些编译细节。此外,对于编译后报的“没找到”不用管,不影响。如果测试后没有Accuracy输出或输出为空,应该采用三个参量的返回值。具体如下:
再次表示感谢!>> [predict_label, accuracy, dec_values] = libsvmpredict(heart_scale_label, heart_scale_inst, model); Accuracy = 86.6667% (234/270) (classification)