Adaboost学习总结

基本是网上的资料。

一、起源

boost 算法系列的起源来自于PAC Learnability(PAC 可学习性)。这套理论主要研究的是什么时候一个问题是可被学习的,当然也会探讨针对可学习的问题的具体的学习算法。这套理论是由Valiant提出来的,也因此(还有其他贡献哈)他获得了2010年的图灵奖。

PAC 定义了学习算法的强弱

  弱学习算法---识别错误率小于1/2(即准确率仅比随机猜测略高的学习算法)

  强学习算法---识别准确率很高并能在多项式时间内完成的学习算法

同时 ,Valiant和 Kearns首次提出了 PAC学习模型中弱学习算法和强学习算法的等价性问题,即任意给定仅比随机猜测略好的弱学习算法 ,是否可以将其提升为强学习算法 ? 如果二者等价 ,那么只需找到一个比随机猜测略好的弱学习算法就可以将其提升为强学习算法 ,而不必寻找很难获得的强学习算法。 也就是这种猜测,让无数牛人去设计算法来验证PAC理论的正确性。

不过很长一段时间都没有一个切实可行的办法来实现这个理想。细节决定成败,再好的理论也需要有效的算法来执行。终于功夫不负有心人, Schapire在1996年提出一个有效的算法真正实现了这个夙愿,它的名字叫AdaBoost。AdaBoost把多个不同的决策树用一种非随机的方式组合起来,表现出惊人的性能!第一,把决策树的准确率大大提高,可以与SVM媲美。第二,速度快,且基本不用调参数。第三,几乎不Overfitting。我估计当时Breiman和Friedman肯定高兴坏了,因为眼看着他们提出的CART正在被SVM比下去的时候,AdaBoost让决策树起死回生!Breiman情不自禁地在他的论文里赞扬AdaBoost是最好的现货方法(off-the-shelf,即“拿下了就可以用”的意思)。

二、Adaboost算法

AdaBoost,是英文"Adaptive Boosting"(自适应增强)的缩写,由Yoav Freund和Robert Schapire在1995年提出。Adaboost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这 Adaboost 些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。其算法本身是通过改变数据分布来实现的,它根据每次训练集之中每个样本的分类是否正确,以及上次的总体分类的准确率,来确定每个样本的权值。将修改过权值的新数据集送给下层分类器进行训练,最后将每次训练得到的分类器最后融合起来,作为最后的决策分类器。使用adaboost分类器可以排除一些不必要的训练数据特徵,并将关键放在关键的训练数据上面。

AdaBoost 是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器,即弱分类器,然后把这些弱分类器集合起来,构造一个更强的最终分类器。(很多博客里说的三个臭皮匠赛过诸葛亮)

算法本身是改变数据分布实现的,它根据每次训练集之中的每个样本的分类是否正确,以及上次的总体分类的准确率,来确定每个样本的权值。将修改权值的新数据送给下层分类器进行训练,然后将每次训练得到的分类器融合起来,作为最后的决策分类器。

整个Adaboost 迭代算法就3步:

  1. 初始化训练数据的权值分布。如果有N个样本,则每一个训练样本最开始时都被赋予相同的权重:1/N。
  2. 训练弱分类器。具体训练过程中,如果某个样本点已经被准确地分类,那么在构造下一个训练集中,它的权重就被降低;相反,如果某个样本点没有被准确地分类,那么它的权重就得到提高。然后,权重更新过的样本集被用于训练下一个分类器,整个训练过程如此迭代地进行下去。
  3. 将各个训练得到的弱分类器组合成强分类器。各个弱分类器的训练过程结束后,加大分类误差率小的弱分类器的权重,使其在最终的分类函数中起着较大的决定作用,而降低分类误差率大的弱分类器的权重,使其在最终的分类函数中起着较小的决定作用。换言之,误差率低的弱分类器在最终分类器中占的权重较大,否则较小。

三、具体例子解释Adaboost运行流程

也许你看了上面的介绍或许还是对adaboost算法云里雾里的,没关系,百度大牛举了一个很简单的例子,你看了就会对这个算法整体上很清晰了。

  下面我们举一个简单的例子来看看adaboost的实现过程:

图中,“+”和“-”分别表示两种类别,在这个过程中,我们使用水平或者垂直的直线作为分类器,来进行分类。

最终结果如果是1说明是”+“,如果是-1则说明“-”。

  第一步:

  根据分类的正确率,得到一个新的样本分布D,一个子分类器h1

  其中划圈的样本表示被分错的。在右边的图中,比较大的“+”表示对该样本做了加权。

