adaboost算法简介

                                                   adaboost算法介绍

     最近开始学习人脸识别和分类器方面的东西,看了一篇介绍adaboost算法的论文,感觉不错,给大家分享一下:

     adaboost算法的指导思想是“三个臭皮匠赛过诸葛亮”,原理是从很多的弱分类算法中根据某种准则选择一些好的弱分类算法,再将这些弱分类算法整合到一块,形成一个强分类算法。论文只考虑了将目标分成两类的情况。对于每一个给定的模式xi ,每一个弱分类器给出相应的分类选择kj ( xi ) ∈ {-1,1} ,最后整合成一个强分类器,线性合成即可,如下:                           

                  C(xi )=a1 * K1 (xi ) +a2 * k2 (x2 ) +......+a11 * k11 (xi )           (1)

     其中,k1 ,k2 ,......k11 代表11个选中的弱分类器,a1 ,a2 ,a11 代表赋给相应若分类器的权值,注意,个数不一定,视具体情况而定。

     首先,我们需要从弱分类器集合 (不同情况下分类器集合也不同 )中找到合适的分类器。具体做法是找一组事先分好类的训练数据集T{ (xi ,yi )},其中yi ∈{-1,1}表示xi 所属的分类。假如需要L个弱分类器,那么程序需要迭代L次,每一次从分类器集合中选择一个当前最优 (即使得当前C (xi )分类结果最好 )的分类器,M次迭代以后,合成最后的强分类器。那么如何才能找到当前最好的分类器呢?我们来看一下第M次迭代的情况,目前合成的强分类器形式如下:                          

              Cm-1 (xi )=a1 *K1 (xi )+a2 *k2 *(x2 )+......+am-1 *km-1 (xi )       (2)

      我们想要把上式扩展为                         

                   Cm (xi )= Cm-1 (xi )+am *km (xi )              (3) 

      在第一次迭代时(m=1),Cm-1 =0.接下来,我们定义一个判断分类器误差的公式:

                       N

                   E=∑  exp{ -yi * (Cm-1 (xi )+am *km (xi ))}              (4)

                       i=1

     上式 (4 )中,am 和km 是未知的,因为我们的目的是找到km ,我们可以将式子 (4 )改写成下面两个公式:

                              N

                         E= ∑  wi (m) exp{ -yi *am *km (xi )}                  (5)

                             i=1


                 wi (m) =exp{-yi * Cm-1 (xi )}                             (6)

        其中,i=1,2......N.在第一次迭代中,wi (1) =1.而在后续的迭代中,wi (m) 会动态的变化。我们继续对上式进行改写:

        E  = yi= km (xi )   { wi (m) * exp{ -am } }   +  ∑ yi km (xi )   { wi (m) *exp{ am } }               (7)

                                             

         因为yi 与km (xi )相等时, -yi * km (xi )=-1;而不相等时,-yi * km (xi )=1.式子 (7 )中的第一部分可以记为Wc * exp (-am ),第二部分可以记为We * exp (am ),则式子变为:


                   E=Wc * exp (-am )+We * exp (am )                            (8)  

        在选择km 时,am 的值是不相关的,因此可以先假设am 为固定值,因为exp{am }>1,那么使E减小等价于使E*exp{am }减小,由式 (8 )得,

                   exp{am }* E=Wc +We *exp (2am )= (Wc +We )+We * ( exp{2am }-1 )            (9)              

        分析右边的式子,由于 (Wc +We )是当前迭代时权值和,是一个常量。而exp{2am }>1,因此式子的大小就取决于We 的大小,即每次迭代总是选取使得当前We 最小的分类器。

        接下来,确定am 值的大小,对式子 (8 )两遍对am 求微分,如下:

                    d(E)/d( am ) = -Wc * exp{ -am } + We * exp{ am }                     (10)

     另上式等于0,解方程,可得

                    am= 1/2 * ln{ Wc /We }                            (11)   

     令em = We / W,则上式可化简为

                               am= 1/2 * ln{ (W-We )/We }= 1/2 * ln{ (1-em )/em }                    (12)

     根据上述分析步骤,可写出adaboost伪代码如下:

        初始化 wi (1) =1

        for m=1 to M

           1 从分类器集合中选取当前最优分类器 km ,该分类器使得下式值最小:

                                 We   =   yi km (xi )   { wi (m) }             

                 2 计算该分类器的权值

                           am= 1/2 * ln{ (W-We )/We }= 1/2 * ln{ (1-em )/em }          

                 3 更新样本数据集合的权值,使得分类错误的数据权值变大,分类正确的数据权值变小,

                           if  km (xi ) yi

                                     wi (m+1)    = wi (m)     *  exp{ am

                          else

                        wi (m+1)    = wi (m)     *  exp{ -am }  

       adaboost算法步骤不算复杂,但是关键要理解其原理及为什么要这样进行选择,这篇论文深入浅出的对adaboost进行了一系列的推导和分析,个人感觉不错,本人翻译的不太好,有兴趣可以读一下原论文,题目是AdaBoost and the Super Bowl of Classifiers A Tutorial Introduction to Adaptive Boosting。




你可能感兴趣的:(算法,人脸识别,扩展,c)