Sto provando libsvm e seguo l'esempio per l'addestramento di un svm sui dati heart_scale forniti con il software. Voglio usare un kernel di chi2 che mi precalcolo. Il tasso di classificazione sui dati di allenamento scende al 24%. Sono sicuro di aver calcolato correttamente il kernel, ma suppongo di dover fare qualcosa di sbagliato. Il codice è sotto Riesci a vedere qualche errore? L'aiuto sarebbe molto apprezzato.cattivo risultato quando si utilizza il kernel chi2 precompilato con 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');
questo è come il kernel è precalcolata:
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));
Con un'implementazione SVM diversa (vlfeat) posso ottenere un tasso di classificazione sui dati di allenamento (sì, ho provato con i dati di allenamento, basta per vedere cosa sta succedendo) circa il 90%. Quindi sono abbastanza sicuro che il risultato di libsvm sia sbagliato.
grazie per la risposta alla mia domanda, ho appena visto la risposta adesso. – Sallos
@Sallos: anche se la tua formula era leggermente fuori, il vero problema è la normalizzazione dei dati. Vedi la mia risposta – Amro