安装libsvm遇到的问题

来源:互联网 发布:软件管理器官方下载 编辑:程序博客网 时间:2024/05/18 06:50

        最近要做纹理方面的分类,打算学习svm,捣鼓了一下午,总算把libsvm安上,遇到一些问题也挺困扰的,想记录下来与网友分享一下。
我刚开始下载最新的libsvm3.20版本点击打开链接,但是按照网上安装教程到了第五步出现问题:一个是make运行出现错误;另一个是load heart_scale出现错误。
第一个问题出错的原因有以下几种:
1)是否选择current directory为libsvm下matlab文件夹,如果不是matlab在搜索路径的时候搜索不到svm.cpp
2)修改libsvm\matlab 文件夹内的 make.m文件:
faruto版本下此文件的源代码为
% This make.m is used under Windows
% add -largeArrayDims on 64-bit machines
mex -O -largeArrayDims -I..\ -c ..\svm.cpp
mex -O -largeArrayDims -I..\ -c svm_model_matlab.c
mex -O -largeArrayDims -I..\ svmtrain.c svm.obj svm_model_matlab.obj
mex -O -largeArrayDims -I..\ svmpredict.c svm.obj svm_model_matlab.obj
mex -O -largeArrayDims libsvmread.c
mex -O -largeArrayDims libsvmwrite.c
第一行说明64位机器才能使用参数 -largeArrayDims ,要是32位机,选择将此参数删除后,保存。所以一定要注意自己电脑是32位的还是64位的。
3)对于Matlab 7.1及以上版本,生成的对应文件为svmtrain.mexw32或者64,svmpredict.mexw32或者64和libsvnread.mexw32或64 libsvmwrite.mexw32或者64) %运行make之前,这些文件在安装包是没有的,运行之后不同位数的电脑会生成相应的的文件。
对于第二个问题嘛,首先要明确新旧版本的区别,旧版本有load heart_scale.mat,新版本load heart_scale,这也是matlab不识别新版本的原因,很明显.mat能够被matlab调用的,解决办法:将旧版本中的load heart_scale.mat代替新版本的load heart_scale,我用的是libsvm2.91,可以在这里下载点击打开链接。
下面是具体的操作步骤:
step1: 输入>>mex -setup %注意mex后要留个空格
step2: Please choose your compiler for building external interface (MEX) files:
Would you like mex to locate installed compilers [y]/n? 是否让matlab自动检测编译器 可以选n
step3: [Select a compiler:
[1] Intel C++ 11.1 (with Microsoft Visual C++ 2008 SP1 linker)
[2] Intel Visual Fortran 11.1 (with Microsoft Visual C++ 2008 SP1 linker)
[3] Intel Visual Fortran 11.1 (with Microsoft Visual C++ 2008 Shell linker)
[4] Intel Visual Fortran 10.1 (with Microsoft Visual C++ 2005 SP1 linker)
[5] Microsoft Visual C++ 2005 SP1
[6] Microsoft Visual C++ 2008 Express
[7] Microsoft Visual C++ 2008 SP1
[8] Microsoft Visual C++ 2010
[9] Microsoft Visual C++ 2010 Express
matlab 自带的不能用 其他的如果有的话 就相应的选择就行 ,我选择了 【8】
step4: Your machine has a Microsoft Visual C++ 2010 compiler located at
d:\Program Files. Do you want to use this compiler [y]/n? 选择y
Please verify your choices: Compiler: Microsoft Visual C++ 2010
Location: d:\Program Files
Are these correct [y]/n? y 路径是否正确 是的就选y
%如果没有自动检测出来依次的话step2就选【n】就可以,再顺着提示下来。
Step5: Make
   我当时一回车就出现:C:\MATLAB\BIN\MEX.PL: Error: '..\svm.cpp' not found.
??? Error using ==> mex at 208 Unable to complete successfully.
Error in ==> make at 5 mex -O -I..\ -c ..\svm.cpp
当时虽将libsvm工具箱添加路径了,但没将选择libsvm下matlab文件夹为current directory,改过来运行就好了。make运行成功后,你会发现会生成对应文件为svmtrain.mexw32或者64,svmpredict.mexw32或者64和libsvnread.mexw32或64 libsvmwrite.mexw32或者64。
make运行成功后接下来就要验证是否安装正确了
load heart_scale.mat %此处无分号,注意新旧版本的区别,若安装的最新版本可以将旧版本的复制后来替换,就ok了。
train = heart_scale_inst;
train_label=heart_scale_label;
test=train;
test_label=train_label;
model=svmtrain(train_label,train,'-c 2 -g 0.01');
[predict_label,accuracy]=svmpredict(test_label,test,model);
  一回车会出现结果说明就大功告成了,希望能对后来人有所帮助。


对于matlab2014a新版本,可以忽略前4步,可直接进行make即可,主要编辑成自己系统的版本,之后对于安装成功与否的验证:

[heart_scale_label, heart_scale_inst] = libsvmread('heart_scale');
model = svmtrain(heart_scale_label, heart_scale_inst, '-c 1 -g 0.07');
[predict_label, accuracy, dec_values] =svmpredict(heart_scale_label, heart_scale_inst, model);

直接运行出结果(必须在根目录下运行,因为heart_scale不在当前目录)

optimization finished, #iter = 199
nu = 0.391993
obj = -183.591153, rho = 0.454610
nSV = 123, nBSV = 93
Total nSV = 123
Accuracy = 87.4074% (236/270) (classification)

当然也可像前面说的那样验证

load heart_scale.mat 
train = heart_scale_inst;
train_label=heart_scale_label;
test=train;
test_label=train_label;
model=svmtrain(train_label,train,'-c 2 -g 0.01');
[predict_label,accuracy]=svmpredict(test_label,test,model);

但最后一句需改为[predict_label, accuracy, dec_values] =svmpredict(heart_scale_label, heart_scale_inst, model);

要不然没有准确率结果,我想可能是MATLAB版本的问题吧


参考文献:【1】http://blog.csdn.net/kobesdu/article/details/8936499

                    【2】http://www.ilovematlab.cn/thread-200501-1-1.html

                    【3】http://tieba.baidu.com/p/2331027240


下载链接:【1】http://www.csie.ntu.edu.tw/~cjlin/libsvm/

                    【2】http://www.csie.ntu.edu.tw/~cjlin/libsvm/matlab/oldfiles/


0 0