我正在嘗試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