在 matlab 中添加路径 libsvm 库后的问题

Posted

技术标签:

【中文标题】在 matlab 中添加路径 libsvm 库后的问题【英文标题】:problems after addpath libsvm library in matlab 【发布时间】:2013-03-12 05:33:55 【问题描述】:

我想知道 libsvm 是如何工作的。我在此链接 [1] 中尝试了此代码:10 fold cross-validation in one-against-all SVM (using LibSVM)。它正在工作(我没有在matlab中添加路径libsvm库)但是在我添加libsvm库之后。它不工作。我不知道如何解决它。有一个错误:

Error using svmtrain (line 233)
Y must be a vector or a character array.

Error in libsvmtrain_ova (line 11)
        modelsk = svmtrain(double(y==labels(k)), X, strcat(opts,' -b 1 -q'));

Error in libsvmcrossval_ova (line 10)
        mdl = libsvmtrain_ova(y(trainIdx), X(trainIdx,:), opts);

Error in main (line 9)
acc = libsvmcrossval_ova(labels, data, opts, nfold);

有人帮我解决吗?谢谢

【问题讨论】:

与生物信息学 svmtrain 和 libsvm svmtrain 的命名冲突? LIBSVM FAQ 我在 Makefile 中用 CXX = g++-X.Y 改变了这个 CXX = g++ 。但仍然错误 这不是我的建议。运行 libsmv svmtrain 时尝试使用完整路径名。 【参考方案1】:

我关注了你提到的帖子,我得到了没有错误的结果。对我来说,“fisheriris”数据集的交叉验证准确率为 96.6667%。对你来说,我认为错误是正如第一条评论所说的那样,错误来自“svmtrain”。下面,我将展示我是如何运行代码的。

1) 从http://www.csie.ntu.edu.tw/~cjlin/libsvm/ 下载 libsvm 并解压。

2) 将\libsvm-3.16\matlab\ 中的文件svmtrain.csvmpredict.c 的名称更改为libsvmtrain.clibsvmpredict.c。然后在同一文件夹中找到make.m,将第16行和第17行更改为

mex CFLAGS="\$CFLAGS -std=c99" -largeArrayDims libsvmtrain.c ../svm.cpp svm_model_matlab.c
mex CFLAGS="\$CFLAGS -std=c99" -largeArrayDims libsvmpredict.c ../svm.cpp svm_model_matlab.c

3) 运行 make.m 您刚刚更改为 mex *.c 文件。

4) 在帖子 10 fold cross-validation in one-against-all SVM (using LibSVM) 的接受答案之后,您为每个函数创建四个 .m 文件,crossvalidation.mlibsvmcrossval_ova.mlibsvmpredict_ova.mlibsvmtrain_ova.m 并运行该回答者提供的主函数,如下:

clear;clc;
%# laod dataset
S = load('fisheriris');
data = zscore(S.meas);
labels = grp2idx(S.species);

%# cross-validate using one-vs-all approach
opts = '-s 0 -t 2 -c 1 -g 0.25';    %# libsvm training options
nfold = 10;
acc = libsvmcrossval_ova(labels, data, opts, nfold);
fprintf('Cross Validation Accuracy = %.4f%%\n', 100*mean(acc));

%# compute final model over the entire dataset
mdl = libsvmtrain_ova(labels, data, opts);



acc = libsvmtrain(labels, data, sprintf('%s -v %d -q',opts,nfold));
model = libsvmtrain(labels, data, strcat(opts,' -q'));

【讨论】:

非常感谢您的帮助,它正在工作,但我必须先安装 sdk。 无论如何......你知道 acc = libsvmcrossval_ova(labels, data, opts, nfold); 之间的区别吗? fprintf('交叉验证准确率 = %.4f%%\n', 100*mean(acc));还有这个:acc = libsvmtrain(labels, data, sprintf('%s -v %d -q',opts,nfold));为什么结果不一样?? @user2157806 为了解决多类分类问题,有很多方法,例如一对多和一对一。在 libsvmcrossval_ova 中,它使用 one-vs-all。在 libsvmcrossval_ova 中,它使用 libsvmtrain,其中 libsvmtrain 用作二进制分类。但是在 acc = libsvmtrain(labels, data, sprintf('%s -v %d -q',opts,nfold)) 中,libsvmtrain 被用作多类分类器。他们使用不同的方法来解决多类问题,因此结果是不同的。你可以查看这个帖子:***.com/questions/9041753/… one-vs-all 意味着您选择一个类作为正类,其他类作为负类,这样您就可以将多类问题转换为二元分类。因此,请检查什么是“一对一”以及什么是“一对一”。阅读本文:hal.archives-ouvertes.fr/docs/00/10/39/55/PDF/… 另外,请确保您使用 google 了解“one-vs-one”、“one-vs-all”、“cross validation”。 @user2157806 libsvm 可以执行多类分类。它使用一对一的方法。请参阅 libsvm here 的常见问题解答部分并搜索以下问题:libsvm 对多类 SVM 使用什么方法?为什么不使用“1-against-the rest”的方法?【参考方案2】:

有一个非常简单的方法。在 matlab 的 Set Path Button 中将 libsvm 文件夹设置为优先路径。

【讨论】:

这是一个比重新编译 libsvm 更好的答案

以上是关于在 matlab 中添加路径 libsvm 库后的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在matlab里安装libsvm包

将置换后的数据放入 LibSVM 预计算内核

在类路径中添加库后找不到 Jetty WebSocket 类

关于libsvm工具箱在64位matlab下的安装说明

[MATLAB][原创]Matlab添加libsvm后报错svmtrain已被删除, 请改用fitcsvm解决办法

[MATLAB][原创]Matlab添加libsvm后报错svmtrain已被删除, 请改用fitcsvm解决办法