adaboost完整版解析

合集下载

adaboost案例源码解析

adaboost案例源码解析

adaboost案例源码解析问题:马疝⽓病判断训练数据: 299⾏, 22列,其中最后⼀列为标签,例:2.000000 1.00000038.500000 66.00000028.0000003.0000003.000000 0.0000002.000000 5.0000004.000000 4.0000000.0000000.0000000.000000 3.0000005.000000 45.0000008.400000 0.0000000.000000 -1.0000001.000000 1.00000039.200000 88.00000020.000000 0.0000000.000000 4.0000001.000000 3.0000004.0000002.0000000.000000 0.0000000.000000 4.0000002.000000 50.00000085.000000 2.0000002.000000 -1.0000002.000000 1.00000038.300000 40.00000024.000000 1.0000001.0000003.0000001.000000 3.0000003.000000 1.0000000.000000 0.0000000.000000 1.0000001.000000 33.0000006.700000 0.0000000.000000 1.000000先上代码:#!/usr/bin/python# coding:utf8'''Created on Nov 28, 2010Update on 2017-05-18Adaboost is short for Adaptive Boosting@author: Peter/⽚刻《机器学习实战》更新地址:https:///apachecn/MachineLearning'''from numpy import *# ==fc==def loadSimpData():""" 测试数据Returns:dataArr feature对应的数据集labelArr feature对应的分类标签"""dataArr = array([[1., 2.1], [2., 1.1], [1.3, 1.], [1., 1.], [2., 1.]])labelArr = [1.0, 1.0, -1.0, -1.0, 1.0]return dataArr, labelArr# ==fc==# general function to parse tab -delimited floatsdef loadDataSet(fileName):# get number of fieldsnumerOfFeature = len(open(fileName).readline().split('\t'))dataArr = []labelArr = []fr = open(fileName)for line in fr.readlines():lineArr = []curLine = line.strip().split('\t')for i in range(numerOfFeature-1):lineArr.append(float(curLine[i]))dataArr.append(lineArr)labelArr.append(float(curLine[-1]))return dataArr, labelArr# ==fc==def stumpClassify(dataMat, dimen, threshVal, threshIneq):"""stumpClassify(将数据集,按照feature列的value进⾏⼆分法切分⽐较来赋值分类)Args:dataMat Matrix数据集dimen 特征列threshVal 特征列要⽐较的值Returns:retArray 结果集"""# 默认都是1retArray = ones((shape(dataMat)[0], 1))# dataMat[:, dimen] 表⽰数据集中第dimen列的所有值# threshIneq == 'lt'表⽰修改左边的值,gt表⽰修改右边的值# print '-----', threshIneq, dataMat[:, dimen], threshValif threshIneq == 'lt':retArray[dataMat[:, dimen] <= threshVal] = -1.0else:retArray[dataMat[:, dimen] > threshVal] = -1.0return retArray# ==fc== 找出以某列的某个中间值为threshold进⾏简单分类错误率最好的情况def buildStump(dataArr, labelArr, D):"""buildStump(得到决策树的模型)Args:dataArr 特征标签集合labelArr 分类标签集合D 最初的特征权重值Returns:bestStump 最优的分类器模型minError 错误率bestClasEst 训练后的结果集"""# 转换数据dataMat = mat(dataArr)labelMat = mat(labelArr).T# m⾏ n列m, n = shape(dataMat)# 初始化数据numSteps = 10.0bestStump = {}bestClasEst = mat(zeros((m, 1)))# 初始化的最⼩误差为⽆穷⼤minError = inf# 循环所有的feature列,将列切分成若⼲份,每⼀段以最左边的点作为分类节点for i in range(n):rangeMin = dataMat[:, i].min()rangeMax = dataMat[:, i].max()# print 'rangeMin=%s, rangeMax=%s' % (rangeMin, rangeMax)# 计算每⼀份的元素个数stepSize = (rangeMax-rangeMin)/numSteps# 例如: 4=(10-1)/2 那么 1-4(-1次) 1(0次) 1+1*4(1次) 1+2*4(2次)# 所以:循环 -1/0/1/2for j in range(-1, int(numSteps)+1):# go over less than and greater thanfor inequal in ['lt', 'gt']:# 如果是-1,那么得到rangeMin-stepSize; 如果是numSteps,那么得到rangeMaxthreshVal = (rangeMin + float(j) * stepSize)# 对单层决策树进⾏简单分类,得到预测的分类值predictedVals = stumpClassify(dataMat, i, threshVal, inequal)# print predictedValserrArr = mat(ones((m, 1)))# 正确为0,错误为1errArr[predictedVals == labelMat] = 0# 计算平均每个特征的概率0.2*错误概率的总和为多少,就知道错误率多⾼# 例如:⼀个都没错,那么错误率= 0.2*0=0 , 5个都错,那么错误率= 0.2*5=1,只错3个,那么错误率= 0.2*3=0.6weightedError = D.T*errArr'''dim 表⽰ feature列threshVal 表⽰树的分界值inequal 表⽰计算树左右颠倒的错误率的情况weightedError 表⽰整体结果的错误率bestClasEst 预测的最优结果'''# print "split: dim %d, thresh %.2f, thresh ineqal: %s, the weighted error is %.3f" % (i, threshVal, inequal, weightedError) if weightedError < minError:minError = weightedErrorbestClasEst = predictedVals.copy()bestStump['dim'] = ibestStump['thresh'] = threshValbestStump['ineq'] = inequal# bestStump 表⽰分类器的结果,在第⼏个列上,⽤⼤于/⼩于⽐较,阈值是多少return bestStump, minError, bestClasEst# ==fc==def adaBoostTrainDS(dataArr, labelArr, numIt=40):"""adaBoostTrainDS(adaBoost训练过程放⼤)Args:dataArr 特征标签集合labelArr 分类标签集合numIt 实例数Returns:weakClassArr 弱分类器的集合aggClassEst 预测的分类结果值"""weakClassArr = []m = shape(dataArr)[0]# 初始化 D,设置每个特征的权重值,平均分为m份D = mat(ones((m, 1))/m)aggClassEst = mat(zeros((m, 1)))for i in range(numIt):# 得到决策树的模型bestStump, error, classEst = buildStump(dataArr, labelArr, D)# alpha ⽬的主要是计算每⼀个分类器实例的权重(加和就是分类结果)# 计算每个分类器的 alpha 权重值alpha = float(0.5*log((1.0-error)/max(error, 1e-16)))bestStump['alpha'] = alpha# store Stump Params in ArrayweakClassArr.append(bestStump)# print "alpha=%s, classEst=%s, bestStump=%s, error=%s " % (alpha, classEst.T, bestStump, error)# 分类正确:乘积为1,不会影响结果,-1主要是下⾯求e的-alpha次⽅# 分类错误:乘积为 -1,结果会受影响,所以也乘以 -1expon = multiply(-1*alpha*mat(labelArr).T, classEst)# print '\n'# print 'labelArr=', labelArr# print 'classEst=', classEst.T# print '\n'# print '乘积: ', multiply(mat(labelArr).T, classEst).T# 判断正确的,就乘以-1,否则就乘以1,为什么?书上的公式。

