写一个个人认为比较详细的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则相反

加一些其它数据试试:

结果:

我们把图画出来就是:

基本还是正确的,这是四个子分类器的图,不是最后总分类器的图啊~~~

时间: 2024-08-04 03:37:22

写一个个人认为比较详细的adaboost算法的相关文章

算法-美团2015校招笔试:写一个复杂度为n的排序算法

一组随机排序的字母数字.请编写一个时间复杂度为O(n)的算法,使这些字母从小到大顺序排序. 说明:字母区分大小写,相同的字母,排序护小写排在前面. 例如:R,B,B,b,W,W,B,R,B,w 排序为:b,B,B,B,B,R,R,w,W,W #include <stdio.h> #include <string.h> void getHelper(); int main() { char str[100]; int helper[150]={0}; int i,j; gets(st

Adaboost算法原理分析和实例+代码(简明易懂)

Adaboost算法原理分析和实例+代码(简明易懂) [尊重原创,转载请注明出处] http://blog.csdn.net/guyuealian/article/details/70995333     本人最初了解AdaBoost算法着实是花了几天时间,才明白他的基本原理.也许是自己能力有限吧,很多资料也是看得懵懵懂懂.网上找了一下关于Adaboost算法原理分析,大都是你复制我,我摘抄你,反正我也搞不清谁是原创.有些资料给出的Adaboost实例,要么是没有代码,要么省略很多步骤,让初学者

图像算法研究---Adaboost算法详解

本篇文章先介绍了提升放法和AdaBoost算法.已经了解的可以直接跳过.后面给出了AdaBoost算法的两个例子,附有详细计算过程. 1.提升方法(来源于统计学习方法) 提升方法是一种常用的统计学习方法,应用十分广泛且有效.在分类问题中,它通过改变训练样本的权重,学习多个分类器,并将这些分类器进行线性组合,提高分类的性能.提升算法基于这样一种思路:对于一个复杂任务来说,将多个专家的判断进行适当的综合所得出的判断,要比其中任何一个专家单独的判断好.实际上,就是"三个臭皮匠顶个诸葛亮"的道

图像算法研究---Adaboost算法具体解释

本篇文章先介绍了提升放法和AdaBoost算法.已经了解的可以直接跳过.后面给出了AdaBoost算法的两个样例.附有详细计算过程. 1.提升方法(来源于统计学习方法) 提升方法是一种经常使用的统计学习方法,应用十分广泛且有效.在分类问题中,它通过改变训练样本的权重,学习多个分类器,并将这些分类器进行线性组合,提高分类的性能. 提升算法基于这样一种思路:对于一个复杂任务来说,将多个专家的推断进行适当的综合所得出的推断.要比当中不论什么一个专家单独的推断好. 实际上.就是"三个臭皮匠顶个诸葛亮&q

写一个自定义进度颜色和圆形转动的ProgressBar(详细介绍)

先上图: 我们得自定义ProgressBar的样式 <span style="white-space:pre"> </span><style name="self_define_ProgressBar" parent="@android:style/Widget.ProgressBar.Horizontal"> //继承了android横向的ProgressBar的样式 <item name="

写一个框架的详细步骤

定位 所谓定位就是回答几个问题,我出于什么目的要写一个框架,我的这个框架是干什么的,有什么特性适用于什么场景,我的这个框架的用户对象是谁,他们会怎么使用,框架由谁维护将来怎么发展等等. 如果你打算写框架,那么肯定心里已经有一个初步的定位,比如它是一个缓存框架.Web MVC框架.IOC框架.ORM/数据访问框架.RPC框架或是一个用于Web开发的全栈式框架. 是 否要重复造轮子?除非是练手项目,一般我们是有了解决不了问题的时候才会考虑不使用既有的成熟的框架而重复造轮子的,这个时候需要列出新框架主

如何使用viewpager与fragment写一个app导航activity

今天我们来看一下如何使用viewpager和fragment组合来写一个app导航activity,这里使用到了android开源控件viewpagerindicator,有兴趣的同学可以去它网站上看看它的介绍. 附上效果截图一张: demo中只有一个activity,是用activity_main.xml来布局,其内容如下: <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:and

linux设备驱动第三篇:写一个简单的字符设备驱动

在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动.本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分配的一些内存. 下面就开始学习如何写一个简单的字符设备驱动.首先我们来分解一下字符设备驱动都有那些结构或者方法组成,也就是说实现一个可以使用的字符设备驱动我们必须做些什么工作. 1.主设备号和次设备号 对于字符设备的访问是通过文件系统中的设备名称进行的.他们通常位于/dev目录下.如下: [plain] vie

写一个ajax程序就是如此简单

写一个ajax程序就是如此简单 ajax介绍: 1:AJAX全称为Asynchronous JavaScript and XML(异步JavaScript和XML),指一种创建交互式网页应用的网页开发技术.     2:基于web标准XHTML+CSS的表示:     3:使用 DOM进行动态显示及交互:     4:使用 XML 和 XSLT 进行数据交换及相关操作:     5:使用 XMLHttpRequest 进行异步数据查询.检索: 程序员应用ajax的途经: 1:.Net下的Ajax