SVM最好的工具是libsvm,由于该工具由C++编写,所以在matlab调用中需进行编译。本人查阅了一下午的博客,并以此来参考进行安装,感觉大多数博客介绍不够系统清楚,最后综合了好几篇才成功安装,记录以供参考。
1、libsvm下载
下载地址 https://www.csie.ntu.edu.tw/~cjlin/libsvm/
很多博客里面说需下载一些测试数据集,这个先不着急,libsvm里面自带了一个。
数据集地址为:
https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/
2、解压并添加路径
- 解压
将libsvm.zip文件夹解压到安装Matlab的toolbox文件夹下,我的路径为:“D:\Matlab 2016a\install\toolbox”;
- matlab中添加路径
主页-设置路径-选择“libsvm”在toolbox中的路径,保存。
【2021年3月18日补充】
除了要添加上述路径外,建议将该路径下的matlab也添加进去,目的是在非toolbox路径下也可以使用。【我已经使用了最新的版本3.2.4】
【主页】——【环境】——【设置路径】——【添加文件夹】——【保存】
3、编译
- mex -setup
如果没有安装C++的开发环境,在matlab的命令行输入上述命令,会出现“错误使用mex的提示,并要求安装MinGW-w64 C/C++编译器”;如果之前已有VS2010或VS2013等,可依据依据选择编译器。
(1)安装MinGW-w64 C/C++编译器
可以用matlab提供的链接打开,但是我这边无法下载MinGW-w64 C/C++;推荐使用下面的方式,但是matlab提供了相应的说明,有一点比较重要,值得注意。
参考博客【http://blog.sina.com.cn/s/blog_167bbdec10102x113.html】 以及在已有MinGW文件的时候如何为Matlab配置【https://ww2.mathworks.cn/matlabcentral/answers/313298-i-already-have-mingw-on-my-computer-how-do-i-configure-it-to-work-with-matlab】
【更新:2021-03-18】
上面的很多链接无法打开了,目前使用的MinGW-w64版本是tdm64-gcc-5.1.0-2,可以从网上下载。双击该exe后,不要选择升级(我从官网找了很多高版本的不知道如何使用),否则会报错,一直不能安装。
默认路径安装,会放在C盘(系统盘)根目录下;
(2)配置环境变量
步骤跟java配置环境变量基本相同。
右击电脑——属性——高级系统设置——高级选项卡——【环境变量】
在系统变量一栏下选择【新建】,变量名为“MW_MINGW64_LOC”,变量值为“C:\ TDM-GCC-64”
(3)matlab中配置为临时变量
在matlab命令窗口中输入以下命令,将MW_MINGW64设置为临时环境变量
setenv('MW_MINGW64_LOC','C:\TDM-GCC-64')
(4)选择编译器
在matlab命令窗口中输入以下命令,
mex -setup
输入
mex -setup C++
- 编译
将matlab中的文件路径调整到“D:\Matlab 2016a\install\toolbox\libsvm-3.23\matlab”
在命令窗口,输入make命令,该文件路径下有个make.m文件。
会出现没有该文件或路径的提示。
根据博客【https://blog.csdn.net/qq_15767429/article/details/79641758】、 【https://blog.csdn.net/chensheng312/article/details/73195158#comments】 【https://blog.csdn.net/qq_41670192/article/details/80241296】 中的修改方法,将make.m文件中的CFLAGS全部替换为COMPFLAGS,修改完后保存。
然后,再在命令窗口输入make,会出现编译成功的提示。
4、toolbox路径下的调用测试
- 修改函数名
svmtrain与matlab中自带的svm工具的函数名相同,为避免后续使用麻烦,建议将后缀名为mexw64的svmtrain文件更改为libsvmtrain.mexw64,为保持统一,我都改为了lib开头的函数。不需要修改.c文件
- 分类测试
将libsvm文件夹下的“heart_scale”文件复制到\libsvm-3.23\matlab\路径下,输入以下命令
[heart_scale_label,heart_scale_inst] =libsvmread('heart_scale');
model = libsvmtrain(heart_scale_label, heart_scale_inst, '-c 1 -g 0.07');
[predict_label, accuracy, dec_values] = libsvmpredict(heart_scale_label, heart_scale_inst, model);
5、任意路径下测试
在某一路径下新建文件夹,将heart_scale放到该目录下,新建test.m文件,并复制上一段代码执行。