首页 > 代码库 > 写一个个人认为比较详细的adaboost算法

写一个个人认为比较详细的adaboost算法

   最近在看机器学习中adaboost(adaptive boostint)算法部分的内容,在csdn上面查找一番发现,好像没有讲的特别的详尽的,当然可能是我人品不佳,所以没有找到,为了防止同样的事情发生在其他人的身上,所以就写了这篇博文,尽量多的解释算法的推演过程更方便的大家去理解这个算法。

 

   介绍adaboost算法之前,首先介绍一下学习算法的强弱,这个是PAC定义的:弱学习算法---识别错误率小于1/2(即准确率仅比随机猜测略高的学习算法),强学习算法---识别准确率很高并能在多项式时间内完成的学习算法。

 

   接着我就用我所理解的例子来介绍一下adaboost算法,相信看过这个计算过程大家对这个算法肯定有更深刻的理解,由于csdn插入公式比较困难,所以下面的步骤我就用word截图来表示了,对了先叙述一下adaboost算法的迭代过程吧,这样对后面的计算会理解的更深刻一些。

 

    adaboost算法迭代过程:

         技术分享

    有了adaboost算法的迭代过程,那么我们就可以利用已知的公式对上面的式子进行简化了,下面的公式应用的会更多一 些

 

                  技术分享

    推导部分就到这里好了,接下来就是用例子来帮助大家理解adaboost算法的过程了,恩,见证奇迹的时刻到来了

               技术分享

          技术分享

            技术分享

   好了到了这里对adaboost算法的过程肯定是理解了吧,那么我接着来放一个code来实现一下这个过程,必定会加深大家对这个算法的理解,OK,开始。

01.# coding: UTF-8  
02.from __future__ import division  
03.import numpy as np  
04.import scipy as sp  
05.from weakclassify import WEAKC  
06.from dml.tool import sign  
07.class ADABC:  
08.    def __init__(self,X,y,Weaker=WEAKC):  
09.        ''''' 
10.            Weaker is a class of weak classifier 
11.            It should have a    train(self.W) method pass the weight parameter to train 
12.                                pred(test_set) method which return y formed by 1 or -1 
13.            see detail in <统计学习方法> 
14.        '''  
15.        self.X=np.array(X)  
16.        self.y=np.array(y)  
17.        self.Weaker=Weaker  
18.        self.sums=np.zeros(self.y.shape)  
19.        self.W=np.ones((self.X.shape[1],1)).flatten(1)/self.X.shape[1]  
20.        self.Q=0  
21.        #print self.W  
22.    def train(self,M=4):  
23.        ''''' 
24.            M is the maximal Weaker classification 
25.        '''  
26.        self.G={}  
27.        self.alpha={}  
28.        for i in range(M):  
29.            self.G.setdefault(i)  
30.            self.alpha.setdefault(i)  
31.        for i in range(M):  
32.            self.G[i]=self.Weaker(self.X,self.y)  
33.            e=self.G[i].train(self.W)  
34.            #print self.G[i].t_val,self.G[i].t_b,e  
35.            self.alpha[i]=1/2*np.log((1-e)/e)  
36.            #print self.alpha[i]  
37.            sg=self.G[i].pred(self.X)  
38.            Z=self.W*np.exp(-self.alpha[i]*self.y*sg.transpose())  
39.            self.W=(Z/Z.sum()).flatten(1)  
40.            self.Q=i  
41.            #print self.finalclassifer(i),'==========='  
42.            if self.finalclassifer(i)==0:  
43.  
44.                print i+1," weak classifier is enough to  make the error to 0"  
45.                break  
46.    def finalclassifer(self,t):  
47.        ''''' 
48.            the 1 to t weak classifer come together 
49.        '''  
50.        self.sums=self.sums+self.G[t].pred(self.X).flatten(1)*self.alpha[t]  
51.        #print self.sums  
52.        pre_y=sign(self.sums)  
53.        #sums=np.zeros(self.y.shape)  
54.        #for i in range(t+1):  
55.        #   sums=sums+self.G[i].pred(self.X).flatten(1)*self.alpha[i]  
56.        #   print sums  
57.        #pre_y=sign(sums)  
58.        t=(pre_y!=self.y).sum()  
59.        return t  
60.    def pred(self,test_set):  
61.        sums=np.zeros(self.y.shape)  
62.        for i in range(self.Q+1):  
63.            sums=sums+self.G[i].pred(self.X).flatten(1)*self.alpha[i]  
64.            #print sums  
65.        pre_y=sign(sums)  
66.        return pre_y  


 

先试验下《统计学习方法》里面那个最简单的例子:
技术分享
可以看到也是三个分类器就没有误分点了,权值的选择也是差不多的
其中后面那个-1 表示大于threshold分为负类,小于分为正类。1则相反
技术分享

加一些其它数据试试:
技术分享
结果
  技术分享
我们把图画出来就是:
技术分享
基本还是正确的,这是四个子分类器的图,不是最后总分类器的图啊~~~

 

 

 


 

 

写一个个人认为比较详细的adaboost算法