对于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)中的不是很准确的分类器所占的比重下降,提高分类器的性能。
Adaboost 再续(细节),布布扣,bubuko.com
原文:http://www.cnblogs.com/fartherfuture/p/3682376.html