Adaboost算法实例解析

Adaboost算法实例解析

Adaboost算法实例解析Adaboost 算法实例解析1 Adaboost的原理1.1 Adaboost基本介绍AdaBoost,是英⽂"Adaptive Boosting"(⾃适应增强)的缩写,由Yoav Freund和Robert Schapire在1995年提出。

Adaboost是⼀种迭代,其核⼼思想是针对同⼀个训练集训练不同的分类器(弱分类器),然后把这 Adaboost 些弱分类器集合起来,构成⼀个更强的最终分类器(强分类器)。

其算法本⾝是通过改变数据分布来实现的,它根据每次训练集之中每个样本的分类是否正确,以及上次的总体分类的准确率,来确定每个样本的权值。

将修改过权值的新数据集送给下层分类器进⾏训练,最后将每次训练得到的分类器最后融合起来,作为最后的决策分类器。

使⽤adaboost分类器可以排除⼀些不必要的训练数据特徵,并将关键放在关键的训练数据上⾯。

主要解决的问题 ⽬前,对adaBoost算法的研究以及应⽤⼤多集中于分类问题,同时近年也出现了⼀些在回归问题上的应⽤。

就其应⽤adaBoost系列主要解决了: 两类问题、多类单标签问题、多类多标签问题、⼤类单标签问题,回归问题。

它⽤全部的训练样本进⾏学习。

1.2 Adaboost算法介绍算法分析  该算法其实是⼀个简单的弱分类算法提升过程,这个过程通过不断的训练,可以提⾼对数据的分类能 Adaboost⼒。

整个过程如下所⽰: 1. 先通过对N个训练样本的学习得到第⼀个弱分类器; 2. 将分错的样本和其他的新数据⼀起构成⼀个新的N个的训练样本,通过对这个样本的学习得到第⼆个弱分类器; 3. 将1和2都分错了的样本加上其他的新样本构成另⼀个新的N个的训练样本,通过对这个样本的学习得到第三个弱分类器; 4. 最终经过提升的强分类器。

即某个数据被分为哪⼀类要通过, ……的多数表决。

Adaboost的⾃适应在于:前⼀个基本分类器分错的样本会得到加强,加权后的全体样本再次被⽤来训练下⼀个基本分类器。

adaboost完整版

adaboost完整版
i
t ,i

