Matlab-libsvm - 从原始权重向量、线性内核再现决策值
Matlab-libsvm - reproducing the decision values from the primal weight vector, linear kernel
我正在尝试将 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 内核,如文档中所述:
-t
kernel_type : set type of kernel function (default 2)
0 -- linear: u'*v
1 -- polynomial: (gamma*u'*v + coef0)^degree
2 -- radial basis function: exp(-gamma*|u-v|^2)
3 -- sigmoid: tanh(gamma*u'*v + coef0)
4 -- precomputed kernel (kernel values in 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 相同):
(我也花了很长时间才弄清楚默认值是 RBF (2),而不是线性 (0) 内核。谁设置了这种违反直觉的默认值?!?)
我正在尝试将 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 内核,如文档中所述:
-t
kernel_type : set type of kernel function (default 2)
0 -- linear: u'*v
1 -- polynomial: (gamma*u'*v + coef0)^degree
2 -- radial basis function: exp(-gamma*|u-v|^2)
3 -- sigmoid: tanh(gamma*u'*v + coef0)
4 -- precomputed kernel (kernel values in 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 相同):
(我也花了很长时间才弄清楚默认值是 RBF (2),而不是线性 (0) 内核。谁设置了这种违反直觉的默认值?!?)