我正在MATLAB中使用libsvm,训练和测试一个预计算的非线性核的1-VS-ALL SVM。我对SVM有点陌生,正在尝试计算决策函数。我知道对于线性SVM,我们可以通过以下方式获得w(根据libsvm文档):
w = model.sv_coef'*model.SVs;
我们可以根据以下方式计算决策值:
w'*x
接下来,根据 sign(w'*x+b)
预测标签,其中 b 是某个阈值。
我特别想从我的非线性核中获取分类分数。我该怎么做?
我正在MATLAB中使用libsvm,训练和测试一个预计算的非线性核的1-VS-ALL SVM。我对SVM有点陌生,正在尝试计算决策函数。我知道对于线性SVM,我们可以通过以下方式获得w(根据libsvm文档):
w = model.sv_coef'*model.SVs;
我们可以根据以下方式计算决策值:
w'*x
接下来,根据 sign(w'*x+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