Estoy probando libsvm y sigo el ejemplo para entrenar un svm en los datos heart_scale que vienen con el software. Quiero usar un kernel chi2 que me precomputo a mí mismo. La tasa de clasificación en los datos de entrenamiento cae al 24%. Estoy seguro de que calculo el kernel correctamente, pero supongo que debo estar haciendo algo mal. El código está abajo. ¿Puedes ver algún error? La ayuda sería muy apreciada.mal resultado al usar un kernel chi2 precalculado 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');
Así es como se precalculados el núcleo:
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 una aplicación SVM diferente (vlfeat) puedo obtener una tasa de clasificación de los datos de entrenamiento (sí, he probado en los datos de entrenamiento, simplemente para ver qué está pasando) alrededor del 90%. Así que estoy bastante seguro de que el resultado de libsvm es incorrecto.
gracias por responder a mi pregunta, acabo de ver su respuesta ahora. – Sallos
@Sallos: aunque su fórmula estaba un poco apagada, el problema real es la normalización de los datos. Ver mi respuesta – Amro