AdaBoost
- 要明确Adaboost是一种算法。
- 介绍一下Adaboost的历史。
Adaboost的前身的Boosting算法。
Boosting是一种提高任意给定学习算法准确度的方法。它的思想起源于Valiant提出的PAC(Probably Approximately Correct)学习模型。Valiant和Kearns提出了弱学习和强学习的概念,识别错误率小于1/2,也即准确率仅比随机猜测略高的学习算法称为弱学习算法;识别准确率很高并能在多项式时间内完成的学习算法称为强学习算法。同时,Valiant和Kearns首次提出了PAC学习模型中弱学习算法和强学习算法的等价性问题,即任意给定仅比随机猜测略好的弱学习算法,是否可以将其提升为强学习算法?如果二者等价,那么只需找到一个比随机猜测略好的弱学习算法就可以将其提升为强学习算法,而不必寻找很难获得的强学习算法。
1990年, Schapire最先构造出一种多项式级的算法,对该问题做了肯定的证明,这就是最初的Boosting算法。一年后,Freund提出了一种效率更高的Boosting算法。但是,这两种算法存在共同的实践上的缺陷,那就是都要求事先知道弱学习算法学习正确率的下限。
1995年, Freund和schapire改进了Boosting算法,提出了AdaBoost(Adaptive Boosting)算法[5],该算法效率和Freund于1991年提出的Boosting算法几乎相同,但不需要任何关于弱学习器的先验知识,因而更容易应用到实际问题当中。之后,Freund和schapire进一步提出了改变Boosting投票权重的AdaBoost.M1,AdaBoost.M2等算法,在机器学习领域受到了极大的关注。
- Adaboost详解
Adaboost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。
其算法本身是通过改变数据分布来实现的,它根据每次训练集之中每个样本的分类是否正确,以及上次的总体分类的准确率,来确定每个样本的权值。将修改过权值的新数据集送给下层分类器进行训练,最后将每次训练得到的分类器最后融合起来,作为最后的决策分类器。使用adaboost分类器可以排除一些不必要的训练数据特征,并将关键放在关键的训练数据上面。
- 在线训练阶段流程图:
最终出来的结构应该是这样的:
N级分类器,每个分类器带一个自己的阈值;N个分类器的权重比例;整个强分类器的阈值
- 离线检测阶段流程图:
如图
- 工具包
算法的流程理解了,可是要将这个算法完全自己实现,难度还是很大的。幸好已经有人做了这方面的工作。
- 如果要训练的是Haar特征,opencv的cvHaarTraining就足够了,什么adaboost,cascade,神马都不用管,按格式写好文件,等着结果就行了。
- OPENCV的cvBoost,主要有这么几个函数
bool CvBoost::train(。。。);
CvBoost::load(。。。)
float CvBoost::predict(。。。)
- opencv的sample中有一个多类分类的问题,可以参考一下,不过读文件那块写得真烂。。。
- 强烈推荐!!!GML AdaBoost Matlab Toolbox
莫斯科大学的一个学生写得,很赞。里面有三种adaboost的实现,详细的说明文档,Examples。而且检测部分有c++的源码及工程。
有兴趣的朋友们看看说明文档就一目了然了,very good!!!
原文:http://shijuanfeng.blogbus.com/logs/100675208.html