笔者是一个没有任何工作经验的辣鸡学生,想给自己期末复习的时候留点东西,因为自己太健忘了。
这是我的第一篇博客,微博不算的话,那就是人生第一篇,平时说话都说不明白,写东西更说不明白了,更何况我说的不一定对,怕是只有我自己才知道自己说些什么吧!
总之如果这篇文真的有人看(大概率没有),文章有说的不对的地方请指正!别喷小辣鸡我就是了(奉承脸)
Dear自己,如果你下次再想不起来adaboost是什么的话,请往下看,你之前是这么想的:
Adaboost实际上是做了一个分类器,训练的时候,比如识别人脸,你要把你的一堆训练图片标记成两类,是人脸(1)、不是人脸(0)。这样等训练好之后,当你向分类器输入一张图片,他就会告诉你这张图片是不是人脸。
理论上说,一个训练完好的分类器是对他自己的输出结果百分百自信的,所以我们管这个叫强分类器(strong classifier),而强分类器的结果是由一系列弱分类器(weak classifier)的结果综合产生的。就好像一个牛X的投资公司,在做一个决策的时候,投资部门说投股票,风控部门说投黄金,那么这个公司的老总肯定会根据这些部门以前投资建议的表现来做一个综合考量,最后给出一个结果。
那么就从最小的部分讲起。什么是弱分类器呢,弱分类器可以表示为以下公式:
h
t
(
x
⃗
)
=
1
o
r
−
1
h_t(\vec x)=1\ or {-1}
ht(x)=1 or−1,也就是如果标号为t的这个弱分类器认为这张图片是人脸的话,他的函数值就会返回1,否则返回-1。那么现在就可以知道各个弱分类器是怎么给强分类器来提供信息的了,强分类器:
H
(
x
⃗
)
=
s
g
n
(
∑
i
=
1
n
α
t
h
t
(
x
⃗
)
)
H(\vec x)=sgn(\sum_{i=1}^{n}\alpha_th_t(\vec x))
H(x)=sgn(∑i=1nαtht(x))
这里的sgn()返回bool值,也就是正的返回true或者说1,负的返回false,而
α
t
\alpha_t
αt就是第t个弱分类器的权重了,可以理解成这个弱分类器在强分类器面前说话占了多少分量。
现在拆开来看一下到底什么是弱分类器,每个弱分类器实质上对应一个feature,这里用的是一个叫做herr-like function的东西。如下图就是一个two-rectangle feature, 我们把他放到图片的某个位置,用左面白色的部分减去右面黑色的部分,就可以得到一个数,为什么是一个数呢,实际上这个减法是用白色部分所有像素的加和减去黑色部分和,这里有一个方法叫summed-area table可以极大的加速整个运算过程,不过不影响理解,我就不在这里介绍了。
所以herr-like function做了好多好多这样的东西,两个的、三个的、四个的,然后设一个阀值,如果这个function算出来的数大于某个数T,那么通过这个弱分类器它认为这是人脸,如果小于则不是,但这个结果是片面的,因为它只能观察到很小的区域,所以也称为弱分类器。事实上,这样的feature有好多,能很好的探测到像素中体现出来的边、块、线条等,既然每块feature都能提供部分的结论,那么我们想办法找出最能代表识别对象(例如人脸)的feature做一个组合,就能既准确又快速的辨别对象了,这就是刚刚提到的强分类器。
我们注意到,这个算法叫adaboost learning algorithm,它里面有个learning(现在啥东西带了learning都感觉好智能!),再结合上面给出的强分类器的公式,这个learning实际上是一种对样本数据的自适应,1.我们把哪个feature放进去,2.这个feature的结论有多大权重是可信的。
首先,要找出各个feature对于训练集判断的误差,
e
j
=
∑
i
=
1
n
w
i
[
1
−
h
j
(
x
⃗
)
y
i
2
]
e_j=\sum_{i=1}^{n}w_i[\frac{1-h_j(\vec x)y_i}{2}]
ej=∑i=1nwi[21−hj(x)yi]。
这里的
e
j
e_j
ej代表第j个弱分类器的误差(好像有点乱了,feature和弱分类器的意思是差不多的,一个弱分类器就对应一个feature),一个弱分类器的误差就在于它分错了多少张图片,这里i代表第i张图片,来看公式中的第二项,如果第j个分类器错误的分类了第i张图片,那么它的误差就会增加1,而前面的wi对应的是这张图片的权重,也就是它有多么迫切的需要被正确分类,这个后面还会介绍。
算完误差之后,我们挑选误差最小的分类器假如强分类器大家庭,它占有的比重当然要根据它的正确率来决定:
α
j
=
1
2
l
n
(
1
−
e
k
e
k
)
\alpha_j=\frac{1}{2}ln(\frac{1-e_k}{e_k})
αj=21ln(ek1−ek),这里就可以看到你对的越多,你占的比重也就越大,并且,如果你的正确率还没有到50%,没关系,你的权重是负的,也就是你是反面典型,你算出来的正的大概率是负的,我把你倒过来就可以了,但是一般情况下,feature的数量很大很大,一般误差率最小的feature都会小于50%。
这时就提到这个wi了,当选择完一个分类器之后,每张图片的权重都会改变,:
w
i
=
w
i
e
(
−
α
j
∗
y
i
∗
h
k
(
x
⃗
)
)
w_i=w_ie^{(-\alpha j*y_i*h_k(\vec x))}
wi=wie(−αj∗yi∗hk(x)),yi和hk(x)分别对应的是这张图片的真实类别和被挑选中的分类器给它分配的类别,也就是说,如果分类器正确对它分类,那么对于剩下还没有被挑选的分类器来说正确分类这张图片的任务就不是那么重了,所以wi会变小,反之会变大。
当然,在整个挑选开始前,所以图片wi的和要等于1,这也就是要做一个规范化,
w
i
=
w
i
∑
w
j
w_i=\frac{wi}{\sum wj}
wi=∑wjwi。
这就是整个adaboost的过程,究竟要挑选多少feature作为一个类别的分类呢,这就需要实践来检验了。
参考
http://en.wikipedia.org/wiki/Summed_area_table
http://en.wikipedia.org/wiki/AdaBoost