最近一个图像识别项目里需要对分类的结果进行打分,因为使用的是libsvm3.12,一开始决定直接将svm_predict_values函数的dec_values作为评分返回,后来研究了之后才觉得里面有的东西还挺有趣。
首先介绍一下SVM中的多分类方法。目前SVM多分类流行的策略有one-against-all以及one-against-one两种,libsvm中的多分类是采用的one-against-one策略,其他有一些开源库如SVM-Light采用one-against-all。对于N类的数据,one-against-all建立N个分类器,但有一些缺点,如:数据集偏斜、分类重叠、不可分现象等(参见:http://www.blogjava.net/zhenandaci/archive/2009/03/26/262113.html);one-against-one建立N*(N-1)/2个分类器,每个分类器对样本进行投票,票数最多对应的类别作为识别结果。在分类器里用来决定投票给谁的依据,就是decision value,也就是libsvm中的dec_values。
以下考虑线性核的情况。
直观上以为decision value就是样本点到最优超平面的距离,其实并不是,分析如下:
假设计算出的分类决策面能将两类(P, N)完全分开,则有: