Adaboost理解筆記(matlab實(shí)現(xiàn))

目前集成學(xué)習(xí)有bagging沪么、boosting算法秘豹,兩者異同可以參考這篇博客
隨機(jī)森林(RandomForest)是一種bagging的方法骤肛;
Adaboost贝奇、GBDT虹菲、XGBoost 都是一種boosting方法。

本文只介紹AdaBoost的基本原理方便自己復(fù)習(xí)掉瞳,并附上兩年前寫的matlab程序毕源。

基本原理

參考:李航的《統(tǒng)計(jì)學(xué)習(xí)方法》
AdaBoost通過加大分類誤差率小的弱分類器的權(quán)重,使其在表決中起的作用較大陕习,減小分類誤差率大的弱分類器的權(quán)重,使其在表決中起較小的作用该镣。

  • 訓(xùn)練數(shù)據(jù)集{(x1,y1),(x1,y2),...,(xn,yn)}
  • 初始化訓(xùn)練樣本的概率權(quán)重分布D1=(D11,D12,...,D1n)冻璃,和為1,初始一般用均勻分布
  • 使用弱分類器對訓(xùn)練數(shù)據(jù)進(jìn)行分類,使得分類錯(cuò)誤的樣本的概率權(quán)重的和最小省艳,e_1 = \sum D_{1j},j代表分類錯(cuò)誤的樣本跋炕,得到弱分類器G1。
  • 計(jì)算分類器G1的系數(shù):
    \alpha_1 = \frac{1}{2} log^{\frac{1-e_1}{e_1}}
  • 更新概率權(quán)重D2
    D_{2i} = D_{1i} *e^{-\alpha_1y_iG_1(x_i)}律适,再歸一化:Z = \sum D_{2i}辐烂, D_{2i} = \frac{D_{2i}}{Z}
  • 再根據(jù)D2按上邊步驟得到弱分類器G2,和系數(shù)\alpha_2
  • 循環(huán)得到系列弱分類器G1,G2,G3,...Gm
  • 線性加權(quán)構(gòu)建強(qiáng)分類器:f(x) = sign(\sum_{k=1}^{m}\alpha_kG_k)

舉例表示

微信圖片_20180727171209.jpg

matlab程序?qū)崿F(xiàn)

adaboost_model.m 模型函數(shù):

%%---------- 《提升算法-多維》:建模專用 -------------用于二分類
%說明:      
%       輸入X=[n*m],Y=[n*1](-1/1二類值);
%       輸出CUT=[p*4],CUT(:,1)為切分點(diǎn)捂贿,CUT(:,2:3)為切分值纠修,CUT(:,4)為權(quán)重系數(shù),CUT(:,5)為變量標(biāo)志位厂僧;
%       ERR為訓(xùn)練誤差精度扣草,ECHO為訓(xùn)練最大步數(shù);
%       使用C_CART函數(shù)進(jìn)行切分颜屠。
%例如:
%       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 

%時(shí)間:2016-07-27

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

function [ CUT ] = adaboost_model( x,y,ERR,ECHO)
%ADABOOST_MODEL Summary of this function goes here
%   Detailed explanation goes here
%%自適應(yīng)提升算法(adaboosting)實(shí)現(xiàn)多維特征進(jìn)行 二分類(-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);%樣本初始權(quán)值汽纤;

%-------   -------
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));%計(jì)算各個(gè)變量分類的最優(yōu)切分點(diǎn)上岗、誤差、對應(yīng)的預(yù)測值  
    end

    min_err=min(err); %最小分類誤差蕴坪,(需要注意err可能為0)
    min_i=find(err==min_err);min_i=min_i(1);%分類誤差最小的變量序號(hào)
    op_cut=cut(min_i);  %最優(yōu)分類閾值
    op_G=G(:,min_i); %分類值
    op_cutv=cut_v(min_i,:);%分類值
    alpha=0.5*log((1-min_err)/min_err); %G的系數(shù)

    CUT=[CUT;op_cut,op_cutv,alpha,min_i];
    
    G0(DI(:,min_i))=op_G;%原始序號(hào)下的預(yù)測值
    
    Fx=alpha*G0+Fx;%決策函數(shù)
    %計(jì)算分類錯(cuò)誤率
    a=Fx>0;
    b=y>0;
    p_err=sum(abs(a-b))/n;


    %---------- 更新權(quá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);%原始序號(hào)下的樣本權(quán)值
    for k=1:m
       D(:,k)=D0(DI(:,k)) ;%各列為列排序后的樣本權(quán)值
    end

    echo=echo+1;
    
end

end

C_cat.m 切分函數(shù):

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);  %最優(yōu)分類閾值
    op_G=G(:,min_i); %分類值
    op_cutv=cut_v(min_i,:);

end

adaboost_pre.m預(yù)測函數(shù):

%%---------- 《提升回歸樹算法》:預(yù)測專用 -------------
%說明: 
%       輸入:測試數(shù)據(jù)X=[n*m],生成樹CUT=[p*5],CUT(:,1)為切分點(diǎn)肴掷,CUT(:,2:3)為切分值,CUT(:,4)為權(quán)重系數(shù)背传,CUT(:,5)為變量標(biāo)志位呆瞻;
%       輸出:預(yù)測Y=[n*1];
%      

%作者:zlw 

%時(shí)間: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;%最大訓(xùn)練誤差
ECHO=100;%最大訓(xùn)練循環(huán)次數(shù)

[ CUT ] = adaboost_model( x,y ,ERR,ECHO);%訓(xùn)練

[ Y  ] = adaboost_pre( x, CUT );%預(yù)測


%計(jì)算分類錯(cuò)誤率
a=Y>0;
b=y>0;
p_err=sum(abs(a-b))/size(x,1);

disp(CUT);
disp(p_err);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市径玖,隨后出現(xiàn)的幾起案子痴脾,更是在濱河造成了極大的恐慌,老刑警劉巖梳星,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赞赖,死亡現(xiàn)場離奇詭異滚朵,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)前域,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門辕近,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人匿垄,你說我怎么就攤上這事移宅。” “怎么了椿疗?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵漏峰,是天一觀的道長。 經(jīng)常有香客問我届榄,道長浅乔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任痒蓬,我火速辦了婚禮童擎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘攻晒。我一直安慰自己顾复,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布鲁捏。 她就那樣靜靜地躺著芯砸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪给梅。 梳的紋絲不亂的頭發(fā)上假丧,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機(jī)與錄音动羽,去河邊找鬼包帚。 笑死,一個(gè)胖子當(dāng)著我的面吹牛运吓,可吹牛的內(nèi)容都是我干的渴邦。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼拘哨,長吁一口氣:“原來是場噩夢啊……” “哼谋梭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起倦青,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤瓮床,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體隘庄,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡踢步,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了峭沦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贾虽。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡逃糟,死狀恐怖吼鱼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情绰咽,我是刑警寧澤菇肃,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站取募,受9級特大地震影響琐谤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜玩敏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一斗忌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧旺聚,春花似錦织阳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至碱璃,卻和暖如春弄痹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嵌器。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工肛真, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人爽航。 一個(gè)月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓蚓让,卻偏偏與公主長得像,于是被迫代替她去往敵國和親岳掐。 傳聞我的和親對象是個(gè)殘疾皇子凭疮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容