Matlab-libsvm - 从原始权重向量,线性内核再现决策值

时间:2015-12-22 15:48:50

标签: matlab svm linear-algebra libsvm

我正在尝试将libsvm的svmpredict提供的决策值与通过原始权重向量w上的数据投影生成的决策值进行比较(我正在考虑线性情况)。出于调试目的,我使用相同的数据进行培训和测试。

w根据libsvm FAQ计算。然后我通过z = X * w + b来计算决策值。

当数据可分离时(n = 300,p = 1000),两种方法产生的决策值会有不同的缩放,相关但不相同(预测的标签也不完全相同): enter image description here

当数据不可分割时(n = 300,p = 10),值之间的关系非常弱: enter image description here

我怀疑我错过了一些基本的东西。有任何想法吗? Matlab的fitcsvm对象不会产生这种差异。

代码:

%% generate some random data
n=300;
p=1000;
labels=mod(randperm(n)',2)*2-1;
X=randn(n,p);

%% train model
model= svmtrain(labels, X,'-q b 0');

%% produce primal w (libsvm faq)
w = model.SVs' * model.sv_coef;
b = -model.rho;

if model.Label(1) == -1
  w = -w;
  b = -b;
end

primal_decision_values=(X*w+b); %??

%% svmpredict decision values
[predicted_label, accuracy, libsvm_decision_values]=svmpredict(labels,X,model,'-q b 0');

%% comparison
fprintf('label agreement: %g\n',mean(sign(predicted_label)==sign(primal_decision_values)))
scatter(primal_decision_values,libsvm_decision_values); xlabel('primal decision values'); ylabel('libsvm decision values');

1 个答案:

答案 0 :(得分:3)

LibSVM中的默认内核是RBF内核,如文档中所述:

  

-t kernel_type:设置内核函数类型(默认为2)
    0 - 线性:u' * v
    1 - 多项式:(gamma * u' * v + coef0)^度
     2 - 径向基函数:exp(-gamma * | u-v | ^ 2)
    3 - sigmoid:tanh(gamma * u' * v + coef0)
    4 - 预先计算的内核(training_set_file中的内核值)

使用训练命令model= svmtrain(labels, X,'-q b 0');,您将训练 RBF 支持向量机。然而,使用带有等式w的原始X*w+b的预测仅适用于线性 SVM。

使用线性内核训练SVM时:

model = svmtrain(labels, X,'-t 0 -q -b 0');

将LibSVM函数和预测与X*w+b(除svmtrain除MWE之外的所有代码)进行比较时,您将获得一个漂亮的身份函数:

comparison

(我花了很长时间才发现默认值是RBF(2),而不是线性(0)内核。谁设置了这种违反直觉的默认值?!?)