2013-03-22 15 views
6

Ich möchte wissen, wie libsvm funktioniert. Ich habe diesen Code in diesem Link [1] versucht: 10 fold cross-validation in one-against-all SVM (using LibSVM). Es funktioniert (ich habe nicht Pfad libsvm Bibliothek in Matlab hinzugefügt), aber nachdem ich libsvm Bibliothek hinzufügen. es funktioniert nicht. Ich habe keine Ahnung, wie ich es lösen soll. Es gibt einen Fehler:Probleme nach Addpath Bibliothek libsvm in Matlab

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); 

hilft mir jemand, wie es zu lösen? danke

+4

Namenskonflikt mit der Bioinformatik 'svmtrain' und der libsvm' svmtrain'? [LIBSVM FAQ] (http://www.csie.ntu.edu.tw/~cjlin/libsvm/faq.html#/Q9:_MATLAB_interface) – AGS

+0

Ich ändere dieses eine CXX = g ++ im Makefile mit CXX = g ++ -XY. aber immer noch Fehler – user2157806

+0

Das ist nicht was ich vorschlage. Verwenden Sie den vollständigen Pfadnamen, wenn Sie libsmv 'svmtrain' ausführen. – AGS

Antwort

8

Ich folgte dem Beitrag, auf den Sie verwiesen, und ich habe die Ergebnisse ohne Fehler erhalten. Für mich ist die Genauigkeit der Kreuzvalidierung für den Datensatz "fisheriris" 96,6667%. Für Sie, ich denke der Fehler ist, dass der Fehler von 'svmtrain' ist, wie der erste Kommentar sagte. Im Folgenden werde ich zeigen, wie ich den Code ausgeführt habe.

1) Laden Sie die libsvm von http://www.csie.ntu.edu.tw/~cjlin/libsvm/ herunter und entpacken Sie sie.

2) ändern die Namen der Dateien svmtrain.c und svmpredict.c in \libsvm-3.16\matlab\libsvmtrain.c und libsvmpredict.c zu sein. Und suchen Sie dann make.m im selben Ordner und Änderungslinie 16 und Linie 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) laufen make.m werden Sie gerade geändert mex * .c Dateien.

4) im Anschluss an die akzeptierte Antwort der Post 10 fold cross-validation in one-against-all SVM (using LibSVM), erstellen Sie vier .m-Dateien für jede Funktion, crossvalidation.m, libsvmcrossval_ova.m, libsvmpredict_ova.m, libsvmtrain_ova.m und die Hauptfunktion laufen von diesem Beantworter vorgesehen, die wie folgt lautet:

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

Vielen Dank für Ihre Hilfe, es funktioniert, aber ich muss SDK zuerst installieren. – user2157806

+0

@ user2157806 Sie sind herzlich willkommen! – tqjustc

+0

sowieso .. wissen Sie die Unterschiede zwischen acc = libsvmcrossval_ova (Etiketten, Daten, Optionen, nfold); fprintf ('Kreuzvalidierungsgenauigkeit =% .4f %% \ n', 100 * Mittelwert (acc)); und dieses: acc = libsvmtrain (Etiketten, Daten, sprintf ('% s-v% d-q', opts, nfold)); Warum ist das Ergebnis anders ?? – user2157806

3

Es gibt einen sehr einfachen Weg. Stellen Sie den libsvm-Ordner als Prioritätspfad in der Set Path-Schaltfläche in Ihrem Matlab ein.

+0

das ist eine weitaus bessere Antwort als das erneute kompilieren von libsvm –