n
j 1
wt , j
2.对每个特征f,训练一个弱分类器 h( x, f ) ;计算 所有特征的弱分类器的加权错误率
f i qi | h( x, f ) yi |
3.(在所有特征中)选取具有最小错误率的最佳弱 分类器 ht ( x ) 。 f min f i qi | h( x, f ) yi | i qi | h( x, ft ) yi |
3、强分类器的公式,权重的选取
一共m个样本,Y={-1,+1},-1代表负样本 错误率: f
q | h ( x, f ) y |
i i i
假设的权重:
1 1 t t ln 2 t
Adaboost 算法分析
对于boosting算法,存在两个问题: 1. 如何调整训练集,使得在训练集上训练的弱分类 器得以进行; 2. 如何将训练得到的各个弱分类器联合起来形成强 分类器。 针对以上两个问题,AdaBoost算法进行了调整: 1. 使用加权后选取的训练数据代替随机选取的训练 样本,这样将训练的焦点集中在比较难分的训练 数据样本上; 2. 将弱分类器联合起来,使用加权的投票机制代替 平均投票机制。让分类效果好的弱分类器具有较 大的权重,而分类效果差的分类器具有较小的权 重。
1 其中 t log 。 t 注:(另一种方法:不用循环,而是用识别率与误 识别率是否达到来进行循环)在每一次循环完之 后,运用5判断已经得到的弱分类器的加权后判 断的识别率与误识别率是否在预定范围内,若在: 停止循环,直接;不在:继续。
强分类器的构成 • 经过 T 次迭代后,获得了T 个最佳弱分类 ) 器 h1 ( x),..., h2 ( x ,可以按照下面的方式组合成一个强 分类器: T 1 T 1 t 1 t ht ( x) t 1 t C ( x) 2 0其他 • 其中 t log 。 t • 那么,这个强分类器对待一幅待检测图像时,相当 于让所有弱分 均投票结果比较得出最终的结果。

AdaBoost装袋提升算法

AdaBoost装袋提升算法

AdaBoost装袋提升算法参开资料:更多挖掘算法:介绍在介绍AdaBoost算法之前,需要了解⼀个类似的算法,装袋算法(bagging),bagging是⼀种提⾼分类准确率的算法,通过给定组合投票的⽅式,获得最优解。

⽐如你⽣病了,去n个医院看了n个医⽣,每个医⽣给你开了药⽅,最后的结果中,哪个药⽅的出现的次数多,那就说明这个药⽅就越有可能性是最由解,这个很好理解。

⽽bagging算法就是这个思想。

算法原理⽽AdaBoost算法的核⼼思想还是基于bagging算法,但是他⼜⼀点点的改进,上⾯的每个医⽣的投票结果都是⼀样的,说明地位平等,如果在这⾥加上⼀个权重,⼤城市的医⽣权重⾼点,⼩县城的医⽣权重低,这样通过最终计算权重和的⽅式,会更加的合理,这就是AdaBoost算法。

AdaBoost算法是⼀种迭代算法,只有最终分类误差率⼩于阈值算法才能停⽌,针对同⼀训练集数据训练不同的分类器,我们称弱分类器,最后按照权重和的形式组合起来,构成⼀个组合分类器,就是⼀个强分类器了。

算法的只要过程:1、对D训练集数据训练处⼀个分类器Ci2、通过分类器Ci对数据进⾏分类,计算此时误差率3、把上步骤中的分错的数据的权重提⾼,分对的权重降低,以此凸显了分错的数据。

为什么这么做呢,后⾯会做出解释。

完整的adaboost算法如下最后的sign函数是符号函数,如果最后的值为正,则分为+1类,否则即使-1类。

我们举个例⼦代⼊上⾯的过程,这样能够更好的理解。

adaboost的实现过程: 图中,“+”和“-”分别表⽰两种类别,在这个过程中,我们使⽤⽔平或者垂直的直线作为分类器,来进⾏分类。

第⼀步: 根据分类的正确率,得到⼀个新的样本分布D2,⼀个⼦分类器h1 其中划圈的样本表⽰被分错的。

在右边的途中,⽐较⼤的“+”表⽰对该样本做了加权。

算法最开始给了⼀个均匀分布 D 。

所以h1 ⾥的每个点的值是0.1。

ok,当划分后,有三个点划分错了,根据算法误差表达式得到误差为分错了的三个点的值之和,所以ɛ1=(0.1+0.1+0.1)=0.3,⽽ɑ1 根据表达式的可以算出来为0.42. 然后就根据算法把分错的点权值变⼤。

人脸检测中AdaBoost算法详解

人脸检测中AdaBoost算法详解

⼈脸检测中AdaBoost算法详解⼈脸检测中的AdaBoost算法,供⼤家参考,具体内容如下第⼀章:引⾔2017.7.31。

英国测试⼈脸识别技术,不需要排队购票就能刷脸进站。

据BBC新闻报道,这项英国政府铁路安全标准委员会资助的新技术,由布⾥斯托机器⼈实验室(Bristol Robotics Laboratory) 负责开发。

这个报道可能意味着我们将来的⽣活⽅式。

虽然⼈脸识别技术已经研究了很多年了,⽐较成熟了,但是还远远不够,我们以后的⽬标是通过识别⾯部表情来获得⼈类⼼理想法。

长期以来,计算机就好像⼀个盲⼈,需要被动地接受由键盘、⽂件输⼊的信息,⽽不能主动从这个世界获取信息并⾃主处理。

⼈们为了让计算机看到这个世界并主动从这个世界寻找信息,发展了机器视觉;为了让计算机⾃主处理和判断所得到的信息,发展了⼈⼯智能科学。

⼈们梦想,终有⼀天,⼈机之间的交流可以像⼈与⼈之间的交流⼀样畅通和友好。

⽽这些技术实现的基础是在⼈脸检测上实现的,下⾯是我通过学习基于 AdaBoost 算法的⼈脸检测,赵楠的论⽂的学习⼼得。

第⼆章:关于Adaptive BoostingAdaBoost 全称为Adaptive Boosting。

Adaptively,即适应地,该⽅法根据弱学习的结果反馈适应地调整假设的错误率,所以Adaboost不需要预先知道假设的错误率下限。

Boosting意思为提升、加强,现在⼀般指将弱学习提升为强学习的⼀类算法。

实质上,AdaBoost算法是通过机器学习,将弱学习提升为强学习的⼀类算法的最典型代表。

第三章:AdaBoost算法检测⼈脸的过程先上⼀张完整的流程图,下⾯我将对着这张图作我的学习分享:1.术语名词解析:弱学习,强学习:随机猜测⼀个是或否的问题,将会有50%的正确率。

如果⼀个假设能够稍微地提⾼猜测正确的概率,那么这个假设就是弱学习算法,得到这个算法的过程称为弱学习。

可以使⽤半⾃动化的⽅法为好⼏个任务构造弱学习算法,构造过程需要数量巨⼤的假设集合,这个假设集合是基于某些简单规则的组合和对样本集的性能评估⽽⽣成的。

adaboost——【人工智能 精品讲义】

adaboost——【人工智能 精品讲义】

。 Rtr
H final
exp
2
T t 1
2 t
记 t, t 0 ,则 Rtr H final 。 e2 2T
证明:
1、对 DT1 进行迭代展开
DT1 i DT i exp
T yihT xi
ZT
D1
i
exp
yi
T
t 1 T
tht
xi
Zt
t 1
D1
i
exp
yi
x
t1
例如在下图中
需要一些线段把红色的球和深蓝色的球分开, 显然然如果仅用一条直线的话,是分不开的。
使用提升算法来进行划分的话,先画出一条错 误率最小的线段如图a,但左下角的深蓝色的球被错 划分到红色区域,因此加重被错误划分的球的权重, 再下一次划分的时候,将更加考虑那些权重大的球, 如图c,最终得到一个准确的划分,如下图所示。也 就是说,在提升算法中,不要一个单个分类器进行 分类,而是用多个分类器来通过一定的组合后进行 划分。这就是AdaBoost算法。
计算弱分类器 ht : X 1,1,该弱分类器在分布 Dt 上的误差为:
t Dt ht xi yi
计算该弱分类器的权重: t
1 2
ln
1
t
t
更新训练样本的分布:Dt1
i
Dt
i expt
Zt
yiht
xi
,其中
Zt
为归
一化常数。
最后的强分类器为:
H
final
x
sign
T
tht
算法介绍(AdaBoost)
AdaBoost算法中不同的训练集是通过调整每 个样本对应的权重来实现的。开始时,每个样本 对应的权重是相同的,即其中n为样本个数,在此 样本分布下训练出一弱分类器。对于分类错误的 样本,加大其对应的权重;而对于分类正确的样 本,降低其权重,这样分错的样本就被突显出来, 从而得到一个新的样本分布。在新的样本分布下, 再次对样本进行训练,得到弱分类器。依次类推, 经过T次循环,得到T个弱分类器,把这T个弱分类 器按一定的权重叠加(boost)起来,得到最终想 要的强分类器。

adaboost分类算法

adaboost分类算法

adaboost分类算法Adaboost(Adaptive Boosting)是一种机器学习中常用的集成学习算法。

它通过迭代训练多个弱分类器来构建一个强分类器,每个弱分类器都专注于被前一个分类器分错的样本,从而提高整体分类的准确率。

本文将详细介绍Adaboost 算法的原理、步骤以及应用场景。

一、Adaboost算法原理Adaboost通过迭代训练多个弱分类器,并根据每个分类器的分类错误率来调整样本的权重,从而构建出一个强分类器。

其基本思想是将若干个分类器进行组合,每个分类器按照一定的权重进行加权求和,最终得到分类结果。

具体来说,Adaboost算法通过以下几个步骤完成分类过程:1. 初始化样本权重:对于给定的训练数据集,给每个样本分配一个初始的权重,初始时可以将每个样本的权重设置为相等。

2. 训练弱分类器:选择一个弱分类器作为基分类器,并根据当前样本的权重进行训练。

训练过程中,会根据分类结果的准确性更新样本权重。

3. 更新样本权重:根据上一步训练得到的弱分类器,计算误差率,并根据误差率调整每个样本的权重。

分类正确的样本权重会减小,分类错误的样本权重会增大。

这样,下一轮迭代时,分类器会更加关注被错误分类的样本。

4. 更新分类器权重:根据误差率计算当前分类器的权重,权重与误差率成负相关,误差率越低,分类器权重越高。

5. 归一化分类器权重:对分类器权重进行归一化处理,使得所有分类器的权重之和为1。

6. 终止条件:根据事先设定的迭代次数或错误率阈值,判断是否满足终止条件。

如果不满足,返回第2步,继续训练新的弱分类器;如果满足,则将所有弱分类器组合成一个强分类器。

二、Adaboost算法步骤详解1. 初始化样本权重在Adaboost算法中,每个样本都有一个对应的权重,初始时可以将每个样本的权重设置为相等。

这样做的目的是保证每个样本在开始的时候都有相同的重要性,不会因为某些样本的权重过大而引起偏差。

2. 训练弱分类器在Adaboost算法中,弱分类器可以选择多种,如决策树、神经网络等。

Adaboost算法详解

Adaboost算法详解

1.2 AdaBoost 算法
输入: 训练数据集 T={(x1,y1),(x2,y2),…,(xN,yN)}, 其中 xi∈X⊆Rn, 表示输入数据, yi∈Y={-1,+1}, 表示类别标签;弱学习算法。 输出:最终分类器 G(x)。 流程: (1) 初始化训练数据的概率分布,刚开始为均匀分布 D1=(w11,w12,…,w1N), 其中 w1i=
对 AdaBoost 算法作如下说明:
(公式 7)
步骤(1) 初始时假设训练数据集具有均匀分布, 即每个训练样本在弱分类器的学习中作用相同。 步骤(2) (c) αm 表示 Gm(x)在最终分类器中的重要性。 由式(公式 2)可知, 当 em ≤1/2 时,意味着误差率越小的基本分类器在最终分类器中的作用越大。 (d) 式(公式 4)可以写成:
其中w1i表示在第m轮迭代开始前训练数据的概率分布或权值分布wmi表示在第i个样本的的训练数据集进行学习任意选一种模型都可以例如朴素贝叶斯决策树svm等并且每一轮迭代都可以用不同的模型得到一个弱分类器1111m1称为一个概率分布
提升方法(boosting)详解
作者博客:@灵魂机器 /soulmachine 最后更新日期:2012-12-11 提升方法(boosting)是一种常用的统计学习方法,应用广泛且有效。在分类问题中,它通过 改变训练样本的权重,学习多个分类器,并将这些分类器进行线性组合,提高分类的性能。 本章首先介绍提升方法的思路和代表性的提升算法 AdaBoost,然后通过训练误差分析探讨 AdaBoost 为什么能够提高学习精度,并且从前向分布加法模型的角度解释 AdaBoost,最后叙述提 升方法更具体的事例——提升术 (boosting tree) 。 AdaBoost 算法是 1995 年由 Freund 和 Schapire 提 出的,提升树是 2000 年由 Friedman 等人提出的。

机器学习笔记之AdaBoost算法详解以及代码实现

机器学习笔记之AdaBoost算法详解以及代码实现

机器学习笔记之AdaBoost算法详解以及代码实现0x00 概述AdaBoost,全称是“Adaptive Boosting”,由Freund和Schapire在1995年⾸次提出,并在1996发布了⼀篇新的论⽂证明其在实际数据集中的效果。

这篇博客主要解释AdaBoost的算法详情以及实现。

它可以理解为是⾸个“boosting”⽅式的集成算法。

是⼀个关注⼆分类的集成算法。

0x01 算法的总体情况AdaBoost的⽬标是建⽴如下的最终的分类器:其中,假设我们输⼊的训练数据总共有nn个,⽤(x_1,y_y),\cdots,(x_n,y_n)(x1,y y),⋯,(x n,y n)表⽰,其中xx是⼀个多为向量,⽽其对应的y=\{-1,1\}y={−1,1}。

1.1 sign函数这⾥的signsign函数是符号函数。

判断实数的正负号。

即如果输⼊是正数,那么输出为1;输⼊为负数,那么输出为-1;如果输⼊是0的话,那么输出为0。

因此,AdaBoost的⽬标是判断\{-1,1\}{−1,1}的⼆分类判别算法。

其函数图像如下所⽰:1.2 弱分类器f(x)模型中的f_m(x)f m(x)是弱分类器。

这⾥假设⼀个AdaBoost是由MM个弱分类器加全求和得到。

每⼀个弱分类器f_m(x)f m(x)都给出⼀个预测结果,然后根据其对应的权重\theta_mθ​m加权求和。

因此,我们可以看到,AdaBoost的⽬标其实就是求出每个弱分类器的模型参数,以及其对应的权重。

0x02 AdaBoost的求解前⾯可以看到AdaBoost的模型本⾝⾮常简单。

那么,如何求解这个模型中弱分类器的权重及其参数呢?其步骤如下:⾸先,根据前⾯所述,有nn个数据,我们初始化每个数据的权重都是⼀样的:接下来,我们对每⼀个弱分类器(1,\cdots,M)(1,⋯,M)都进⾏如下操作:1) 训练⼀个弱分类器,使得其分类误差最⼩,此时计算该分类器的误差计算如下公式:这个公式的含义就是模型的误差等于每⼀个错分的样本权重之和。

