【原】关于AdaBoost的一些再思考

一、Decision Stumps:

Decision Stumps称为单层分类器,主要用作Ensemble Method的组件(弱分类器)。一般只进行一次判定,可以包含两个或者多个叶结点。对于离散数据,可以选取该属性的任意一个数据作为判定的分割点;对于连续数据,可以选择属性的一个阈值做为分割点进行判定(大于该阈值分配到一类,小于该阈值分配到另一类;当然也可以选取多个阈值并由此得到多个叶结点)。

 

二、AdaBoost的理解:

1、基本流程

简单的说,AdaBoost框架就是根据指定的参数,进行轮训练得到个弱分类器及每个弱分类器对应的权重,最后将这些弱分类器的结果进行线性组合得到最终的结果。

 

2、带权分类误差

在进行训练之前,为训练集中的每个样本分配一个权重,使用向量表示。在第轮训练结束后,根据得到的弱分类器的性能计算该分类器对应的权值,并由的在训练集上的分类结果对权重向量进行更新。

分类器的性能度量和该分类器在训练集上的结果,都是通过计算该分类器在训练集上的带权分类误差获取。所谓带权分类误差,是指将待分类的样本包含的权重(此处的权重就是之前为该样本分配的权重),结合在该数据集上的分类误差得到分类器在该数据集上的一个考虑样本权重的分类误差,其定义如下:

其中,表示第个弱分类器的带权分类误差值,表示第次更新后样本的权重,表示使用第个弱分类器对样本的分类结果,表示样本的真实标签,是一个指示函数,其值如下:

通过公式(1.1)和(1.2)可以看出带权分类误差与两方面的因素相关:

1) 分类器在样本上的误差值;

2) 样本集中每个样本的权重;

注意:AdaBoost就是通过该值与弱分类器产生关系。

 

3、带权分类误差再分析

以DS(Decision Stumps)弱分类器为例,对于一个数据集包含多个属性,要在该数据集上学习一个DS,可以使用不同的属性作为分割判断条件。对于同一个属性,也可以选择多个不同的分割点(离散型)/阈值(连续性)作为判断条件。因此,对于一个数据集实质上可以产生很多不同的DS,那么究竟选择哪一个DS作为我们从该数据集上最终学习得到的弱分类器?

很直观的想法,我们可以使用穷举产生所有的DS,然后分别计算每个DS的分类误差,选择具有最小分类误差的DS作为从该数据集上学习到的弱分类器。然而,问题出在我们学习的这个数据集中的所有样本权重(此处可以理解为每个样本的价值、贡献度等)并不相同。我们在考虑选择哪个DS最为最终的弱分类器时不但要考虑该DS的分类错误率,还要考虑每个样本的权重问题,因为将高权重的样本分错造成的后果远比将低权重样本分错更为严重。

考虑公式(1.1)中带权分类误差的定义,该指标有效的将分类器的分类误差和待分类样本的权重结合起来,因此可以作为选择弱分类器时的一个标准使用。

总结起来简单的说,带权分类误差将分类器的分类误差和样本本身的权重进行结合,可以作为模型选择的一个标准使用。

 

4、弱分类器的权重计算

弱分类器对应的权重的计算公式如下:

由公式(1.3)可以看出,分类器的权重与其对应的带权分类误差呈反比关系,即就是带权分类误差越小,该分类器对应的权值越大;反之亦然。

 

5、训练样本的权重更新

训练得到新的弱分类器后需要对样本权值进行更新,更新的公式如下:

公式(1.4)定义了计算弱分类器对应的权值后,对样本的权重更新过程。如果该分类器在该样本上分类正确,则降低该样本的权值;如果分类错误,则提高该样本的权值。公式中前半部分主要用于对整个权值向量进行归一化,以使其和为1。

 

6、参考

维基百科关于AdaBoost算法的介绍:

用 xi 和 yi 表示原始样本集D的样本点和它们的类标(注意,yi的取值只能是+1或-1)。用 Wk(i) 表示第k次迭代时全体样本的权重分布。这样就有如下所示的AdaBoost算法:

1. begin initial D={x1,y1,...,xn,yn},kmax(最大循环次数),Wk(i)=1/n,i=1,...,n

2. k ← 0

3. do k ← k+1

4. 训练使用按照 Wk(i) 采样的 D 的弱学习器 Ck

5. Ek ← 对使用 Wk(i) 的 D 测量的 Ck 的训练误差

6.

7.

8. until k=kmax

9. return Ck和αk,k=1,...,kmax(带权值分类器的总体)

10. end

