我正在尝试libsvm,并按照该示例来训练软件附带的heart_scale数据上的svm。我想使用我预先计算好的chi2内核。训练数据的分类率降至24%。我确定我正确地计算了内核,但我想我必须做错了什么。代码如下。你能看到任何错误吗?帮助将不胜感激。使用预先计算的chi2内核与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');
这是内核是如何预先计算:
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的结果是错误的。
谢谢你回答我的问题,我刚才看到你的回应了。 – Sallos
@Sallos:虽然你的公式稍微偏离了,但真正的问题是数据正常化。看到我的回答 – Amro