Matlab 下 libsvm 的编译与坑
LIBSVM 是台湾大学林智仁(Lin Chih-Jen)教授等开发设计的一个简单、易于使用和快速有效的SVM模式识别与回归的软件包。
不少做机器学习的小伙伴需要把它编译并用在 Matlab 的环境,尤其是在 Windows 系统下,特别多麻烦。
下面我归纳出来的安装方法,适用于 Windows + GCC。
安装 TDM-GCC
LIBSVM 毕竟是一个 C语言 写的库,因此需要使用编译器编译出接口让 Matlab 调用。
Matlab 的 mex 支持多种编译器。在 Windows 上支持 Visual Studio,但是我已经安装了最新的 Visual Studio,不想再去折腾旧版的VS。因此我选择使用 GCC 的方案。
在 Windows 下可以使用的 GCC 编译链 有 MinGW64、CygWin、TDM-GCC。
很可惜的是,老是折腾不上 MinGW64,最终就选择了 Matlab 推荐的 TDM-GCC。
如果你是正版的 Matlab (好比说我),直接可以去 Mathworks 官网下载,一键安装:
https://www.mathworks.com/matlabcentral/fileexchange/52848-matlab-support-for-mingw-w64-c-c-compiler
如果你是盗版的 Matlab,就需要手动来安装啦。 直接去 TDM-GCC 的官网下载: http://tdm-gcc.tdragon.net/download。
最新版也是可以用于 Matlab 的。下载好了,直接按流程安装就OK了。
此处有个需要注意的地方,如果你需要使用
OpenMP做并行计算,请记得在安装功能的时候勾上!!!
安装完了还没结束,请到系统的环境变量那里,变量名设置 MW_MINGW64_LOC,变量值为你的 TDM-GCC 的安装目录,好比说:C:/TDM-GCC-64。设置完了重开一次 Matlab 就可以使用 mex 编译啦。
测试 mex
在 Matlab 的命令行窗口(Command Window)处输入:mex -setup
看到输出 MEX configured to use 'MinGW64 Compiler (C) 差不多的话,就说明安装成功啦。
编译 LIBSVM
到 LIBSVM 的 Github 页面,在 Release 处下载最新版的源代码压缩包。
下载完成后,建议把压缩包解压到 Matlab 的安装目录下的 toolbox 目录。
然后使用 主页 - 设置路径 里面的 添加文件夹,把刚刚我们解压到 toolbox 的 LIBSVM 文件夹下的 matlab 文件夹加入。
最后加入的搜索路径大概长这个样子:
1 | C:\Matlab\toolbox\libsvm\matlab |
完成这个事情之后,就可以切换 Matlab 的工作目录到上面的目录了。只需要一个命令就可以完成编译:
1 | make |
make其实运行的是make.m那个编译脚本
如果你是 Windows 系统,这样是肯定编译不了的,会出现下面的错误。
1 | 使用 'MinGW64 Compiler (C)' 编译。 |
怎么解决呢?网上写的解决方法都是不好的,那个改 COMPFLAGS 的 Issue 并不是最好的,因为丢了 CFLAGS。
下面是我总结出来的独家的解决方法:
其实问题在于 Windows 下的 $ 是没有语义的,因此不需要 \$ 做转义。因此!只需要把 make.m 下面的 \$CFLAGS 全部替换为 $CFLAGS,也就是删掉 \ 就可以在保留 CFLAGS 的基础上编译通过了。
下面是可以直接编译成功的 make.m:
1 | % This make.m is for MATLAB and OCTAVE under Windows, Mac, and Unix |
改完之后再运行一次 make 就可以啦。
测试 LIBSVM
将 LIBSVM 文件夹下的测试数据集 heart_scale libsvm\matlab 下。
切换工作目录到 libsvm\matlab 目录,在命令窗口(Command Window)运行以下命令。
1 | [heart_scale_label,heart_scale_inst] = libsvmread('heart_scale'); |
看到输出 Accuracy = 86.6667% 类似的文字就说明你的 LIBSVM 成功编译并可以使用啦!
除非注明,麦麦小家文章均为原创,转载请以链接形式标明本文地址。