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

时间:2014-02-17 10:25:39

标签: matlab machine-learning svm libsvm

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

w = model.sv_coef'*model.SVs;

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

w'*x

然后,预测符合sign(w'*x+b)的标签,其中b是某个阈值。

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

1 个答案:

答案 0 :(得分:2)

我试图理解你的分类得分是什么意思。实际上,您可以比较每个模型的概率,并选择最大的模型,就像我在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);