Adaboost是广义上的提升方法(boosting method)的一个特例。广泛应用于人脸识别等领域。

它的基本思想是,“三个臭皮匠赛过诸葛亮”,即用多个弱分类器的线性加权,来得到一个强的分类器。弱分类器到底有多“弱”呢?在某些情境下,xi>v就是一个弱分类器,它只对输入特征的某一个维度做判断,真是够弱了。

首先,弱分类器是一个一个的学习的,而且,根据这些弱分类器的表现,配以不同的权重,表现好的弱分类器,权重就大一点,表现不好的弱分类器,权重就小一点。

其次,在每一次学习时,每个弱分类器其实处理的都是不一样的数据,what?因为在学习时,我们会给不同的样本配以不同的权重,若这个样本对于当前的弱分类器来说比较重要,权重就大一些,反之权重就小一些。

现在我们大概知道了,Adaboost就是通过不断调整样本权重,来学习不同的弱分类器,然后将这些弱分类器,按照它们各自的表现配以不同的权重,线性加权得到最终的分类器。看来,“权重”这个概念在Adaboost方法中显得非常重要。

具体的来说,在学习第一个弱分类器时,各样本的权重都是一样的,且加和为1。在我们学习到第一个弱分类器f1之后,计算f1的分类误差,注意,这里的分类误差是基于样本权重来计算的,然后我们根据这个分类误差,确定第一个弱分类器的权重。最后,我们需要根据当前弱分类器的分类结果,对样本权重进行调整。被正确分类的,权重调低,被错误分类的,权重调高。然后继续学习下一个弱分类器。

我们打一个比方,一群学生不服管教,校长从警官学校请来一批教员,依次给学生上课,每个教员都有自己的拿手绝活。第一个教员上完课之后,一部分学生变乖的,另一部分学生仍然不听话。于是第一个教员把不听话的学生列了一个名单,交给第二个教员,让他对这些“问题学生”格外关注,第二个教员教完后,首先,这些“问题学生”之中,有一部分变乖了,还有一部分仍然不听话,其次,之前的乖学生,也有一部分不服第二个教员,于是第二个教员把他所遇到的不听话的学生,又列了一个名单,交给了第三个教员。第三个教员拿到的名单,包含了两部分“问题学生”,一部分是仅不服第二个教员的,他们的名字用普通字体标识,另外一部分是前两个教员都不服的,他们的名字加粗显示。于是第三个教员就心中有数了,他给学生上课的时候,重点关注那些“问题学生”,尤其是对前两个教员都不服的“问题学生”。依次进行下去。最后,学期结束校长验收,当这批教员同时出现时,绝大多数学生都变成了听话的学生。

以上是Adaboost的通俗解释。我们看Adaboost算法细则时,经常会感到疑惑,为什么这个权重这样调整?为什么这个参数这样设置?看似巧妙,实际上背后有深刻的理论支撑。这个理论就是,可加性模型。可加性模型听起来高大上,但它的一个例子很亲民,就是决策树。

可加性模型可以这样表示 Fm = f1+f2+...+fm。其中fi表示一些弱分类器,我们把这些弱分类器线性组合起来,就能构成一个强分类器。但是,同时求解这些弱分类器,比较困难,因此我们通常采用前向分步算法。具体是,先求F1 = f1,在一定的损失函数下,确定f1,然后,求F2 = f1+f2,在一定的损失函数下,确定f2,依次类推。可以看出,我们每次都是在前一次学习的基础上,再学习下一个弱分类器。这里的f2,可以针对f1分错的样例进行纠错和补充,这一点是非常重要的,对比决策树,如果我们在父节点对样本的分类不够纯粹,可以在子节点进行修复和纠错,这一点上来看,决策树和可加性模型是同一个思路。事实上,可加性模型中,就有一种以决策树作为弱分类器的模型,称为提升树(boosting tree)。

对于可加性模型,我们再举一个回归树的例子。仍然假设Fm = f1+f2+...+fm,此时,我们用f2去拟合f1和y之间的残差,从而得到对y更准确的估计。这里仍然遵循了上面的思路,用后面的弱学习器对前面的弱学习器进行补充和纠错。

再回到Adaboost,如果我们把模型选作可加性模型,损失函数选作指数损失,算法选择前向分步算法,那么得到的就是Adaboost模型。