AdaBoost简介及训练误差分析

AdaBoost简介及训练误差分析

AdaBoost主要内容: AdaBoost 简介 训练误差分析一、AdaBoost 简介:给定训练集:()()11,,...,,N N x y x y ,其中{}1,1i y ∈-,表示i x 的正确的类别标签,1,...,i N =训练集上样本的初始分布:()11D i N=对1,...,t T =,计算弱分类器{}:1,1t h X →-,该弱分类器在分布t D 上的误差为:()()tt D t i i h x y ε=≠P计算该弱分类器的权重:11ln 2t t t εαε⎛⎫-=⎪⎝⎭更新训练样本的分布:()()()()1exp t t i t i t tD i y h x D i Z α+-=,其中t Z 为归一化常数。

最后的强分类器为:()()1T final t t t H x sign h x α=⎛⎫= ⎪⎝⎭∑二、训练误差分析 记12t t εγ=-,由于弱分类器的错误率总是比随机猜测(随机猜测的分类器的错误率为0.5)低,所以0t γ>,则训练误差为:()21exp 2T tr final t t R H γ=⎛⎫≤- ⎪⎝⎭∑。

记,0t t γγ∀≥>,则()22T tr final R H e γ-≤。

证明:1、对1T D +进行迭代展开()()()()1exp T i T i T T Ty h x D i D i Z α+-=()()111exp Ti t t i t Ttt y h x D i Z α==⎛⎫- ⎪⎝⎭=∑∏令()()1Tt t t f x h x α==∑()()()11exp i i Ttt y f x D i Z=-=∏。

