本文不定期更新。原创文章,转载请附上链接http://blog.csdn.net/iemyxie/article/details/40423907 谢谢

Adaboost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器)。然后把这些弱分类器集合起来。构成一个更强的终于分类器(强分类器)。Adaboost算法本身是通过改变数据分布来实现的,它依据每次训练集之中每一个样本的分类是否正确,以及上次的整体分类的准确率,来确定每一个样本的权值。

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

算法概述

1、先通过对N个训练样本的学习得到第一个弱分类器;

2、将分错的样本和其它的新数据一起构成一个新的N个的训练样本,通过对这个样本的学习得到第二个弱分类器;

3、将1和2都分错了的样本加上其它的新样本构成还有一个新的N个的训练样本,通过对这个样本的学习得到第三个弱分类器

4、终于经过提升的强分类器。即某个数据被分为哪一类要由各分类器权值决定。

与boosting算法比較

1. 使用加权后选取的训练数据取代随机选取的训练样本,这样将训练的焦点集中在比較难分的训练数据样本上。   

2. 将弱分类器联合起来,使用加权的投票机制取代平均投票机制。

让分类效果好的弱分类器具有较大的权重,而分类效果差的分类器具有较小的权重。

与Boosting算法不同的是,AdaBoost算法不须要预先知道弱学习算法学习正确率的下限即弱分类器的误差,而且最后得到的强分类器的分类精度依赖于全部弱分类器的分类精度。这样能够深入挖掘弱分类器算法的能力。

算法步骤

1. 给定训练样本集S。当中X和Y分别相应于正例样本和负例样本。T为训练的最大循环次数;

2. 初始化样本权重为1/n 。即为训练样本的初始概率分布;   

3. 第一次迭代:(1)训练样本的概率分布相当,训练弱分类器;(2)计算弱分类器的错误率;(3)选取合适阈值。使得误差最小;(4)更新样本权重;   

经T次循环后,得到T个弱分类器。按更新的权重叠加,终于得到的强分类器。

详细过程例如以下:

一.样本

Given: m examples (x1, y1), …, (xm, ym)

     where xiX, yiY={-1, +1}

     xi表示X中第i个元素。

     yi表示与xi相应元素的属性值,+1表示xi属于某个分类,

                                       -1表示xi不属于某个分类

二.初始化训练样本xi的权重D(i) :i=1,……。m;

    (1).若正负样本数目一致,D1(i) = 1/m

    (2).若正负样本数目m+, m-则正样本D1(i) = 1/m+,

负样本D1(i) = 1/m-

实例具体解释

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaWVteXhpZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

图中“+”和“-”表示两种类别。我们用水平或者垂直的直线作为分类器进行分类。

算法開始前默认均匀分布D,共10个样本,故每一个样本权值为0.1.

第一次分类:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaWVteXhpZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

第一次划分有3个点划分错误。依据误差表达式

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaWVteXhpZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt=""> 计算可得e1=(0.1+0.1+0.1)/1.0=0.3

分类器权重:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaWVteXhpZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

然后依据算法把错分点的权值变大。对于正确分类的7个点,权值不变。仍为0.1,对于错分的3个点,权值为:

D1=D0*(1-e1)/e1=0.1*(1-0.3)/0.3=0.2333

第二次分类:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaWVteXhpZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

如图所看到的,有3个"-"分类错误。上轮分类后权值之和为:0.1*7+0.2333*3=1.3990

分类误差:e2=0.1*3/1.3990=0.2144

分类器权重a2=0.6493

错分的3个点权值为:D2=0.1*(1-0.2144)/0.2144=0.3664

第三次分类:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaWVteXhpZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

同上步骤可求得:e3=0.1365 ;a3=0.9223;D3=0.6326

终于的强分类器即为三个弱分类器的叠加,例如以下图所看到的:

每一个区域是属于哪个属性,由这个区域所在分类器的权值综合决定。

比方左下角的区域,属于蓝色分类区的权重为h1 中的0.42和h2 中的0.65,其和为1.07;属于淡红色分类区域的权重为h3 中的0.92;属于淡红色分类区的权重小于属于蓝色分类区的权值。因此左下角属于蓝色分类区。因此能够得到整合的结果如上图所看到的。从结果图中看,即使是简单的分类器。组合起来也能获得非常好的分类效果。

分类器权值调整的原因



由公式能够看到,权值是关于误差的表达式。每次迭代都会提高错分点的权值,当下一次分类器再次错分这些点之后,会提高总体的错误率,这样就导致分类器权值变小。进而导致这个分类器在终于的混合分类器中的权值变小,也就是说,Adaboost算法让正确率高的分类器占总体的权值更高。让正确率低的分类器权值更低,从而提高终于分类器的正确率。

算法优缺点

长处

1)Adaboost是一种有非常高精度的分类器

2)能够使用各种方法构建子分类器,Adaboost算法提供的是框架

3)当使用简单分类器时,计算出的结果是能够理解的。并且弱分类器构造极其简单

4)简单。不用做特征筛选

5)不用操心overfitting(过度拟合)

