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

Posted

技术标签:

【中文标题】Matlab-libsvm - 从原始权重向量、线性核再现决策值【英文标题】:Matlab-libsvm - reproducing the decision values from the primal weight vector, linear kernel 【发布时间】:2016-03-28 22:30:45 【问题描述】:

我正在尝试将 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');

【问题讨论】:

【参考方案1】:

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

-tkernel_type : 设置核函数类型(默认2) 0 -- 线性:u'*v 1 -- 多项式:(gamma*u'*v + coef0)^degree2 -- 径向基函数: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 的预测仅适用于 linear SVM。

使用线性核训练 SVM 时:

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

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

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

【讨论】:

以上是关于Matlab-libsvm - 从原始权重向量、线性核再现决策值的主要内容,如果未能解决你的问题,请参考以下文章

文本挖掘——文本特征TFIDF权重计算及文本向量空间VSM表示

文本挖掘——文本特征TFIDF权重计算及文本向量空间VSM表示

通过 ONNX 从 PyTorch 转换为 CoreML 时缺少权重向量

绘制决策边界 matplotlib

ahp层次分析法是啥

如何获得经过训练的 LDA 分类器的特征权重