由于1T D +是一个分布, 所以:()111nT i D i +==∑所以()()111exp TNt iit i Z y f x N ===-∏∑。

2、训练误差为()(){}11:Ntr final ifinal i i R H i yH x N==≠∑()11 10Ni final i i if y H x Nelse =≠⎧=⎨⎩∑ ()11 010Ni i i if y f x Nelse =≤⎧=⎨⎩∑ *()()11e x pNiii y f x N=≤-∑1Ttt Z ==∏。

Adaboost算法入门详解_20130309

Adaboost算法入门详解_20130309
不过很长一段时间都没有一个切实可行的办法来实现这个理想。细节决定成败,再好的理论也需要有效的算法来执行。终于功夫不 负有心人, Schapire 在 1996 年提出一个有效的算法真正实现了这个夙愿,它的名字叫 AdaBoost。AdaBoost 把多个不同的决策树用一 种非随机的方式组合起来,表现出惊人的性能!第一,把决策树的准确率大大提高,可以与 SVM 媲美。第二,速度快,且基本不用 调参数。第三,几乎不 Overfitting。我估计当时 Breiman 和 Friedman 肯定高兴坏了,因为眼看着他们提出的 CART 正在被 SVM 比下 去的时候,AdaBoost 让决策树起死回生!Breiman 情不自禁地在他的论文里赞扬 AdaBoost 是最好的现货方法(off-the-shelf,即“拿下 了就可以用”的意思)。
For t=1,……,T:
Find
arg min ∈ ε
||
||
% Where ht is a weak classifier; ht(xi): X->{-1,+1}, 即 ht(xi)表示从 xi 元素至某个分类的映射,+1 表示 xi 属于某个分类, -1 表示 xi 不属于某个分类; % y=max f(t) 代表 y 是 f(t)函数所有值中最大的输出;y=arg max f(t)代表 y 是 f(t)函数产生最大输出时相对应的那个 t;
exp ∗ 1
,若 1 ,若
对于归类正确的 7 个点,其权值保持不变,为 0.1;对于归类错误的三个点,其权值为
0.1 . 0.2333
.
即,分类错误的三个点误差增加为 0.233.如此迭代。 第二步:
5
根据分类的正确率,得到一个新的样本分布 D3,一个子分类器 h2 如上图所示,弱分类器 h2 中有三个“-”符号分类错误,分类错误的权值为 we2=0.1*3=0.3; 上图中十个点的总权值为:wt2=0.1*7+0.233*3=1.3990; 错误率为: we2/wt2=0.3/1.399= 0.2144;

