我想知道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);
有没有人帮我解决这个问题?谢谢
答案 0 :(得分:8)
我按照你提到的帖子,我得到的结果没有错误。对我来说,'fisheriris'数据集的交叉验证准确率为96.6667%。对你而言,我认为错误是错误来自'svmtrain',就像第一条评论所说的那样。在下文中,我将展示如何运行代码。
1)从http://www.csie.ntu.edu.tw/~cjlin/libsvm/下载libsvm并解压缩。
2)将svmtrain.c
中的文件svmpredict.c
和\libsvm-3.16\matlab\
的名称更改为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
,{{1}并运行该回答者提供的主要功能,如下所示:
libsvmtrain_ova.m
答案 1 :(得分:3)
有一种非常简单的方法。将libsvm文件夹设置为matlab中“设置路径”按钮的优先级路径。