【ε和α的计算】

1) 开始的时候均匀分布,10个点:m=10,权值D1(i)=1/m=1/10=0.1;

2)误差ε等于被错误分类的点的权值之和:0.1+0.1+0.1=0.3

3)α依据公式计算得0.42

4)更新权值,错误点权值加大:exp(-αt * yi *  ht(xi)),当yi ≠ ht(xi)时,说明真实的y和假设h不一致,假设出错,进行了错误分类,也就是y=1而h=-1等情况,则乘exp(αt)增大权值;如果归类正确,通过乘以exp(-αt)减小权值。那么,

被错误分类的三个“+”:0.1*(e^0.42)=0.152

被正确分类的“+”和“-”:0.1*[e^(-0.42)]=0.066

由于是分布,权值和为1,进行归一:错误点0.152/0.152*3+0.066*7≈0.17; 正确点0.066/0.152*3+0.066*7=0.07。

检验一下:0.17*3+0.07*7=1

第二步:

根据分类的正确率,得到一个新的样本分布D3,一个子分类器h2

【ε和α的计算】

此时权值:2个0.07的“+”,2个0.07的“-”,3个0.17的“+”,3个被分错的0.07的“-” 。

被错误分类的三个点上一轮是正确点,权值为0.07,因此新的误差ε2=0.07*3=0.21

α算出得0.65。

----------------  更新权值并归一:(e^0.65=1.91554 ; e^-0.65=0.522)-------------

错分点:3个 0.07*1.91554=0.134

正确点:4个 0.07*0.522=0.03654 ;3个 0.17*0.522=0.08874

归一:3*0.134+4*0.03654+3*0.08874=0.81438

0.134/0.81438=0.1645; 3个-

0.03654/0.81438=0.044868; 4个 2+ 2-

0.08874/0.81438=0.108966; 3个+

检验:0.1645*3+0.044868*4+0.108966*3=0.99987≈1

第三步:

 得到一个子分类器h3。

【ε和α的计算】

ε=0.044868*3=0.1346≈0.14

α计算得0.92

  整合所有子分类器:

因此可以得到整合的结果,从结果中看,及时简单的分类器,组合起来也能获得很好的分类效果,在例子中所有的。

到这里,也许你已经对adaboost算法有了大致的理解。但是也许你会有个问题,为什么每次迭代都要把分错的点的权值变大呢?这样有什么好处呢?不这样不行吗?

然后看了adaboost算法。 注意到算法最后的表到式为,这里面的a 表示的权值,是由得到的。而a是关于误差的表达式,到这里就可以得到比较清晰的答案了,所有的一切都指向了误差。提高错误点的权值,当下一次分类器再次分错了这些点之后,会提高整体的错误率(因为错分点的权值加重,再错的话就会被加进误差里面去),这样就导致 a 变的很小,最终导致这个分类器在整个混合分类器的权值变低。也就是说,这个算法让优秀的分类器占整体的权值更高,而挫的分类器权值更低。这个就很符合常理了。到此,我认为对adaboost已经有了一个透彻的理解了。

四、关于α的取值证明和ε的分析见《Boosting Methods for AutomaticSegmentation of Focal Liver Lesions》第二章,很精妙。

五、未看完的文章:http://blog.csdn.net/tiandijun/article/details/48036025

时间: 2024-10-15 10:31:00

Adaboost学习总结的相关文章

AdaBoost学习思考

近期需要做一个TransferLearing的大作业,就先总结一下自己学习AdaBoost的一些思考 一直以来人们都想通过对分类器分错的样本构建单独的分类器来增加分类准确率,所以AdaBoost出现以前就有了boostrapping方法和bagging方法 AdaBoost历史: 1)bootstrapping方法的主要过程 主要步骤: i)重复地从一个样本集合D中采样n个样本 ii)针对每次采样的子样本集,进行统计学习,获得假设Hi iii)将若干个假设进行组合,形成最终的假设Hfinal i

人脸检测之Haar-like,Adaboost,级联(cascade)

0:写在前面的话 写在前面的牢骚话,作为一个非主流工程师,我专业与目前工作都与这些知识相隔十万八千里,所以,我所学习和实现的完全是因为兴趣,目前还研究学习的很浅,谈不上高深,所以还是要继续努力学习.希望和大家多交流,也欢迎伪大牛,假专家板砖伺候,也希望真大牛多指点(真大牛不会啰嗦一堆来显得他知道的多,哈哈),总之,本人还在菜鸟阶段,欢迎指教.0.0本文如有错误请及时留言指出,博主会在第一时间修改,确保不会对其他读者产生副作用. 1:人脸检测与识别 人脸识别系统主要包括四个组成部分,分别为:人脸图

