2013-03-22 5 views
6

Chcę wiedzieć, jak działa biblioteka libsvm. Próbowałem tego kodu w tym linku [1]: 10 fold cross-validation in one-against-all SVM (using LibSVM). Działa (nie dodałem ścieżki biblioteki libsvm w programie matlab), ale po dodaniu biblioteki libsvm. to nie działa. Nie mam pojęcia, jak go rozwiązać. wystąpił błąd:problemy po bibliotece addpath biblioteki libsvm w 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); 

Czy ktoś mi pomoże rozwiązać? dziękuję

+4

Konflikt nazw z bioinformatycznym 'svmtrain' i libsvm' svmtrain'? [LIBSVM FAQ] (http://www.csie.ntu.edu.tw/~cjlin/libsvm/faq.html#/Q9:_MATLAB_interface) – AGS

+0

Zmieniam ten CXX = g ++ w Makefile z CXX = g ++ -XY. ale nadal błąd – user2157806

+0

To nie jest to, co sugeruję. Spróbuj użyć pełnej nazwy ścieżki, gdy uruchomisz libsmv 'svmtrain'. – AGS

Odpowiedz

8

Poszedłem za postem, do którego się odwołałeś i otrzymałem wyniki bez błędów. Dla mnie dokładność sprawdzania poprawności dla zbioru danych "fisheriris" wynosi 96,6667%. Dla ciebie, myślę, że błąd polega na tym, że błąd pochodzi z "svmtrain", tak jak powiedział pierwszy komentarz. Poniżej pokażę, w jaki sposób uruchomiłem kod.

1) pobierz plik libsvm z http://www.csie.ntu.edu.tw/~cjlin/libsvm/ i rozpakuj go.

2) zmiany nazwy plików svmtrain.c i svmpredict.c w \libsvm-3.16\matlab\ być libsvmtrain.c i libsvmpredict.c. A następnie zlokalizuj make.m w tym samym folderze i zmiany linii 16 oraz linii 17 będzie

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 prowadzony po prostu zmieniły się mex pliki * .c.

4) zgodnie z przyjętą odpowiedzi słupka 10 fold cross-validation in one-against-all SVM (using LibSVM) można utworzyć cztery .M plików dla każdej funkcji, crossvalidation.m, libsvmcrossval_ova.m, libsvmpredict_ova.m, libsvmtrain_ova.m i uruchomić główną funkcję przewidzianą przez ten odpowiadającego, który przedstawia się następująco:

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

dziękuję bardzo za pomoc, działa, ale muszę najpierw zainstalować sdk. – user2157806

+0

@ user2157806 zapraszamy! – tqjustc

+0

mimo to ... czy znasz różnicę między acc = libsvmcrossval_ova (etykiety, dane, opts, nfold); fprintf ("Dokładność sprawdzania poprawności =% .4f %% \ n", 100 * średnie (wg)); i ten: acc = libsvmtrain (etykiety, dane, sprintf ('% s -v% d -q', opts, nfold)); dlaczego wynik jest inny? – user2157806

3

Istnieje bardzo prosty sposób. Ustaw folder libsvm jako ścieżkę priorytetową w przycisku Ustaw ścieżkę w Matlabie.

+0

jest to o wiele lepsza odpowiedź niż rekompilacja biblioteki libsvm –

Powiązane problemy