这个AdaBoost算法的行为正确吗?

4
我正在按照Viola-Jones 论文所述的方法实现AdaBoost算法以增强自己的学识。在单元测试该算法的过程中,我发现了一些奇怪的行为。这可能是算法对预设数据的反应不同导致的,也可能是我漏掉了什么。我想知道是哪种情况。
首先,我有:
2 instances of A type faces
1 instance  of a B type face
3 instances of noise
--------------------
6 total instances

每个图像的初始权重为 1/6
分类器选择的第一个特征可以识别A型脸,但不能识别B型脸和任何噪音。因此,它有一个错误(以及在增强分类器中的相关权重)为 1/6
接下来,权重更新(首先将正确分类的图像乘以 (error / 1 - error)) == 0.2),得到:
A type face weight: 1/30
B type face weight: 1/6
noise image weight: 1/6

然后对权重进行归一化(总和为1):
A type face weight: 1/22
B type face weight: 5/22
noise image weight: 5/22

第二个特征正确选择B类型的图像,但不选择噪声或A类型的图像。因此,它的误差为1/11 (2/22),明显低于1/6。
由于Viola-Jones提出的“默认”阈值(这是在我们到达级联和在本文后面调整阈值之前)是权重的一半,而且只有两个权重,第二个特征的权重较大(因为它的误差更小),那么得到的增强分类器仅能正确分类B类型的脸。
直观地说,我希望由检测A类型脸部的弱分类器和检测B类型脸部的弱分类器组成的强分类器可以检测到A和B类型的脸部。
我甚至愿意接受只得到两者中的一个,因为AdaBoost算法是一种多数表决算法,并且可能会在只有两个投票者的情况下表现奇怪,但是如果它只能正确分类其中一个脸部,则我期望它可以正确分类A类型的脸部,因为A类型的脸部更多。
换句话说,我希望每个添加到强分类器中的弱分类器的权重逐渐降低。
我是否错过了某个步骤,还是这只是对过度简单数据的奇怪行为?
1个回答

1
在计算中存在一个错误。当使用第一个特征时,误差为1/6,因为只有B面被错分了。在这种情况下,噪声和A面被正确分类。因此,当你根据w(i) = w(i) * beta^(1-e(i))更新权重时,仅对于B面,e(i)等于1。对于噪声和A面,e(i) = 0。因此,噪声和A面的权重都将被更新:
A type face weight: 1/30
B type face weight: 1/6
noise image weight: 1/30

标准化后:

A type face weight: 1/10
B type face weight: 1/2
noise image weight: 1/10

现在,当您使用第二个功能时,错误率为1/5。

你是绝对正确的。我只是减少了对于分类正确的脸的权重,而没有对于分类正确的非面部进行权重调整。现在它的效果好多了。我会在可以时(必须等待24小时)颁发奖金。 - Pace

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接