Próbuję libsvm i podążam za przykładem szkolenia svm na danych heart_scale, które są dostarczane wraz z oprogramowaniem. Chcę używać jądra chi2, które sam sobie komponuję. Klasyfikacja na danych treningowych spada do 24%. Jestem pewien, że poprawnie obliczyć jądro, ale chyba muszę zrobić coś złego. Kod znajduje się poniżej. Czy widzisz jakieś błędy? Pomoc byłaby bardzo ceniona.Zły wynik przy użyciu prekomputowanego jądra chi2 z libsvm (matlab)
%read in the data:
[heart_scale_label, heart_scale_inst] = libsvmread('heart_scale');
train_data = heart_scale_inst(1:150,:);
train_label = heart_scale_label(1:150,:);
%read somewhere that the kernel should not be sparse
ttrain = full(train_data)';
ttest = full(test_data)';
precKernel = chi2_custom(ttrain', ttrain');
model_precomputed = svmtrain2(train_label, [(1:150)', precKernel], '-t 4');
ten sposób jądro precomputed:
function res=chi2_custom(x,y)
a=size(x);
b=size(y);
res = zeros(a(1,1), b(1,1));
for i=1:a(1,1)
for j=1:b(1,1)
resHelper = chi2_ireneHelper(x(i,:), y(j,:));
res(i,j) = resHelper;
end
end
function resHelper = chi2_ireneHelper(x,y)
a=(x-y).^2;
b=(x+y);
resHelper = sum(a./(b + eps));
Z innej implementacji SVM (vlfeat) ja uzyskania stawki zaszeregowania w danych treningowych (tak, przetestowany na danych treningowych, po prostu aby zobaczyć, co się dzieje) około 90%. Więc jestem całkiem pewny, że wynik libsvm jest błędny.
dzięki za odpowiedź na moje pytanie, właśnie teraz widział swoją odpowiedź. – Sallos
@Sallos: chociaż twoja formuła była nieco wyłączona, prawdziwym problemem jest normalizacja danych .. Zobacz moją odpowiedź – Amro