转载——Adaboost 算法 人脸检测原理

对人脸检测的研究最初可以追溯到 20 世纪 70 年代,早期的研究主要致力于模板匹配.子空间方法,变形模板匹配等.近期人脸检测的研究主要集中在基于数据驱动的学习方法,如统计模型方法,神经网络学习方法,统计知识理论和支持向量机方法,基于马尔可夫随机域的方法,以及基于肤色的人脸检测.目前在实际中应用的人脸检测方法多为基于 Adaboost学习算法的方法. Viola人脸检测方法是一种基于积分图. 级联检测器和AdaBoost 算法的方法,方法框架可以分为以下三大部分:    第一部分,使用Harr-

基于AdaBoost算法——世纪晟结合Haar-like特征训练人脸检测识别

  AdaBoost?算法是一种快速人脸检测算法,它将根据弱学习的反馈,适应性地调整假设的错误率,使在效率不降低的情况下,检测正确率得到了很大的提高.   系统在技术上的三个贡献: 1.用简单的Haar-like矩形特征作特征,可快速计算 2.基于AdaBoost的分类器设计 3.采用了Cascade(分级分类器)技术提高检测速度 人脸的特征表示方法--Haar-like矩形特征   矩形特征的值是所有白色矩形中点的亮度值的和减去所有灰色矩形中点的亮度值的和,所得到的差 具体特征可以用一个五元组

嵌入级联分类器

嵌入级联分类器 nested cascade detector detector AdaBoost Real AdaBoost 读"C. Huang, H. Ai, B. Wu, and S. Lao, 'Boosting Nested Cascade Detector for Multi-View Face Detection',ICPR, 2004,Vol II:415-418"笔记 论文主要贡献点 提出一种基于Haar 特征查找表的弱分类器,并使用Real Adaboost学习出

人脸识别

一:发展历程 人脸识别系统的研究始于20世纪60年代,80年代后随着计算机技术和光学成像技术的发展得到提高,而真正进入初级的应用阶段则在90年后期,并且以美 国.德国和日本的技术实现为主:人脸识别系统成功的关键在于是否拥有尖端的核心算法,并使识别结果具有实用化的识别率和识别速度:“人脸识别系统”集成了 人工智能.机器识别.机器学习.模型理论.专家系统.视频图像处理等多种专业技术,同时需结合中间值处理的理论与实现,是生物特征识别的最新应用,其核心 技术的实现,展现了弱人工智能向强人工智能的转化.

行人检测2(行人检测的发展历史)

行人检测在计算机视觉领域的许多应用中起着至关重要的作用,例如视频监控.汽车驾驶员辅助系统.人体的运动捕捉系统等.图像的行人检测方法可以分成两大类:轮廓匹配和表观特征.表观特征又被定义成图像特征空间(也叫做描述算子),它可以分为整体法.局部法.特征点对法. 在整体法中,Papageorgiou和Poggio[1]提出了Haar小波(HWs)特征,并用SVM训练行人,其中包括了行人的正面和背面.Viola和Jones[2, 3]采用级联AdaBoost学习算法(即选择超过一定阈值的弱分类器组成强分类

opencv5-objdetect之级联分类器

这是<opencv2.4.9tutorial.pdf>的objdetect module的唯一一个例子. 在OpenCV中进行人脸或者人眼 或者身体的检测 首先就是训练好级联分类器,然后就是检测就行.在opencv中,"opencv/sources/data中就有内置训练好的:基于haar特征的级联分类器.基于hog特征的级联分类器.基于lbp特征的级联分类器"三种.相比较来说 算haar文件夹中的分类器最多,其他两个比如:hog的只有一个行人检测分类器"hogc

SIFT/SURF、haar特征、广义hough变换的特性对比分析[z]

 SIFT/SURF基于灰度图, 一.首先建立图像金字塔,形成三维的图像空间,通过Hessian矩阵获取每一层的局部极大值,然后进行在极值点周围26个点进行NMS,从而得到粗略的特征点,再使用二次插值法得到精确特征点所在的层(尺度),即完成了尺度不变. 二.在特征点选取一个与尺度相应的邻域,求出主方向,其中SIFT采用在一个正方形邻域内统计所有点的梯度方向,找到占80%以上的方向作为主方向:而SURF则选择圆形邻域,并且使用活动扇形的方法求出特征点主方向,以主方向对齐即完成旋转不变. 三.以主方