Adaboost理解笔记(matlab实现)

目前集成学习有bagging、boosting算法,两者异同可以参考这篇博客
随机森林(RandomForest)是一种bagging的方法;
Adaboost、GBDT、XGBoost 都是一种boosting方法。

本文只介绍AdaBoost的基本原理方便自己复习,并附上两年前写的matlab程序。

基本原理

参考:李航的《统计学习方法》
AdaBoost通过加大分类误差率小的弱分类器的权重,使其在表决中起的作用较大,减小分类误差率大的弱分类器的权重,使其在表决中起较小的作用。

  • 训练数据集{(x1,y1),(x1,y2),...,(xn,yn)}
  • 初始化训练样本的概率权重分布D1=(D11,D12,...,D1n),和为1,初始一般用均匀分布
  • 使用弱分类器对训练数据进行分类,使得分类错误的样本的概率权重的和最小,e_1 = \sum D_{1j},j代表分类错误的样本,得到弱分类器G1。
  • 计算分类器G1的系数:
    \alpha_1 = \frac{1}{2} log^{\frac{1-e_1}{e_1}}
  • 更新概率权重D2
    D_{2i} = D_{1i} *e^{-\alpha_1y_iG_1(x_i)},再归一化:Z = \sum D_{2i}D_{2i} = \frac{D_{2i}}{Z}
  • 再根据D2按上边步骤得到弱分类器G2,和系数\alpha_2
  • 循环得到系列弱分类器G1,G2,G3,...Gm
  • 线性加权构建强分类器:f(x) = sign(\sum_{k=1}^{m}\alpha_kG_k)

举例表示

微信图片_20180727171209.jpg

matlab程序实现

adaboost_model.m 模型函数:

%%---------- 《提升算法-多维》:建模专用 -------------用于二分类
%说明:      
%       输入X=[n*m],Y=[n*1](-1/1二类值);
%       输出CUT=[p*4],CUT(:,1)为切分点,CUT(:,2:3)为切分值,CUT(:,4)为权重系数,CUT(:,5)为变量标志位;
%       ERR为训练误差精度,ECHO为训练最大步数;
%       使用C_CART函数进行切分。
%例如:
%       x=[2 4 0 3 1 5 6 7 8 9;2 6 7 22 5 15 4 9 8 1;5 8 12 9 0 11 30 7 6 4;5 4 9 0 0.2 2 7 6 3 1]';
%       y=[1 -1 1 -1 1 -1 1 1 1 -1]';

%作者:zlw 

%时间:2016-07-27

%---------------------------------------------------
%%

function [ CUT ] = adaboost_model( x,y,ERR,ECHO)
%ADABOOST_MODEL Summary of this function goes here
%   Detailed explanation goes here
%%自适应提升算法(adaboosting)实现多维特征进行 二分类(-1,1)问题;

xy=[x,y];

%--------------------------------------------
[n,m]=size(x);

%xy=sortrows(xy,1);%按某列排序;
for i=1:m
    [XY(:,:,i),DI(:,i)]=sortrows(xy,i);%将矩阵按照第i列升序跟着排列
end

D=1/n*ones(n,m);%样本初始权值;

%-------   -------
y=xy(:,end);
echo=1;p_err=1;Fx=0;CUT=[];
while (p_err>ERR && echo<ECHO)

    G0=zeros(n,1);D0=zeros(n,1);
    for i=1:m
        [cut(i),cut_v(i,:),err(i),G(:,i)] = C_cart(XY(:,i,i) ,XY(:,end,i),D(:,i));%计算各个变量分类的最优切分点、误差、对应的预测值  
    end

    min_err=min(err); %最小分类误差,(需要注意err可能为0)
    min_i=find(err==min_err);min_i=min_i(1);%分类误差最小的变量序号
    op_cut=cut(min_i);  %最优分类阈值
    op_G=G(:,min_i); %分类值
    op_cutv=cut_v(min_i,:);%分类值
    alpha=0.5*log((1-min_err)/min_err); %G的系数

    CUT=[CUT;op_cut,op_cutv,alpha,min_i];
    
    G0(DI(:,min_i))=op_G;%原始序号下的预测值
    
    Fx=alpha*G0+Fx;%决策函数
    %计算分类错误率
    a=Fx>0;
    b=y>0;
    p_err=sum(abs(a-b))/n;


    %---------- 更新权值 ----------  
    sumD=0;
    for i=1:n
       D(i,min_i)=D(i,min_i)*exp(-alpha*XY(i,end,min_i)*op_G(i)); 
       sumD=sumD+D(i,min_i);
    end
    D(:,min_i)=D(:,min_i)/sumD;

    D0(DI(:,min_i))=D(:,min_i);%原始序号下的样本权值
    for k=1:m
       D(:,k)=D0(DI(:,k)) ;%各列为列排序后的样本权值
    end

    echo=echo+1;
    
