使用预先计算的核函数的libsvm:我如何计算分类分数?

3

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

w = model.sv_coef'*model.SVs;

我们可以根据以下方式计算决策值:

w'*x

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

我特别想从我的非线性核中获取分类分数。我该怎么做?


嗨NOP,我刚注意到OP可能更关注“预计算”的问题。我添加了一个简单的示例,演示了如何将预计算内核合并到libsvm中。希望能对你有所帮助。 - lennon310
1个回答

2
我试图理解你所说的分类分数。实际上,您可以比较每个模型的概率,并选择最大的一个,就像我在您之前的帖子中所做的那样。如果您正在使用决策函数也是可以的。假设您正在使用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 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) - lejlot
有没有可能通过使用RBF内核来表示测试向量v,使得w * v + b == 0,以表示分离超平面? - Amit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接