我试图将 libsvm 的 svmpredict 提供的决策值与原始权重向量 w 上的数据投影生成的决策值进行比较(我正在考虑线性情况)。出于调试目的,我使用相同的数据进行训练和测试。
w 是根据 libsvm FAQ 计算的。然后我通过 z=X*w+b 计算决策值。
当数据是可分离的(n=300,p=1000)时,两种方法产生的决策值的尺度不同,相关但不相同(预测的标签也不完全相同):
当数据不可分时(n=300,p=10),值之间的关系非常弱:
我怀疑我错过了一些基本的东西。有任何想法吗? 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 相同):(我也花了很长时间才弄清楚默认值是 RBF (2),而不是线性 (0) 内核。谁设置了这种违反直觉的默认值?!?)
关于Matlab-libsvm - 从原始权重向量、线性核中再现决策值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34419576/