前言
问题提出:众所周知,支持向量机(Support Vector Machine,SVM)是一个解决二分类问题的分类器,svm处理多分类问题只能通过一对一策略(One versus One,OvO)或者一对多策略(One versus Rest,OVR),这里先不讨论那种策略的好坏,因为libsvm工具箱用的时OvO策略,所以我们就OvO策略展开,很多博客都给出了OvO策略的原理,无非就是投票,既然是投票,就有可能出现票数相同的情况,本文就是讨论libsvm解决多分类问题采样投票法,得票数量相同的情况的做法。
一、SVM的OvO多分类策略
为了方便,这里就直接复制SVM的OvO背景了,原文连接如下
svm多分类效果不佳,目前是svm研究的热点之一。libsvm用的是one- versus-one法。
简介:
一对一法(one-versus-one,简称OVO SVMs或者pairwise)。其做法是在任意两类样本之间设计一个SVM,因此k个类别的样本就需要设计k(k-1)/2个SVM。当对一个未知样本 进行分类时,最后得票最多的类别即为该未知样本的类别。Libsvm中的多类分类就是根据这个方法实现的。
还是假设有四类A,B,C,D 四类。在训练的时候我选择A,B; A,C; A,D; B,C; B,D;C,D所对应的向量作为训练集,然后得到六个训练结果,在测试的时候,把对应的向量分别对六个结果进行测试,然后采取投票形式,最后得到一组结 果。
投票是这样的.
A=B=C=D=0;
(A, B)-classifier 如果是A win,则A=A+1;otherwise,B=B+1;
(A,C)-classifer 如果是A win,则A=A+1;otherwise, C=C+1;
…
(C,D)-classifer 如果是C win,则C=C+1;otherwise,D=D+1;
The decision is the Max(A,B,C,D)
二、解决得票数量相同问题
很明显,在以上投票机制下会出现得票数量相同的情况,比如分类的6个SVM分类器的结果为:
下面来算B、C的概率和:
---------------P( B )=abs(-1.3860)+abs(1.2906)=2.6766
---------------P( C )=abs(-0.6228 )+abs(- 0.0739)=0.6967
因为,P( B )>P( C ),虽然B和C的票数相同,但libsvm还是将最终分类结果给予了B。
总结
libsvm采用OvO策略解决多分类问题,具体来说就是投票算法,当得票相同时,则可以用概率绝对值的和作为判断最终分类输出的依据。
libsvm分类中,分类概率的获取方法:
[pa pb pc]=svmpredict(y_test,feature_test,model);
这里的pc输出的就是所谓的分类概率,其维度为[样本数量*二分类器数量],每一列对应一个二分类器的输出。
这里的做法可以扩展到其他的分类器,比如LDA的分类结果也是输出一个类似的正/负数概率,根据这个概率,采样投票法就可以将LDA采用OvO策略扩展为多分类分类器。