一.准备
学习网址: https://class.coursera.org/ntumltwo-002/lecture
二.课程内容
2.1复习
上一讲主要讲解了blending and bagging。blending的主要思想是为了把我们手上的小区合并成一个大区,可以通过uniform,no-uniform的方法进行投票,如果我们手上还没有一堆小区,可以通过bootstrapping来反复产生随机样本。
2.2 Motivation of Boosting
举例:小孩苹果识别
为了识别这些苹果和梨子,老师告诉学生哪些是苹果或者梨子。
老师问Michael:你觉得哪个是苹果。
Michael:苹果是圆的
这时候Michael圆形这个特征,识别出部分的苹果,有对的也有错的。比如说香蕉和菠萝被区分,但是橘子却无法分开,可见单独通过圆形是无法将苹果准确识别出的。
这时候作为老师,我们允许学生做一些错误,我们把错误的标出来,告诉学生这些地方应该更加注意一些。比如把错的放大,让学生把
注意力放在错误的地方。
这时候老师又问Tina, 从上一次判断结果来看,你觉得还有没有什么规则来判断。Tina看了看放大的图片,觉得红色是苹果。
但是青苹果和红草莓识别错误。
接下来,Jone认为绿色的是苹果。
Jessica,认为带梗的是苹果。
我们可以把每个学生的假设作为gt, 整个班的假设为G,这时候图上的 。和 x 就可以分开, 老师就相当于我们的演算法,来监督学生的假设。
2.3 Diversity by Re-weighting
bagging是bootstrapping aggregation的缩写。核心是bootstrapping。在这里我们经过随机抽样,得到 。
在这里我们的目标是优化错误率,我们由右边的那个式子得到平均的错误率。我们bootstrapping产生不同的u,作为权重,最后优化错误率。
我应该怎么改变u,让g越不一样,通过aggregation,越能得到更好的效果。通过改变u来得到不同的g.
如果某个gt在ut+1时表现不好,那么gt或者与gt很像的hypothesis就可能不会选到,因此可通过ut+1来调整g.
那么如何定义g的表现不好呢?如果错误率与丢硬币没什么两样(即二分之一),那就是表现差.
在这里我们可以看到错误的被放大,正确的被缩小,所以可以让我们的注意力集中在错误的身上。
2.4 Adaptive Boosting Algotithm
算法流程:
初始化
for t =1,2,3 … T:
在这里如何更新u呢?方法如下:
好的g多要一点,什么是好的g?好的g就是错误率小的,则应该是比较大的。发明这个算法的人,
完整的算法:
理论依据
只要g比随机要好,就可以把他提升为一个强分类。
2.5Adaptive Boosting in Action
动画演示过程
(初始化) (t=10)
从这个过程中,我们可以看出 经过t=100次迭代,就能将数据分开
从上面我们可以看出AdaBoost-Stump具备了特征选择的能力,这跟 CNN 有点像,但是我觉得简单的区别是,adaboost只是作为一个分类器,特征应该是通过其他方法提取
的,不具备产生特征的能力,只具备选择能力。而CNN具有产生,选择特征的能力。所以CNN能在计算机视觉中广泛应用。
应用: 人脸检测, 可以利用opencv中的例子,跑跑历程。
代码实现
-- coding: utf-8 --
“””
Created on Sun Jan 31 08:18:53 2016
@author: young
“”“
from future import division
import numpy as np
class AdaBoost:
def init(self,training_set):
self.training_set = training_set
self.N = len(self.training_set)
self.U = np.ones(self.N) / self.N
self.RULES = []
self.ALPHA = []
def set_rule(self, func, test=False):
errors = np.array([t[1] != func(t[0]) for t in self.training_set])
e = (errors * self.U).sum()
if test:
return e
alpha = 0.5 * np.log((1-e) / e)
print("e = %.2f a=%.2f" %(e,alpha))
w = np.zeros(self.N)
for i in range(self.N):
if errors[i] == 1:
w[i] = self.U[i] * np.exp(alpha)
else:
w[i] = self.U[i] * np.exp(-alpha)
self.U = w / w.sum()
self.RULES.append(func)
self.ALPHA.append(alpha)
def evaluate(self):
NR = len(self.RULES)
for (x,l) in self.training_set:
hx = [self.ALPHA[i]*self.RULES[i](x) for i in range(NR)]
print x, np.sign(l) == np.sign(sum(hx))
if name == ‘main‘:
examples = []
examples.append(((1, 2 ), 1))
examples.append(((1, 4 ), 1))
examples.append(((2.5,5.5), 1))
examples.append(((3.5,6.5), 1))
examples.append(((4, 5.4), 1))
examples.append(((2, 1 ),-1))
examples.append(((2, 4 ),-1))
examples.append(((3.5,3.5),-1))
examples.append(((5, 2 ),-1))
examples.append(((5, 5.5),-1))
m = AdaBoost(examples)
m.set_rule(lambda x: 2*(x[0] < 1.5)-1)
m.set_rule(lambda x: 2*(x[0] < 4.5)-1)
m.set_rule(lambda x: 2*(x[1] > 5)-1)
m.evaluate()