1 算法原理
1.1 Gentle adaboost
参考文献:
1.2 算法实现2
参考
实现Gentle Adaboost的关键是要能估计出后验概率,即给定特征向量
x
的情况下,估计出当前权值分布下的该样本正样本的概率
在Gentle Adaboost中,弱分类器定义为:
公式(1)
f(x)=Pw(y=1|x)−Pw(y=−1|x)
在特征向量是1维的情况下,可以利用lookup table将特征的取值范围分为 多个区间,然后通过统计每个区间中的权值总和来估计后验概率。具体来说,令 W+1i 和 W−1i 分别表示第 i 个区间
W+1i=∑xj∈B(i),yj=1wj
W−1i=∑xj∈B(i),yj=−1wj
后验概率为:
公式(2)
Pw(y=1|x∈B(i))=W+1iW+1i+W−1i
Pw(y=−1|x∈B(i))=W−1iW+1i+W−1i
将公式(2)代入公式(1)即可得到弱分类器。
如下公式(3):
f(x)=W+1i−W−1iW+1i+W−1i
Gentle adaboost代码段
for i = 1:length(nodes)
curr_tr = nodes{i};
step_out = calc_output(curr_tr, Data); %节点分裂没有体现least-squres原则??
s1 = sum( (Labels == 1) .* (step_out) .* distr);
s2 = sum( (Labels == -1) .* (step_out) .* distr);
if(s1 == 0 && s2 == 0)
continue;
end
Alpha = (s1 - s2) / (s1 + s2); %%弱分类器结果。与公式(3)一致
Weights(end+1) = Alpha;
Learners{end+1} = curr_tr;
final_hyp = final_hyp + step_out .* Alpha;
end
distr = exp(- 1 * (Labels .* final_hyp));
Z = sum(distr);
distr = distr / Z;
end
1.3算法实现3
openCV中对Gentle Adaboost算法弱分类器训练流程如下:
openCV中,节点分裂规则为均方误差法则。
强分类器训练流程为:
- 可以看出,leftevalue和rightvalue为节点左右分裂结果
- 同时也是弱分类器的输出结果,他们可看作某一区域划分 B(−1)、B(+1) 的弱置信度.
- leftvalue 和 rightvalue 可看作y的均值,lefterror 和righterror可看作 y的均方误差。
可以看出:leftvalue=f(x)left=∑iwiyi∑iwi=∑yi=1wiyi+∑yi=−1wiyi∑iwi=∑yi=1wi−∑yi=−1wi∑yi=1wi+∑yi=−1wi=W+1i−W−1iW+1i+W−1i同理 rightvalue 可得同样结论。
2 原理推导
参考文献:《基于Gentle Adaboost的行人检测》
《基于AdaBoost检测器的似然估计方法》
《采用Gentle AdaBoost和嵌套级联结构的实时人脸检测》
《Additive Logistic Regression: a Statistical View of Boosting》
http://blog.csdn.net/wsj998689aa/article/details/42652827