带有预计算内核的 libsvm:如何计算分类分数?

Posted

技术标签:

【中文标题】带有预计算内核的 libsvm:如何计算分类分数?【英文标题】:libsvm with precomputed kernel: How do I compute the classification scores? 【发布时间】:2014-03-16 14:14:07 【问题描述】:

我正在使用 MATLAB 中的 libsvm 并正在训练和测试具有预先计算的非线性内核的 1-vs-all SVM。我对 SVM 有点陌生,我正在尝试计算决策函数。我知道对于线性 SVM,我们可以通过(根据 libsvm 文档)获得 w:

w = model.sv_coef'*model.SVs;

然后我们可以根据以下公式计算决策值:

w'*x

随后,根据sign(w'*x+b)预测标签,其中 b 是某个阈值。

我特别感兴趣的是从我的非线性内核中获得分类分数。我该怎么办?

【问题讨论】:

嗨,NOP,我刚刚注意到 OP 可能更关注“预计算”的问题。我添加了一个关于如何将预计算内核合并到 libsvm 中的简单示例。希望对您有所帮助。 【参考方案1】:

我试图理解分类分数是什么意思。实际上你可以比较每个模型的概率,并选择最大的一个,就像我在你的previous post中所做的那样。

如果您使用决策函数也可以。假设你使用的是 RBF 内核,并且model.Label(1) = 1,那么你有(如果是model.Label(1) = -1,那么是w = -w; b = -b;

[m,n] = size(model.SVs); % m is the number of support vectors,...
                           and n is the number of features
w = model.sv_coef; % m*1 weight vector
b = -model.rho; % scalar

现在你得到v 正在测试中。而且你还有[1,n] = size(v); 然后对于支持向量中的每一行i,计算欧几里得距离(你可以向量化下面的代码):

for i = 1:m
    d(i) = norm(model.SVs(i,:) - v);
    t(i) = exp(-gamma* d(i) .^2); % RBF model, t is 1*m vector
end

而决策函数(或决策函数的得分)为:

s = t * w + b;

您可以使用其他非线性内核类似地获得决策函数。


编辑

使用自写的预计算内核,我们以RBF内核为例:

% RBF kernel: exp(-gamma*|u-v|^2)

rbf = @(X,Y) exp(-gamma .* pdist2(X,Y,'euclidean').^2);

% Kernel matrices with sample serial number as first column as required 

K_train =  [(1:numTrain)' , rbf(trainData,trainData)];
K_test =   [(1:numTest)'  , rbf(testData,trainData)];

%# train and test
model             = svmtrain(trainLabel, K_train, '-t 4');
[predLabel, ~, ~] = svmpredict(testLabel, K_test, model);

%# confusion matrix
C = confusionmat(testLabel,predLabel);

【讨论】:

你不是说exp(-gamma * d(i) .^2) 吗? 是否有可能通过使用RBF内核将被测向量v表示为w * v + b == 0来表示分离超平面?

以上是关于带有预计算内核的 libsvm:如何计算分类分数?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 matlab 中使用带有 libsvm 的预计算内核

在 Python 中使用 LibSVM 预计算内核

Libsvm 预计算内核

遇到和错误:尝试使用带有 LibSVM 的预计算内核时出现“错误的输入格式:sample_serial_number 超出范围”

将预计算的 chi2 内核与 libsvm (matlab) 一起使用时结果不佳

libsvm 交叉验证与 matlab 中的预计算内核