2013-03-22 63 views
6

我想知道libsvm是如何工作的。我在這個鏈接[1]中試過這段代碼:10 fold cross-validation in one-against-all SVM (using LibSVM)。它的工作(我沒有在matlab中添加路徑libsvm庫),但我添加libsvm庫後。它不工作。我不知道如何解決它。有一個錯誤:在matlab中添加路徑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

命名與生物信息學'svmtrain'和libsvm'svmtrain'衝突嗎? [LIBSVM常見問題](http://www.csie.ntu.edu.tw/~cjlin/libsvm/faq.html#/Q9:_MATLAB_interface) – AGS 2013-03-22 11:31:22

+0

我在Makefile中將此CXX = g ++ 更改爲 CXX = g ++ -XY。但仍然錯誤 – user2157806 2013-03-22 11:39:29

+0

這不是我所建議的。在運行libsmv'svmtrain'時,嘗試使用完整路徑名稱。 – AGS 2013-03-22 11:45:25

回答

8

我跟着你提到的帖子,我得到的結果沒有錯誤。對我而言,'fisheriris'數據集的交叉驗證準確率爲96.6667%。對你而言,我認爲錯誤在於錯誤來自'svmtrain',就像第一條評論所說的那樣。在下面,我將展示我如何運行代碼。

1)從http://www.csie.ntu.edu.tw/~cjlin/libsvm/下載libsvm並解壓縮。

2)更改文件svmtrain.csvmpredict.c的名字在\libsvm-3.16\matlab\libsvmtrain.clibsvmpredict.c。然後在同一個文件夾,並改變線16和第17行找到make.m是你只是改變MEX * .c文件

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。

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')); 
+0

非常感謝你的幫助,它的工作,但我必須先安裝SDK。 – user2157806 2013-03-22 19:22:48

+0

@ user2157806歡迎您! – tqjustc 2013-03-22 19:23:32

+0

無論如何..你知道acc = libsvmcrossval_ova(標籤,數據,opts,nfold)之間的不同。 fprintf('交叉驗證準確度=%.4f %% \ n',100 *平均值(acc)); 和這一個:acc = libsvmtrain(標籤,數據,sprintf('%s -v%d -q',opts,nfold)); 爲什麼結果不一樣? – user2157806 2013-03-22 19:26:53

3

有一個非常簡單的方法。將libsvm文件夾設置爲matlab中Set Path Button的優先級路徑。

+0

這比重新編譯libsvm要好得多 – 2015-10-12 21:11:18