плохой результат при использовании предварительно вычисленного ядра chi2 с libsvm (matlab)

Я пробую libsvm и следую примеру для обучения svm на данных heart_scale, которые поставляются с программным обеспечением. Я хочу использовать ядро ​​chi2, которое я предварительно вычисляю сам. Уровень классификации обучающих данных снижается до 24%. Я уверен, что правильно вычисляю ядро, но, наверное, что-то делаю не так. Код ниже. Вы видите ошибки? Помощь будет принята с благодарностью.

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

Вот как предварительно вычисляется ядро:

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

С другой реализацией svm (vlfeat) я получаю классификацию данных обучения (да, я тестировал данные обучения, просто чтобы увидеть что происходит) около 90%. Так что я почти уверен, что результат libsvm неверен.

6
задан Amro 23 October 2011 в 01:12
поделиться