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 内核,如文档中所述:
-t
kernel_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表示