6

我想知道 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)
        models{k} = 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);

有没有人帮我解决它?谢谢你

4

2 回答 2

8

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

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

2) 将文件名svmtrain.csvmpredict.cin\libsvm-3.16\matlab\更改为libsvmtrain.cand 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)在一对一 SVM(使用 LibSVM)中接受 10 折交叉验证后的接受答案后,您为每个函数创建四个 .m 文件,, ,crossvalidation.mlibsvmcrossval_ova.m运行该应答器提供的主函数,其中如下:libsvmpredict_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'));
于 2013-03-22T17:54:32.580 回答
3

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

于 2013-05-06T18:27:42.030 回答