Adaboost的意义的更多相关文章

  1. 关于Adaboost——样本抽样的权值的实际意义

    看这篇文章的前提:已经看了PRML中的Adaboost的算法流程 看懂下面的内容必须牢牢记住:Adaboost使用的误差函数是指数误差 文章主要目的:理解样本抽样的权值是为什么那样变化的. 得出的结论 ...

  2. scikit-learn Adaboost类库使用小结

    在集成学习之Adaboost算法原理小结中,我们对Adaboost的算法原理做了一个总结.这里我们就从实用的角度对scikit-learn中Adaboost类库的使用做一个小结,重点对调参的注意事项做 ...

  3. PRML读书会第十四章 Combining Models(committees,Boosting,AdaBoost,决策树,条件混合模型)

    主讲人 网神 (新浪微博: @豆角茄子麻酱凉面) 网神(66707180) 18:57:18 大家好,今天我们讲一下第14章combining models,这一章是联合模型,通过将多个模型以某种形式 ...

  4. 基于MATLAB的adaboost级联形式的人脸检测实现

    很早之前就做过一些关于人脸检测和目标检测的课题,一直都没有好好总结出来,趁着这个机会,写个总结,希望所写的内容能给研究同类问题的博友一些见解和启发!!博客里面涉及的公式太繁琐了,直接截图了. 转载请注 ...

  5. 基于单决策树的AdaBoost

    ①起源:Boosting算法 Boosting算法的目的是每次基于全部数据集,通过使用同一种分类器不同的抽取参数方法(如决策树,每次都可以抽取不同的特征维度来剖分数据集) 训练一些不同弱分类器(单次分 ...

  6. 几种Boost算法的比较(Discrete AdaBoost, Real AdaBoost, LogitBoost, Gentle Adaboost)

    关于boost算法 boost算法是基于PAC学习理论(probably approximately correct)而建立的一套集成学习算法(ensemble learning).其根本思想在于通过 ...

  7. adaboost算法

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

  8. 机器学习技法-AdaBoost元算法

    课程地址:https://class.coursera.org/ntumltwo-002/lecture 重要!重要!重要~ 一.Adaptive Boosting 的动机 通过组合多个弱分类器(hy ...

  9. aggregation(2):adaptive Boosting (AdaBoost)

    给你这些水果图片,告诉你哪些是苹果.那么现在,让你总结一下哪些是苹果? 1)苹果都是圆的.我们发现,有些苹果不是圆的.有些水果是圆的但不是苹果, 2)其中到这些违反"苹果都是圆的" ...

随机推荐

  1. 【汇总】Linux常用脚本shell

    [crontab] #每天6:00 执行a.sh00 6 * * * /bin/sh /home/work/rxShell/a.sh #每天3:20 执行a1.sh20 3 * * * /bin/sh ...

  2. window 下生成NodeJs(v8.9.3) 的 VS2015 解决方案node.sln

    window 下生成NodeJs(v8.9.3) 的 VS2015 解决方案node.sln 使用步骤 也可以参照 github: https://github.com/nodejs/node/blo ...

  3. Python 脚本实现对 Linux 服务器的监控

    本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn 摘要: 原文地址 由于原文来自微信公众号,并且脚本都是图片,所以这里 ...

  4. 一步一步从原理跟我学邮件收取及发送 13.mime格式与常见字符编码

    在前面的本系列文章中我们已经学会了邮件的发送和收取.但在收取中我们看到的是一串串的乱码,回忆前面的发送过程,我们会奇怪:我们前面的邮件是明文啊.为什么明文的邮件明明也可以正常工作,还要弄乱码似的字符串 ...

  5. 彻底理解 Android 中的阴影

    如果我们想创造更好的 Android App,我相信我们需要遵循 Material Design 的设计规范.一般而言,Material Design 是一个包含光线,材质和投影的三维环境.如果我们想 ...

  6. bcache的使用

    一.前提:内核中需要配置bcache模块 1.1 检查 - 是否存在于内核中:检查/sys/fs/bcache目录是否存在,没有说明内核中没有bcache - 是否以内核模块方式存在:检查/lib/m ...

  7. java1环境与简介

    java1环境与简介   Ⅰ 个人简介 陈鹏 联系方式:15828682774 2012 年至今,从事软件开发 5 年. 1 年新加坡海外工作经历. 先后在民企.外企.创业公司做过开发. 熟悉 JAV ...

  8. PHP 是一门弱类型语言

    PHP 是一门弱类型语言 我们注意到,不必向 PHP 声明该变量的数据类型. PHP 会根据变量的值,自动把变量转换为正确的数据类型. 在强类型的编程语言中,我们必须在使用变量前先声明(定义)变量的类 ...

  9. 第二十章 Django数据库实战

    第二十章 Django数据库实战 第一课 获取单表单数据的三种方式: urls.py中的路由代码: path('busniess',views.busniess), views.py中代码: def ...

  10. Java NIO之缓冲区

    1.简介 Java NIO 相关类在 JDK 1.4 中被引入,用于提高 I/O 的效率.Java NIO 包含了很多东西,但核心的东西不外乎 Buffer.Channel 和 Selector.这其 ...