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

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

当数据是可分离的(n=300,p=1000)时,两种方法产生的决策值的尺度不同,相关但不相同(预测的标签也不完全相同):
Matlab-libsvm - 从原始权重向量、线性核中再现决策值-LMLPHP

当数据不可分时(n=300,p=10),值之间的关系非常弱:
Matlab-libsvm - 从原始权重向量、线性核中再现决策值-LMLPHP

我怀疑我错过了一些基本的东西。有任何想法吗? 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');

最佳答案

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



使用训练命令 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 相同):

Matlab-libsvm - 从原始权重向量、线性核中再现决策值-LMLPHP

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

关于Matlab-libsvm - 从原始权重向量、线性核中再现决策值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34419576/

10-12 22:04