Adaboost 基本简介——【人工智能 精品讲义】

Adaboost 基本简介——【人工智能 精品讲义】

Adaptive Boosting Algorithm目录一、Adaboost(Adaptive Boosting)历史 (2)二、Adaboost算法基本原理 (2)三、AdaBoost算法的优点 (4)四、AdaBoost算法的缺点 (4)五、AdaBoost算法的应用 (4)六、AdaBoost改进 (4)七、总结 (5)1一、Adaboost(Adaptive Boosting)历史Adaboost的前身的Boosting算法。

Boosting是一种提高任意给定学习算法准确度的方法。

它的思想起源于Valiant提出的PAC(Probably Approximately Correct)学习模型。

Valiant和Kearns提出了弱学习和强学习的概念,识别错误率小于1/2,也即准确率仅比随机1猜测略高的学习算法称为弱学习算法;识别准确率很高并能在多项式时间内完成的学习算法称为强学习算法。

同时,Valiant和Kearns首次提出了PAC学习模型中弱学习算法和强学习算法的等价性问题,即任意给定仅比随机猜测略好的弱学习算法,是否可以将其提升为强学习算法?如果二者等价,那么只需找到一个比随机猜测略好的弱学习算法就可以将其提升为强学习算法,而不必寻找很难获得的强学习算法。

1990年, Schapire最先构造出一种多项式级的算法,对该问题做了肯定的证明,这就是最初的Boosting算法。

一年后,Freund提出了一种效率更高的Boosting算法。

但是,这两种算法存在共同的实践上的缺陷,那就是都要求事先知道弱学习算法学习正确率的下限。

1995年, Freund和schapire改进了Boosting算法,提出了AdaBoost(Adaptive Boosting)算法[5],该算法效率和Freund于1991年提出的Boosting算法几乎相同,但不需要任何关于弱学习器的先验知识,因而更容易应用到实际问题当中。

线 性 规 划 算 法 详 解

线 性 规 划 算 法 详 解

【机器学习】AdaBoost算法详解一、Boosting简介Boosting算法是一种通过多次学习来提升算法精度的方法,它采用的是综合的原则使得算法的效率明显改善,是一种将弱分类器提升为强分类器的方法。

通俗点讲,就是“三个臭皮匠赛过诸葛亮”,臭皮匠就好比弱分类器,综合起来就是一个强分类器。

Boosting算法是一种集成学习方案。

何谓集成学习?在理解集成学习之前,我们先介绍传统的学习方法,就是通过单个分类器来做决策,例如朴素贝叶斯分类器,SVM,人工神经网络等。

集成学习方法却是需要多个分类器来投票进行最终的决策。

好比领导开会,说:“赞成的请举手”,每个决策者就好比一个弱分类器进行投票,如果纷纷举手,结果自然没有什么悬念,这对于决策层而言,是最喜欢看到的,直接通过。

说了这么久的弱分类器,到底什么是弱分类器?先说弱学习算法吧。

它通常是对一定分布的训练样本给出的假设(给出假设的准确率仅仅强于随机猜测)。

它的思想起源于Valiant提出的计算学习理论一PAC (Probably Approximately Correct) 学习模型。

