LibSVM在MATLAB中使用时的几个问题
最近在科研中需要用到支持向量机(Support Vector Machines, SVM)来进行分类,而目前比较成熟的用于实现SVM的软件包则首推LibSVM。LibSVM目前的版本已经能直接在MATLAB中使用了,虽然MATLAB已经提供了诸如svmtrain等SVM相关的函数,可是相比LibSVM的易用性以及其强大的功能还是要差了不少。不仅如此,目前有关LibSVM的资料在互联网上也比较丰富,所以最终选择LibSVM在MATLAB环境下实现SVM分类样品会是一个很不错的选择。
LibSVM可以直接从其主页上下载到,我们所需要用到的就是MATLAB版本,不过仍然需要对其进行一个编译。这个过程十分简单,不过需要你已经安装了MATLAB的较新的版本(比如2009以后的版本,因为较旧的MATLAB版本不能识别较新的VS,而只能使用VC++ 6.0),以及Microsoft Visual Studio。
1.编译LibSVM的MATLAB版本
如果你的电脑上已经安装了如MATLAB的较新版本,以及Microsoft Visual Studio,那么你可以直接将下载的LibSVM解压出来并拷贝到MATLAB的工作目录下(这个过程不是必须,但会更为方便接下来的处理)。然后在MATLAB中将LibSVM目录添加到MATLAB的识别路径下(Add path),并将LibSVM下的MATLAB文件夹设置为MATLAB的当前工作目录。
接着在MATLAB命令行窗口中输入mex -setup,回车执行命令选择编译器。需要注意的是mex跟-setup之间有个空格。不要选择MATLAB的默认编译器,而手动选择Microsoft的VS编译器(只需告诉MATLAB其安装路径即可)。
设置好编译器,在MATLAB命令行窗口中输入make,即可开始对LibSVM进行编译了。如果没有什么错误提示,最终编译成功之后,在LibSVM文件夹下的MATLAB文件夹里将有四个以.mexw32结尾的编译完成的可执行文件。
2.加载数据集验证程序
编译完毕之后,我们可以加载数据集以验证程序是否编译成功。但是这里就出现了问题,如果使用以前的很多教程和文章中出现的诸如
load heart_scale
来载入heart_scale数据文件,将会出现如下所示的错误:
??? Error using ==> load
Number of columns on line 2 of ASCII file
…\MATLAB\libsvm\heart_scale
must be the same as previous lines.
有人说好像这是因为heart_scale数据集是一个C++类型的文件,所以使用MATLAB的load载入而不能成功。
所以,现在需要使用LibSVM提供的libsvmread函数来读取数据文件,读取格式如下:
[label_vector, instance_matrix] = libsvmread(‘heart_scale’);
问题是,这样仍然不能成功,而提示如下的错误:
can’t open input file heart_scale
但是我们可以解决这个问题,通过这样的方式:
1.将位于LibSVM文件夹下的heart_scale数据文件拷贝到当前工作目录(MATLAB)中;
或
2.将LibSVM文件夹设置为当前工作目录;
如此,再执行libsvmread命令,即可将数据文件读取进来进行一些基本的处理了,使用
model = svmtrain(label_vector,instance_matrix);
训练SVM模型;
使用
[predict_label, accuracy, decision_values] = svmpredict(label_vector,instance_matrix,model);
得到模型的预测结果:
Accuracy = 86.6667% (234/270) (classificatio