boost

一.准备
学习网址: 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()     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值