缺点

1)easy受到噪声干扰,这也是大部分算法的缺点

2)训练时间过长

3)运行效果依赖于弱分类器的选择

SQL实现

#開始迭代
while(@i<=3) do
set @evalue=0,@temp=0;
set @flag1=0,@flag2=0,@flag3=0,@flag4=0;
set @las=concat('d',@i-1);
set @cur=concat('d',@i);
set @a=concat('select hx,hy into @hx,@hy from hea where id = ',@i);
prepare stmt1 from @a;
execute stmt1;
set @aa=concat('update adaset set ',@cur,' = ',@las);
prepare stmt111 from @aa;
execute stmt111;
#1.分类器为垂直x轴直线
if (@hy=0) then
#处理分类1
set @b=concat('select count(class) into @l_1 from adaset where class=1 and x < ',@hx);
prepare stmt2 from @b;
execute stmt2;
set @c=concat('select count(class) into @l_2 from adaset where class=-1 and x < ',@hx);
prepare stmt3 from @c;
execute stmt3;
if(@l_1=0 and @l_2!=0) then
set @clas=concat('update hea set l=-1 where id = ',@i);
prepare stmt28 from @clas;
execute stmt28;
end if;
if(@l_1!=0 and @l_2 =0) then
set @clas=concat('update hea set l=1 where id = ',@i);
prepare stmt29 from @clas;
execute stmt29;
end if;
set @weight=concat('d',@i-1);
if (@l_1 !=0 and @l_2 !=0 and @l_1>@l_2) then #@l_2是错分点
set @d=concat('select sum(',@weight,') into @temp from adaset where class=-1 and x < ',@hx);
prepare stmt4 from @d;
execute stmt4;
set @evalue=@evalue+@temp;
set @flag1=1;
set @clas=concat('update hea set l=1 where id = ',@i);
prepare stmt20 from @clas;
execute stmt20;
end if;
if (@l_1 !=0 and @l_2 !=0 and @l_1<@l_2) then #@l_1是错分点
set @d=concat('select sum(',@weight,') into @temp from adaset where class=1 and x < ',@hx);
prepare stmt5 from @d;
execute stmt5;
set @evalue=@evalue+@temp;
set @flag2=1;
set @clas=concat('update hea set l=-1 where id = ',@i);
prepare stmt21 from @clas;
execute stmt21;
end if;
#总权值&误差
set @h=concat('select sum(',@weight,') into @temp from adaset');
prepare stmt10 from @h;
execute stmt10;
set @evalue = round(@evalue/@temp,4);
set @avalue = round((0.5*ln((1-@evalue)/@evalue)),4);
set @eee=round((1-@evalue)/@evalue,4);
#更新误差e&如果权重a
set @j=concat('update hea set e = ',@evalue,' ,a = ',@avalue,' where id = ',@i);
prepare stmt11 from @j;
execute stmt11;
#更新错分样本的权重
if (@hy=0) then
if (@flag1=1) then
set @k=concat('update adaset set ',@cur,' = ',@las,'*',@eee,' where class=-1 and x < ',@hx);
prepare stmt12 from @k;
execute stmt12;
end if;
if (@flag2=1) then
set @m=concat('update adaset set ',@cur,' = ',@las,'*',@eee,' where class=1 and x < ',@hx);
prepare stmt13 from @m;
execute stmt13;
end if;
if (@flag3=1) then
set @n=concat('update adaset set ',@cur,' = ',@las,'*',@eee,' where class=-1 and x > ',@hx);
prepare stmt14 from @n;
execute stmt14;
end if;
if (@flag4=1) then
set @o=concat('update adaset set ',@cur,' = ',@las,'*',@eee,' where class=1 and x > ',@hx);
prepare stmt15 from @o;
execute stmt15;
end if;
end if;
set @i=@i+1;
end while;

以上是博主近期用SQL实现的Adaboost算法的部分代码。数据库表以后整理一下再贴。

Ubuntu不稳定啊,死机两次了。

。编辑的博客都没了。

。累觉不爱。

。

个人疑问

上文中的缺点提到,Adaboost算法的效果依赖于弱分类器的选择,那么面对巨大的待分类数据时,怎样选择弱分类呢?有没有什么原则。博主依然在探索中。找到答案的话会在这里更新。

推荐资料:由Adaboost算法创始人Freund和Schapire写的关于Adaboost算法的文档,我已经上传。

原创文章。转载请原创文章,转载请附上链接http://blog.csdn.net/iemyxie/article/details/40423907 谢谢

