对于Adaboost 算法,基本算法流程网上很多,那些基础概要这里就不罗嗦了,下面写细节,假设你理解了Adaboost算法的流程。

这里主要讨论算法的三大细节。

根据公式pf(x) < p * thresold.

1. 在每一个特征选择的过程中最优门限的选择问题?

2. 决定不等式方向的的极值p = 1或p = -1?

3.在每一个弱分类器训练结束后,权值的更新,为什么错误的分类权值增加而正确的分类权值反而减少?

下面是我对上面三个问题的理解,有不当之处,欢迎指正。

主要参考:Robust Real-Time Face Detection    PAUL VIOLA & MICHAEL J. JONES

       Rapid Object Detection using a Boosted Cascade of Simple Features    Paul Viola  &  Michael Jones

问题1:

门限的选择: 详细参考原文 Robust Real-Time Face Detection 的3.1 learning discussion 部分。

对于每一个特征值,先对所有的样本按照特征值的从小到大依次排序,而每一个特征值得最优门限只需遍历一次排序好的列表,这时候只需要计算4个sum

1.ep =  Sum(Wi * 1{yi = 1},正样本的权值和

2.en =  Sum (Wi * 1{yi = 0} ,负样本的权值和

 下面两个和SP,SN 表示当遍历到第i个样本时

3.如果 yi = 1,则 SP += Wi 

4.如果 yi = 0, 则 SN +=Wi

遍历第i个样本之后, 最小误差权值 et = min( SP + (en - SN) , SN + (ep - SP));

 

极值p的选择: 如果P = 1 ,则 如果 f(x) < thresold ,则 h(x) = 1; 否则 h(x) = 0;

       如果p = -1,则 如果 f(x) > thresold,则 h(x) = 0;否则 h(x) =  1 ;

对于threshold 和p的求解,伪代码如下:

sort(Sample(feature);

求解ep 和en

init: SP = SN =0, e = et =100,eto = 1;

for i =0 ; i < sampleNum ; i++

  if(sample[i].y = 1)

    SP += sample[i].w

  else

    SN += sample[i].w

  eto = 1

  t1 = SP + (en - SN);

  t2 =  SN + (ep - SP);

  e = t1;

  if( t1 < t2)

    eto = -1;

    e  = t2;

  if(e < et)

     p = eto;

      et =  e;

    t = i;//返回最后的最近特征值

end for

下面是具体的程序

double et=100; //用来记录当前最小分类错误
int t=0; //用来记录当前最小分类错误的下标
int pto=1;
int pp=1;
double e;
///此处屡次出现错误,p的方向如何确定
for(i=0;i<num_samples;i++)
{
  if(nyfw[i].Y==1)
  {
    ef -= nyfw[i].W;
    en += nyfw[i].W;
  }
  else
  {
    ef += nyfw[i].W;
    en -= nyfw[i].W;
  }

  pto=1;

  e=ef;

  if(ef>en)
  {
    e = en;
    pto=-1;
  }

  if(e<et)
  {
    et=e;
    t=i;
    pp=pto;
  }
}

错误分类权值增加问题:

权值的更新最要是为了改变所有样本的概率分布,初始化是均匀分布

t 表示第t个弱分类器

由算法的公式 at = 1/2 * log ((1 - et)/et);

      H(x)  = sign (Sum (at * ht(x));

      当  H(x)  > 1/2 * Sum(at)表示正确分类,否则 错误 其中 1/2 * Sum(at) 表示强分类器(adaboost)总的门限

上面可以看出,当et 越大时,那么at就越小

也就是说,当分类错误时,加大错误样本的权值,使得分类错误之后,所有的和的误差et变大,at 变小

这样就在最后的线性和H(x)中的不是很准确的分类器所占的比重下降,提高分类器的性能。