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

Matlab 带预计算内核的libsvm:如何计算分类分数?,matlab,machine-learning,svm,libsvm,Matlab,Machine Learning,Svm,Libsvm,我在MATLAB中使用libsvm,并使用预计算的非线性核训练和测试1-vs-all SVM。我对支持向量机有点陌生,我正在尝试计算决策函数。我知道,对于线性支持向量机,我们可以通过(根据libsvm文档)获得w: 然后,我们可以根据以下公式计算决策值: w'*x 然后,根据符号(w'*x+b)预测标签,其中b是某个阈值 我特别感兴趣的是从我的非线性核中获得分类分数。我该怎么做呢?我想知道你所说的分类分数是什么意思。实际上,你可以比较每个模型的概率,然后选择最大的一个,就像我在你的 如果您使用

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

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

w'*x
然后,根据
符号(w'*x+b)
预测标签,其中b是某个阈值


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

我想知道你所说的分类分数是什么意思。实际上,你可以比较每个模型的概率,然后选择最大的一个,就像我在你的

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

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

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

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


编辑

对于一个自编预计算内核,让我们以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)
?嗨,不,我只是注意到OP可能更关注“预计算”的问题。我添加了一个关于如何在libsvm中合并预计算内核的简单示例。希望能有帮助。
[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
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);