libsvm中的dec_values以及分类结果评分问题
最近一个图像识别项目里需要对分类的结果进行打分,因为使用的是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然后取平均肯定要好,但是公式的由来,似乎又没有坚实的理论依据。不过没有其他好方法之前,我项目里暂时就这么用了。
libsvm中的dec_values以及分类结果评分问题的更多相关文章
- Java IO流体系中常用的流分类
Java输入/输出流体系中常用的流分类(表内容来自java疯狂讲义) 注:下表中带下划线的是抽象类,不能创建对象.粗体部分是节点流,其他就是常用的处理流. 流分类 使用分类 字节输入流 字节输出流 字 ...
- MLlib 中的聚类和分类
聚类和分类是机器学习中两个常用的算法,聚类将数据分开为不同的集合,分类对新数据进行类别预测,下面将就两类算法进行介绍. 1. 聚类和分类(1)什么是聚类 聚类( Clustering)指将数据对象分组 ...
- ASP.NET中Partial Class部分类
原文:ASP.NET中Partial Class部分类 如果您在开发项目的公用函数库,用于公用函数库的内容越丰富越好,但这不可能一下子就写好,需要一点一点的积累,这时就可以使用Partial Clas ...
- Sklearn中的回归和分类算法
一.sklearn中自带的回归算法 1. 算法 来自:https://my.oschina.net/kilosnow/blog/1619605 另外,skilearn中自带保存模型的方法,可以把训练完 ...
- Java中常见流的分类及简单讲解
流在Java中是指计算中流动的缓冲区. 从外部设备流向中央处理器的数据流成为“输入流”,反之成为“输出流”. 字符流和字节流的主要区别: 1.字节流读取的时候,读到一个字节就返回一个字节:字符流使用了 ...
- thinkphp中如何实现无限级分类?
thinkphp中如何实现无限级分类? 一.总结 1.数据表设计+递归算法 二.php实现无限级分类实例总结 1.数据库数据如下: 2.任务需求:给一个id,求自己和所有父亲. 3.实现代码如下:th ...
- 【转】Windows下使用libsvm中的grid.py和easy.py进行参数调优
libsvm中有进行参数调优的工具grid.py和easy.py可以使用,这些工具可以帮助我们选择更好的参数,减少自己参数选优带来的烦扰. 所需工具:libsvm.gnuplot 本机环境:Windo ...
- MySQL中SQL语句的分类
1:数据定义语言(DDL) :创建和删除数据库(CREATE DATABASE || DROP DATABASE):2:创建.修改.重命名.删除表(CREATE TABLE || ALTER TA ...
- Java中常见的锁分类以及对应特点
对于 Java 锁的分类没有严格意义的规则,我们常说的分类一般都是依据锁的特性.锁的设计.锁的状态等进行归纳整理的,所以常见的分类如下: 公平锁和非公平锁:公平锁是多线程按照锁申请的顺序获取锁,非公平 ...
随机推荐
- 用WebCollector制作一个爬取《知乎》并进行问题精准抽取的爬虫(JAVA)
简单介绍: WebCollector是一个无须配置.便于二次开发的JAVA爬虫框架(内核),它提供精简的的API.仅仅需少量代码就可以实现一个功能强大的爬虫. 怎样将WebCollector导入项目请 ...
- Leetcode: Median of Two Sorted Arrays. java.
There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted ...
- HDU1257 最小拦截系统 【贪婪】
最小拦截系统 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- Codeforces 56D Changing a String 编辑距离 记忆dp
主题链接:点击打开链接 编辑距离.,== 一边dp虽然录制前体累,,依然是dp #include<iostream> #include<cstdio> #include< ...
- Swift - 给图片添加图片水印(图片上绘制另一张图,并可设透明度)
我前面写了篇文章讲解如何给图片添加文字水印,而如果想要添加图片类型的水印也很简单,只要把原来代码里添加文字的部分改成图片即可. 1,效果图如下: (在图片左上角添加了一个半透明的logo图片) 2,为 ...
- paip.提升用户体验---c++ qt自定义窗体(1)---标题栏的绘制
源地址:http://blog.csdn.net/attilax/article/details/12343625 paip.提升用户体验---c++ qt自定义窗体(1)---标题栏的绘制 效果图: ...
- Delphi - SEH研究
技术交流,DH讲解. 前几天一个朋友在弄游戏外挂想带NP调试,就像自己来捕获游戏的异常.好像就要用到SEH这方面的知识.一起研究了一下,这里看下研究 和 在网上找的资料吧.SEH就是Structure ...
- VS2008通过 map 和 cod 文件定位崩溃代码行
VS 2005/2008使用map文件查找程序崩溃原因 一般程序崩溃可以通过debug,找到程序在那一行代码崩溃了,最近编一个多线程的程序,都不知道在那发生错误,多线程并发,又不好单行调试,终于找到一 ...
- Oracle Patch Bundle Update
一.相关知识介绍 以前只知道有CPU(Critical Patch Update)和PSU(Patch Set Update),不知道还有个Bundle Patch,由于出现了TNS-12531的BU ...
- Unity 3D 文件导入出错
Unity 3D 文件导入出错 安装unity 时我选择了free版的,打开已有项目时出现例如以下错误提示 解决的方法: 先把要导入的文件先复制到unity3d安装文件夹下相应的文件夹内,之后再返回u ...