数据挖掘算法学习(八)Adaboost算法的更多相关文章

  1. 集成学习值Adaboost算法原理和代码小结(转载)

    在集成学习原理小结中,我们讲到了集成学习按照个体学习器之间是否存在依赖关系可以分为两类: 第一个是个体学习器之间存在强依赖关系: 另一类是个体学习器之间不存在强依赖关系. 前者的代表算法就是提升(bo ...

  2. 数据挖掘学习笔记--AdaBoost算法(一)

    声明: 这篇笔记是自己对AdaBoost原理的一些理解,如果有错,还望指正,俯谢- 背景: AdaBoost算法,这个算法思路简单,但是论文真是各种晦涩啊-,以下是自己看了A Short Introd ...

  3. 集成学习之Adaboost算法原理小结

    在集成学习原理小结中,我们讲到了集成学习按照个体学习器之间是否存在依赖关系可以分为两类,第一个是个体学习器之间存在强依赖关系,另一类是个体学习器之间不存在强依赖关系.前者的代表算法就是是boostin ...

  4. 集成学习之Adaboost算法原理

    在boosting系列算法中,Adaboost是最著名的算法之一.Adaboost既可以用作分类,也可以用作回归. 1. boosting算法基本原理 集成学习原理中,boosting系列算法的思想:

  5. 算法学习 八皇后问题的递归实现 java版 回溯思想

    1.问题描述 八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行.纵行或 ...

  6. # 机器学习算法总结-第六天(Adaboost算法)

    SKlearn中的Adaboost使用 主要调的参数:第一部分是对我们的Adaboost的框架进行调参, 第二部分是对我们选择的弱分类器进行调参. 使用 Adaboost 进行手写数字识别 导入库,载 ...

  7. 【算法学习】老算法,新姿势,STL——Heap

    “堆”是一个大家很熟悉的数据结构,它可以在\(O(log\;n)\)的时间内维护集合的极值. 这都是老套路了,具体的内部实现我也就不谈了. 我一般来说,都是用queue库中的priority_queu ...

  8. 04-02 AdaBoost算法

    目录 AdaBoost算法 一.AdaBoost算法学习目标 二.AdaBoost算法详解 2.1 Boosting算法回顾 2.2 AdaBoost算法 2.3 AdaBoost算法目标函数优化 三 ...

  9. AdaBoost 算法原理及推导

    AdaBoost(Adaptive Boosting):自适应提升方法. 1.AdaBoost算法介绍 AdaBoost是Boosting方法中最优代表性的提升算法.该方法通过在每轮降低分对样例的权重 ...

  10. Adaboost算法流程及示例

    1. Boosting提升方法(源自统计学习方法) 提升方法是一种常用的统计学习方法,应用十分广泛且有效.在分类问题中,它通过改变训练样本的权重,学习多个分类器,并将这些分类器进行线性组合,提高分类的 ...

随机推荐

  1. UVM基础之---------uvm report 机制分析

    uvm 中的信息报告机制相对来说比较简单,功能上来说主要分为两部分: 第一通过ID对component的信息报告冗余级别进行控制,针对每个冗余级别进行不同的行为控制.这部分工作主要由uvm_repor ...

  2. postgresql遇到的性能问题

    问题SQL scwksmlcls.wk_cls_c , scwklrgcls.wk_lrg_cls_nm , scwkmdlcls.wk_mdl_cls_nm , scwksmlcls.wk_sml_ ...

  3. 浏览器的两种模式quirks mode 和strict mode

    关键字: javascript.quirks mode.strict mode 在看js代码时,有时会看到关于quirks mode(怪异模式)和strict mode(严格格式)的东西,一直也没深究 ...

  4. eclipse 新建 maven 项目 + 消除错误

    安装eclips以及maven自行去了解,这里不讲解 一.新建一个 maven 项目. 二.下一步选择项目架构 三.填写相关信息 group id: 一般都是 com点 项目名 aftriact.id ...

  5. js获取微信版本号的方法

    微信现在几乎已经普遍在使用,但是微信版本一直在更新,不同的版本有不同的功能,于是了解微信的版本号很重要,以便自己及时更新体验新的功能.那么如何用js获取微信版本号呢? 一.判断微信版本号 ? 1 2 ...

  6. (独孤九剑)--MySQL入门

    :[一]概论 (1)什么是 MySQL? 一种关系型开源数据库,定义了存储信息的结构. 在数据库中,存在着一些表.类似 HTML 表格,数据库表含有行.列以及单元. 在分类存储信息时,数据库非常有用. ...

  7. (转)vim编辑器操作命令大全-绝对全

    周六了,熟悉熟悉vim 命令 学习链接: vim命令大全 http://blog.csdn.net/scaleqiao/article/details/45153379 vim命令小技巧 http:/ ...

  8. python3.7实现九九乘法表

    for i in range(1,10): for j in range(1,i+1): print("%d*%d=%d" % (i,j,i*j),end=" " ...

  9. C++ CEF 浏览器中显示 Tooltip(标签中的 title 属性)

    在 Windows 中将 CEF 集成到 C++ 客户端以后,默认是无法显示 tooltip 的,比如图片标签中的 title 属性. 实现的方式其实很简单,按下面的步骤操作就可以: 创建一个文本文件 ...

  10. 电子笔记本的思考(1)(ver0.2)

    章节:电子笔记本的思考(1)   陶哲轩在<解题·成长·快乐——陶哲轩教你学数学>中着重强调,用纸笔来“缓存”思维对于数学解题的重要性: 用选定的符号表达你所知道的信息,并画一个示意图.把 ...