在 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.c
和svmpredict.c
的名称更改为libsvmtrain.c
和libsvmpredict.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.m
、libsvmcrossval_ova.m
、libsvmpredict_ova.m
、libsvmtrain_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 库后的问题的主要内容,如果未能解决你的问题,请参考以下文章
在类路径中添加库后找不到 Jetty WebSocket 类