注意第5行中,当前权重分布必须考虑到分类器 Ck 的误差率。在第7行中, Zk 只是一个归一化系数,使得 Wk(i) 能够代表一个真正的分布,而 hk(xi) 是分量分类器 Ck 给出的对任一样本点 xi 的标记(+1或-1),hk(xi) = yi 时,样本被正确分类。第8行中的迭代停止条件可以被换为判断当前误差率是否小于一个阈值。

最后的总体分类的判决可以使用各个分量分类器加权平均来得到:

这样,最后对分类结果的判定规则是:

时间: 2024-10-09 05:18:42

【原】关于AdaBoost的一些再思考的相关文章

关于网页脚本代码结构的再思考

在很多说法中,总是建议将我们的javascript脚本加载在网页的最后,并用外部文件的形式,然而事实并不是这样,外挂的文件最好不要太多,脚本结构代码本身才是值得我们思考的问题.我们需要重新思考我们撰写的脚本的执行力,并把更优秀的javascript开发思路融入到我们的开发中. 我在读完了几篇关于javascript和jQuery的性能优化的文章之后,才恍然大悟,我以前所做的很多代码结构优化,最终只是让乌徒帮显得臃肿,于是重新设计脚本代码的结构,无论怎么样,乌徒帮现在的网页打开显得更加流畅了. 1

机房收费重构——关于上下机的再思考

有句话叫做no zuo no die,我大概就是这种人吧.why?做机房收费系统的时候,按照一般方法也能实现,但这次做上下机的时候,总感觉这么做对自己来说,没什么提高,然后就停下来,重新想想上下机还能怎么做? 后来,大致采用的思路是这样的:将上下机的读写数据的过程写成两个存储过程,负责读取和更改数据.中间的计算过程写在代码里面:中间判断时间的过程用职责链模式来实现,判断一般用户还是临时用户用策略模式实现.这样,整个上下机的过程就是这样的: 1,用上机的存储过程使学生上机,然后将学生上机信息写入表

一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高?

/** * 一球从100米高度自由落下,每次落地后反跳回原高度的一半:再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高? * */ public class Test2 { public static void main(String[] args) { double num = 100, sum = 0; for (int i = 0; i < 10; i++) { sum += num*2; num /= 2; } sum -= 100; System.out.println(

问题:一球从某高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第n次落地时,共经过多少米?第n次反弹多高?

import java.util.Scanner; //题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半:再落下,求它在第10次落地时,共经过多少米?第10次反弹多高? public class BallTest { public static void main(String[] args) { double firsthight; int n; Scanner in = new Scanner (System.in);//从键盘读取两个数据 System.out.println

56.一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?

#include<iostream> using namespace std; int main() { float sum=0;//注意声明成浮点型 float n=100.0; for(int i=1;i<=10;i++) { sum+=n; n=n*0.5; } cout<<"第十次落下时,经过"<<sum<<"米"<<endl; cout<<"第十次反弹"<

一个球从100米高度自由落下,每次落地后反弹回原高度的一半; * 再落下,求在第几次之后反弹高度小于0.1米, * 并计算在这一次落地时共经过多少米?

package com.db2; /** * 一个球从100米高度自由落下,每次落地后反弹回原高度的一半: * 再落下,求在第几次之后反弹高度小于0.1米, * 并计算在这一次落地时共经过多少米? * * @author denny * */ public class Demo1 { static int count = 0; // 次数 static double sum = 0; // 总高度 public static void main(String[] args) { /* doubl

HDU 5135(再思考)

题意略. 思路:再思考后发现,为了构造出最大的三角形面积和,我们应该尽量让长的棍子相组合,这样构造出的三角形面积和最大,贪心能解. #include<bits/stdc++.h> using namespace std; double store[15]; int n; double cal(double a,double b,double c){ double p = (a + b + c) / 2; return sqrt(p * (p - a) * (p - b) * (p - c));

一球从100米高度自由落下, 每次落地后反跳回原高度的一半; 再落下,求它在第10次落地时, 共经过多少米?第10次反弹多高?

题目:一球从100米高度自由落下, 每次落地后反跳回原高度的一半: 再落下,求它在第10次落地时, 共经过多少米?第10次反弹多高? /* * 思路  * height[] 100 50 25 12.5 6.25 //记录每一次的高度 * total 100+50 50+25 25+12.5 12.5+6.25记录总里程 */ public class 第十题小球落地反弹 { public static void main(String[] args) { /* * 思路 * height[]

GPU计算的十大质疑—GPU计算再思考

http://blog.csdn.NET/babyfacer/article/details/6902985 原文链接:http://www.hpcwire.com/hpcwire/2011-06-09/top_10_objections_to_gpu_computing_reconsidered.html作者:Dr. Vincent Natoli, Stone Ridge Technology (http://www.stoneridgetechnology.com/ )译者:陈晓炜(转载请注