最近一个图像识别项目里需要对分类的结果进行打分,因为使用的是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)完全分开,则有: ,其中w理解为最优超平面的法向量,计算式为,αj对应于libsvm中svm_model结构体的sv_coef。

分类间隔。所以支撑向量到最优超平面的距离为。也就是说,对于其他样本点,decision value为,到最优超平面的距离为,支撑向量就是的情况。libsvm里只进行decision value的计算,没有除去||ω||,想要进一步计算超平面距离,参考:http://www.csie.ntu.edu.tw/~cjlin/libsvm/faq.html#f4151 。

另外decision value也跟概率无关(用在回归时确实表示概率,但在分类时则不是)。根据我看到的说法,由decision value的计算式,它的取值范围应该是在实数域上的(这是在一篇外国的硕士论文上看到的说法,见Andreas Vlachos的《Active Learning with Support Vector Machines》,2004)。不过我觉得这样说好像也不对,假设我们对样本特征数据做了scale,那么所有的样本点就被限定在一个有限空间里,既然最优超平面也是在这个空间里确定的,那么只要所有的测试样本点做了scale处理,到最优超平面的距离肯定是有上界的。具体这个上界怎么去推导,暂时还不懂。

多分类时one-against-one的策略里有一点小问题就是,各个二分类器的计算得出的decision value其实是没有可比性的,而one-against-all没有这个问题。为什么这么说呢?这是因为:1)one-against-all各个分类器训练参数跟数据集是一样的,只不过是label做了改变。所以比较不同分类器的decision value是合法的;2)one-against-one各个分类器的训练时,用的是不同数据集,因此分类器之间的decision value不能直接比较。按照我的理解,前者是在同一个空间里比较,后者就不是了。

按照在国内外论坛上别人的说法,甚至不能给decision value附件任何含义,除了线性核的SVM里可以用decision value进一步计算距离(参见http://stackoverflow.com/questions/11030253/decision-values-in-libsvm ,不过我觉得老外也未必都是对的)。稳妥的说法就是decision value可以用来作为分类结果置信度的评价。

回到对分类结果进行打分的问题上来,在网上查找资料时,看到有人也做了类似的工作,见:http://blog.csdn.net/zhzhl202/article/details/7438313 。他的方法是:,其中k为所有支持判别类得个数,n为所有类别个数,si 为所有支持判别类的分数。我觉得这种方法兼顾了投票数与decision value两方面的信息,比直接累加dec_values然后取平均肯定要好,但是公式的由来,似乎又没有坚实的理论依据。不过没有其他好方法之前,我项目里暂时就这么用了。

最新文章

  1. div中iframe高度自适应问题
  2. SQL Server如何编辑超过前200行的数据
  3. java.sql.SQLException: ORA-00911: invalid character 解决方法
  4. JavaScript 火的有点过头了,但又能火多久呢?
  5. C语言初学者代码中的常见错误与瑕疵(2)
  6. DEVICE_OBJECT结构参数
  7. 接口自动化测试:参数化封装(excel文件读取)
  8. 《分布式Java应用之基础与实践》读书笔记三
  9. jmeter 接口重放(投票活动)
  10. 本地配置DNS服务器(MAC版)
  11. 【Netty源码分析】Netty服务端bind端口过程
  12. [Python]Flask构建网站分析应用
  13. 微信小程序onLaunch、onLoad执行生命周期
  14. NLog使用整理
  15. 如何在Qt Creator中添加库文件和头文件目录
  16. drozer工具的安装与使用:之一安装篇
  17. 加快cin读取速度
  18. win10 mstsc 远程 windows2008R2
  19. VMware 14 tools位置;
  20. Redis有序集合

热门文章

  1. java基本数据类型转换成byte[]数组
  2. SpringMVC记住密码功能
  3. 深入浅出OpenStack云计算平台管理(nova-compute/network)
  4. Ubuntu 14.04LTS Gnome GUI初体验及163更新源配制
  5. hive udaf 用maven打包运行create temporary function 时报错
  6. smartforms客制页格式
  7. VS2010 编译安装boost库
  8. GCC中初始化函数是怎样被处理的?
  9. [黑马程序员] 集合框架2——Map系 & 集合工具类(Collections、Arrays)
  10. JSP/Servlet-----charset 、pageEncoding差别