end

end

C_cat.m 切分函数:

function [ op_cut,op_cutv ,min_err,op_G] = C_cart( x,y,D )
%C_CART Summary of this function goes here
%   Detailed explanation goes here
[n,~]=size(x);
class_y=unique(y);
pre0=ones(n,1);

    for i=1:n-1
       cut(i)= (x(i)+x(i+1))/2;%分类阈值

    %----- %得到分类误差   
       pre(1:i)=class_y(1)*pre0(1:i);%归为类1
       pre(i+1:n)=class_y(2)*pre0(i+1:n);%归为类2
       G1=[pre(1:i),pre(i+1:n)]';
       err1=0;
       for j=1:n
          if y(j)~=pre(j)
              err1=err1+D(j);
          end
       end

       pre(1:i)=class_y(2)*pre0(1:i);%归为类2
       pre(i+1:n)=class_y(1)*pre0(i+1:n);%归为类1
       G2=[pre(1:i),pre(i+1:n)]';
       err2=0;
       for j=1:n
          if y(j)~=pre(j)
              err2=err2+D(j);
          end
       end

       if err1<=err2
           err(i)=err1;G(:,i)=G1;cut_v(i,:)=[class_y(1),class_y(2)];
       else
           err(i)=err2;G(:,i)=G2;cut_v(i,:)=[class_y(2),class_y(1)];
       end
    %--------------------------

    end
    
    
    min_err=min(err); %最小分类误差
    min_i=find(err==min_err);min_i=min_i(1);
    op_cut=cut(min_i);  %最优分类阈值
    op_G=G(:,min_i); %分类值
    op_cutv=cut_v(min_i,:);

end

adaboost_pre.m预测函数:

%%---------- 《提升回归树算法》:预测专用 -------------
%说明: 
%       输入:测试数据X=[n*m],生成树CUT=[p*5],CUT(:,1)为切分点,CUT(:,2:3)为切分值,CUT(:,4)为权重系数,CUT(:,5)为变量标志位;
%       输出:预测Y=[n*1];
%      

%作者:zlw 

%时间:2016-07-27
%%
function [ Y  ] = adaboost_pre( x, CUT )
%ADABOOST_PRE Summary of this function goes here
%   Detailed explanation goes here
[n,~]=size(x);

Y=[];
for i=1:n
    y_predict=0;
    
    for j=1:size(CUT,1)
        n_r=CUT(j,end);
        if x(i,n_r)<CUT(j,1)
            y_predict=y_predict+CUT(j,4)*CUT(j,2);
        else
            y_predict=y_predict+CUT(j,4)*CUT(j,3);
        end
        
    end
    

    Y = [Y;y_predict];
end

end

test.m测试文件

clc;clear;close all;

x=[2 4 0 3 1 5 6 7 8 9;2 6 7 22 5 15 4 9 8 1;5 8 12 9 0 11 30 7 6 4;5 4 9 0 0.2 2 7 6 3 1]';
% x=[2 4 0 3 1 5 6 7 8 9]';
y=[1 -1 1 -1 1 -1 1 1 1 -1]';

ERR=0.08;%最大训练误差
ECHO=100;%最大训练循环次数

[ CUT ] = adaboost_model( x,y ,ERR,ECHO);%训练

[ Y  ] = adaboost_pre( x, CUT );%预测


%计算分类错误率
a=Y>0;
b=y>0;
p_err=sum(abs(a-b))/size(x,1);

disp(CUT);
disp(p_err);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容