SVM最初被设计用于二分类问题,后来扩展到处理多类问题。其思想是将问题分解为许多二元分类问题,然后将它们组合起来以获得预测结果。
一种方法称为“一对多”,建立与类别数目相同的二元分类器,每个分类器训练用于将一个类别与其他类别分离。要预测新实例,我们选择具有最大决策函数值的分类器。
另一种称为“一对一”(我认为在LibSVM中使用),则构建k(k-1)/2
个二元分类器,训练用于将每对类别相互分离,并使用多数投票方案(最大胜利策略)来确定输出预测。
还有其他方法,例如使用纠错输出码(ECOC)来构建许多略带冗余的二元分类器,并利用这种冗余性来获得更强健的分类(使用与海明码相同的思想)。
示例(一对一):
load fisheriris
[g gn] = grp2idx(species);
[trainIdx testIdx] = crossvalind('HoldOut', species, 1/3);
pairwise = nchoosek(1:length(gn),2);
svmModel = cell(size(pairwise,1),1);
predTest = zeros(sum(testIdx),numel(svmModel));
for k=1:numel(svmModel)
idx = trainIdx & any( bsxfun(@eq, g, pairwise(k,:)) , 2 );
svmModel{k} = svmtrain(meas(idx,:), g(idx), ...
'BoxConstraint',2e-1, 'Kernel_Function','polynomial', 'Polyorder',3);
predTest(:,k) = svmclassify(svmModel{k}, meas(testIdx,:));
end
pred = mode(predTest,2);
cmat = confusionmat(g(testIdx),pred);
acc = 100*sum(diag(cmat))./sum(cmat(:));
fprintf('SVM (1-against-1):\naccuracy = %.2f%%\n', acc);
fprintf('Confusion Matrix:\n'), disp(cmat)
这是一个示例输出:
SVM (1-against-1):
accuracy = 93.75%
Confusion Matrix:
16 0 0
0 14 2
0 1 15
rng
函数)。 - Amro