Matlab配置libsvm

来源:互联网 发布:matlab for mac多少钱 编辑:程序博客网 时间:2024/05/29 02:10

引言:

最近在做的内容需要调用libsvm,小白入门,初次使用,遇到一点问题,这里做简要地记录。

libsvm参考资料:

libsvm下载网址:http://www.csie.ntu.edu.tw/~cjlin/libsvm/
视频教程:
http://v.youku.com/v_showMini/id_XMjc2NTY3MzYw_ft_131.html
https://www.youtube.com/watch?v=Wz_4h_bH7-c
https://www.youtube.com/watch?v=4GB5HVw0CuM

环境说明

我的系统环境为 Win8 64bit + Matlab R2014b,下载的是最新版的libsvm-3.20

具体流程

  • 下载
    从libsvm的主页下载合适的软件安装包,并解压,比如我解压到Matlab的Toolbox目录下,具体路径如下:G:\Software Installing\Matlab\R2014b\toolbox
  • 设置Path
    在Matlab中依次选择设置路径-添加并包含子文件夹..,加入以上解压后存放的路径。
  • 编译
    事实上,对于64位的系统,我们是不需要进行编译的,自带的软件包中已经包含了对应于64位系统的编译好的文件:libsvmread.mexw64、libsvmwrite.mexw64、svmtrain.mexw64、svmpredict.mexw64,以上文件位于压缩包'..\windows'文件夹中。对于非64位系统,或者需要自己编译的特殊情况,采用如下de步骤编译自己的二进制文件。
    • 在matlab中切换到解压后的libsvm-3.20\matlab目录(如我的系统为:G:\Software Installing\Matlab\R2014b\toolbox\libsvm-3.20\matlab
    • 在命令窗口输入mex -setup ,此时会提示你选择编译器,就选择一个已安装的编译器,如Microsoft Visual C++ 2013。之后Matlab会提示确认选择的编译器,输入y进行确认。
    • 在命令窗口输入make,等待make完成,生成相应的后缀为mexw64(64位系统)或mexw32(32位系统)的文件。
    • 这里要说明,其实前一步的mex -setup并不是必须的,在make指令不奏效的时候调用一下即可;另外,在我的配置过程中,会提示有问题,大致如下所示, 其实并不需要在意,直接调用make 也会成功编译文件。

MEX 配置为使用 ‘Microsoft Visual C++ 2013 Professional (C)’ 以进行 C 语言编译。
警告…您需要更新代码以利用新的 API。您可以在以下网址找到相关详细信息…

  • 重命名
    这并不是必须的操作,但鉴于个人的经验,建议执行。
    编译完成后,在当前目录下回出现svmtrain.mexw64、svmpredict.mexw64(64位系统)或者svmtrain.mexw32、svmpredict.mexw32(32位系统)这两个文件,把文件名svmtrain和svmpredict相应改成libsvmtrain和libsvmpredict。
    这是因为Matlab中自带有SVM的工具箱,而且其函数名字就是svmtrain和svmpredict,和libsvm默认的名字一样,在实际使用的时候有时会产生一定的问题,比如想调用libsvm的变成了调用Matlab SVM。
    如果有进行重命名的,以后使用libsvm时一律使用libsvmtrain和libsvmpredict这两个名字进行调用。

特别补充:

以上是普通的libsvm在matlab 2014b 的设置,起初对于我而言,也是并不需要编译的,直接设置路径就可以使用libsvm,但是由于我需要使用对样本加权的训练方法,于是经过搜索,发现他们也是提供libsvm-weights-3.20版本的,参见这里,其中提供了Matlab和python的接口,而并不存在已经编译好的文件,所以我需要进行编译并使用这一带权重的版本。

测试

以下测试是基于我配置的加权的libsvm的版本。
libsvm软件包下的heart_scaleheart_scale.wgt文件分别提供了样本的label及feature信息和权重信息。要注意对于以上两个文件,其读取指令是不同的,以下将简单演示:在matlab命令窗口执行如下命令:

[heart_scale_label, heart_scale_inst] = libsvmread('heart_scale');heart_scale_weight = load('heart_scale.wgt');model = libsvmtrain(heart_scale_weight, heart_scale_label, heart_scale_inst, '-c 1');[predict_label, accuracy, dec_values] = libsvmpredict(heart_scale_label, heart_scale_inst, model);

结果如下:

*optimization finished, #iter = 166obj = -107.553365, rho = 0.449867nSV = 131, nBSV = 103Total nSV = 131Accuracy = 86.2963% (233/270) (classification)

特别的,对于不需要对样本考虑权重的情况,只需要修改训练的指令为:

model = libsvmtrain([], heart_scale_label, heart_scale_inst, '-c 1');

ok,以上就是对于Matlab 2014b使用libsvm(libsvm-weights)的简要记录。

0 0