在Valiant 的PAC模型中,一个性能仅比随机猜测稍好的弱学习算法是否能被提升为一个具有任意精度的强学习算法呢?这个问题困扰着很多研究机器学习的研究者,而且很长一段时间都没有一个切实可行的办法来实现这个理想。

终于功夫不负有心人,Schapire先是在1990年证明了,如果将多个PAC分类器集成在一起,它将具有PAC强分类器的泛化能力,然后在1996年提出一个有效的算法来验证,它就是叫AdaBoost (AdaptiveBoosting)。

二、AdaBoost原理介绍AdaBoost方法的自适应在于:前一个分类器分错的样本会被用来训练下一个分类器。

AdaBoost方法是一种迭代算法,在每一轮中加入一个新的弱分类器,直到达到某个预定的足够小的错误率。

每一个训练样本都被赋予一个权重,表明它被某个分类器选入训练集的概率。

AdaBoost简介及训练误差分析

AdaBoost简介及训练误差分析

AdaBoost主要内容: AdaBoost 简介 训练误差分析一、AdaBoost 简介:给定训练集:()()11,,...,,N N x y x y ,其中{}1,1i y ∈-,表示i x 的正确的类别标签,1,...,i N =训练集上样本的初始分布:()11D i N=对1,...,t T =,计算弱分类器{}:1,1t h X →-,该弱分类器在分布t D 上的误差为:()()tt D t i i h x y ε=≠P计算该弱分类器的权重:11ln 2t t t εαε⎛⎫-=⎪⎝⎭更新训练样本的分布:()()()()1exp t t i t i t tD i y h x D i Z α+-=,其中t Z 为归一化常数。

最后的强分类器为:()()1T final t t t H x sign h x α=⎛⎫= ⎪⎝⎭∑二、训练误差分析 记12t t εγ=-,由于弱分类器的错误率总是比随机猜测(随机猜测的分类器的错误率为0.5),所以0t γ>,则训练误差为:()21exp 2T tr final t t R H γ=⎛⎫≤- ⎪⎝⎭∑。

记,0t t γγ∀≥>,则()22T tr final R H e γ-≤。

证明:1、对1T D +进行迭代展开()()()()1exp T i T i T T Ty h x D i D i Z α+-=()()111exp Ti t t i t Ttt y h x D i Z α==⎛⎫- ⎪⎝⎭=∑∏令()()1Tt t t f x h x α==∑()()()11exp i i Ttt y f x D i Z=-=∏。

由于1T D +是一个分布, 所以:()111nT i D i +==∑所以()()111exp TNt iit i Z y f x N ===-∏∑。

2、训练误差为()(){}11:Ntr final ifinal i i R H i yH x N==≠∑()11 10Ni final i i if y H x Nelse =≠⎧=⎨⎩∑ ()11 010Ni i i if y f x Nelse =≤⎧=⎨⎩∑ *()()11e x pNiii y f x N=≤-∑1Ttt Z ==∏。

Adaboost算法原理及简单实现

Adaboost算法原理及简单实现

分类误差随基分类器个数变化图
test_error = Columns 1 through 15 0.1037 0.1070 0.1271 Columns 16 through 20 0.0903 0.0936 0.1003
0.0836 0.0870
0.1003 0.0903
0.0970
0.0936
0.1037
Adaboost算法原理及简单实现
目录
1
背景简介
2
Adaboost原理简介
3
实验
背景简介
Bagging 和Boosting都是分类器的集成技术,Bagging 出现在Boosting之前. 这种算法都比较简单,只是将分类器进行简单的组合,实际上,并没有发挥出分 类器组合的威力来.之后在1990年,Schapire提出了Boosting算法,次年Freund 改进Boosting算法,这两种算法存在共同的实践上的缺陷, 那就是都要求事先 知道弱学习算法学习正确率的下限.
实验
数据集:LISSAJOUS FIGURE DATA p42 训练数据个数:700 测试数据个数:300 基分类器:决策树p95-99 基分类器个数为1及20时分类结果
实验
数据集:LISSAJOUS FIGURE DATA p42
训练数据个类器:决策树p95-99
AdaBoost.M1 Discrete AdaBoost:
训练过程
1.初始化:初始赋予每个样本相等的权重

基分类器个数L; 2. For k = 1, 2, …, L Do
• 根据分布 从训练数据集中抽取样本 ; • 将 用作训练数据集建立一个分类器 ; • 计算该分类器的加权训练误差
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ii( x, y)
x' x , y ' y

i( x , y )
其中ii(x,y)为积分图,i(x,y)为原始图像,如下图 所示。x,y表示图像的像素坐标。上式表示对 (x,y)左上角像素求和。
• 有了积分图,矩形特征值就可以通过很少的计算 量得到。任意一个矩形内的像素和可以由积分图 上对应的四点得到。如图6(b):矩形框A、B、C、 D内的像素和分别为A、B、C、D,即1处的积分 值为A,2点处的积分值为A+B,3点处的积分值 为A+C,4点处的积分值为A+B+C+D,如果求D 区域内的像素值的和,则D=4+1-(2+3),其实就 是利用了D的四个顶点处的积分值就可以求得D。 由此可见,矩形特征的特征值的计算,只于此特 征的端点的积分图有关,而与图像的坐标值无关。 所以积分图的引入,大大提高了检测速度。这也 就是Viola方法速度非常快的根本原因。
3、Adaboost算法基本原理
• 强分类器:如果一个学习算法通过一组样本的学 习后,能够达到理想的识别率,则称它为强分类 器。 • 弱分类器:如果一个学习算法的识别率仅好于随 机的猜测,则称其为弱分类器。 通常,针对一个具体的识别问题,我们很难 找到一个理想的强分类器,但是弱分类器一般都 会很多,基于这种现象,Freund和Schapire提出 了Adaboosting算法:通过一定的算法可以将一组 弱分类器提升为一个强分类器。
min(S (T S ), S (T S ))

于是,通过把这个排序的表扫描从头到尾扫描一遍就可以 为弱分类器选择使分类误差最小的阈值(最优阈值),也就是 为这个特征选取了一个最佳弱分类器。对于所有特征,应用以 上寻找阈值的方法,就得到了所有特征对应的弱分类器,组成 一个弱分类器集,作为训练的输入。
Fj 和它前面的一个特征值F j 1之 • 这样,当选取当前元素的特征值 间的数作为阈值时,所得到的弱分类器就在当前元素处把样本 分开——也就是说这个阈值对应的弱分类器将当前元素前的所 有元素分类为人脸(或非人脸),而把当前元素后(含)的所 有元素分类为非人脸(或人脸)。 • 可以认为这个阈值所带来的分类误差为:

选取一个最佳弱分类器就是选择那个对所有训练 样本的分类误差在所有弱分类器中最低的那个弱 分类器(特征)。 • 对于每个特征 f,计算所有训练样本的特征值, 并将其排序。通过扫描一遍排好序的特征值,可 以为这个特征确定一个最优的阈值,从而训练成 一个弱分类器。具体来说,对排好序的表中的每 个元素,计算下面四个值: 1)全部人脸样本的权重的和 T ; 2) 全部非人脸样本的权重的和 T ; 3) 在此元素之前的人脸样本的权重的和 S ; 4) 在此元素之前的非人脸样本的权重的和 S;

( m, n ) ( s ,t )
m x 1 nt 1 n y 1 [ ]* [ ] s t x 1 y 1
m s 1
m,n表示样本图像的宽和高比例,s,t表示haar矩形特 征宽和高。公式表示样本图像逐渐缩小,得到的某一 haar特征的总数 • Adaboost算法通过从大量的haar特征中挑选出最优的 特征,并将其转换成对应的弱分类器进行分类使用, 从而达到对目标进行分类的目的。
• 在基于Adaboost的人脸检测系统中,每个 弱分类器都是对图像一个特征值的判断, 常用的特征是一种基于积分图计算的Haarlike特征。
矩形特征
• 在Viola的方法中,使用矩形特征作为分类的依据, 称为Haar特征,因为它是用一种类似Haar小波的 方法来形成人脸特征的。典型的矩阵特征由2到4 个矩形组成,分别对应于边界、细线/棒或者对角 线特征,见下图。对应的矩形特征的特征值定义 为白色矩形内的像素和减去黑色矩形内的像素和。
• 后来,Lienhart等人提出扩展的Haar-like特征下图 所示,每个特征由2~3个矩形组成,分别检测边 界、细线、中心特征等。
• 在确定了特征形式后,Harr-like特征的数量就取决于训 练样本图像矩阵的大小。当人脸样本图像和非人脸样 本图像的矩阵大小为24×24时(一般人脸检测的训练样 本为24×24大小),原始Harr-like特征库的四种特征的 总数量就为162336个,见下表。
1如何选取特征?---类haar特征
1.1矩形特征
• Viola和Jone将Adaboost应用于人脸检测,在保证 检测率的同时,首次使得人脸检测达到了实时的 速度。 • 为了保证Adaboost分类器的分类能力,其选择的 弱分类器一般都应该尽可能的简单,通常都是一 条简单的规则,对物体的某个特征进行简单判断。
2、弱分类器及其选取
• 一个弱分类器h(x, f , p,q)由一个特征f,阈值q和 指示不等号方向的p 组成:
1 pf ( x) p h( x, f , p, ) 0其他
• 得这个弱分类 器(特征f)对所有训练样本的分类误差最低。
基于类haar特征的 Adaboost算法
主要内容:
训练系统分为“训练部分”和“补充部分”,14为训练部分,5为补充部分。 1、以样本集为输入,在给定的矩形特征原型下, 计算并获得矩形特征集; 2、以特征集为输入,根据给定的弱学习算法, 确定阈值,将特征与弱分类器一一对应,获得弱分 类器集; 3、以弱分类器集为输入,在训练检出率和误判 率限制下,使用A d a B o o s t 算法挑选最优的弱 分类器构成强分类器; 4、以强分类器集为输入,将其组合为级联分类 器; 5、以非人脸图片集为输入,组合强分类器为临 时的级联分类器,筛选并补充非人脸样本。
假设训练或检测窗口大小为W*H个像素,w , h 分别为特征原型的长、 宽,所示四种特征原型对应的w / h 分别为:2/1,1/2,3/1,2/2。
1.2矩形特征的快速算法----积分图
• 利用矩形特征来计算选取人脸的特征有一种非 常快速的算法,这种算法使用了一种间接的图 像表示方法,称之为积分图(如图6(a))。 在一张积分图上,点i(x,y)的积分值ii(x,y)是原图 像上该点的上方和左方所有点的亮度值的和。 即: ' '
相关文档
最新文档