Adaboost算法原理分析和實例+代碼(簡明易懂)

Adaboost算法原理分析和實例+代碼(簡明易懂)

   尊重原創,轉載請註明出處】 http://blog.csdn.net/guyuealian/article/details/70995333
    本人最初瞭解AdaBoost算法着實是花了幾天時間,才明白他的基本原理。也許是自己能力有限吧,很多資料也是看得懵懵懂懂。網上找了一下關於Adaboost算法原理分析,大都是你複製我,我摘抄你,反正我也搞不清誰是原創。有些資料給出的Adaboost實例,要麼是沒有代碼,要麼省略很多步驟,讓初學者很難看懂AdaBoost過程。
    本博客將會詳細介紹AdaBoost算法過程,並給出了一個Adaboost例子的詳細求解過程,當然也給出了Matlab代碼求解過程。礙於太多複雜公式,文章是在電腦Word文檔寫好再複製上博客的,爲了排版好看,有些地方給出了截圖。
     下面給出幾個我認爲不錯的博客資料:

【1】http://blog.csdn.net/v_july_v/article/details/40718799 感謝這位博主給出了 Adaboost 算法的原理與推導,本文章很多地方都參考了他的內容
【2】http://blog.csdn.net/m0_37407756/article/details/67637400 該博客有一個Adaboost 算法的例子,但其過程簡略太多,初學者很難看懂。本文章的Adaboost 算法例子也是與之相對應的,但本人給出了詳細的步驟和分析過程。話說,圖都是我一個一個畫上去,心疼我用了兩天時間!!

一、AdaBoost簡介

      Boosting, 也稱爲增強學習或提升法,是一種重要的集成學習技術, 能夠將預測精度僅比隨機猜度略高的弱學習器增強爲預測精度高的強學習器,這在直接構造強學習器非常困難的情況下,爲學習算法的設計提供了一種有效的新思路和新方法。其中最爲成功應用的是,Yoav Freund和Robert Schapire在1995年提出的AdaBoost算法。
      AdaBoost是英文"Adaptive Boosting"(自適應增強)的縮寫,它的自適應在於:前一個基本分類器被錯誤分類的樣本的權值會增大,而正確分類的樣本的權值會減小,並再次用來訓練下一個基本分類器。同時,在每一輪迭代中,加入一個新的弱分類器,直到達到某個預定的足夠小的錯誤率或達到預先指定的最大迭代次數才確定最終的強分類器。
Adaboost算法可以簡述爲三個步驟:
 (1)首先,是初始化訓練數據的權值分佈D1。假設有N個訓練樣本數據,則每一個訓練樣本最開始時,都被賦予相同的權值:w1=1/N。
 (2)然後,訓練弱分類器hi。具體訓練過程中是:如果某個訓練樣本點,被弱分類器hi準確地分類,那麼在構造下一個訓練集中,它對應的權值要減小;相反,如果某個訓練樣本點被錯誤分類,那麼它的權值就應該增大。權值更新過的樣本集被用於訓練下一個分類器,整個訓練過程如此迭代地進行下去。
 (3)最後,將各個訓練得到的弱分類器組合成一個強分類器。各個弱分類器的訓練過程結束後,加大分類誤差率小的弱分類器的權重,使其在最終的分類函數中起着較大的決定作用,而降低分類誤差率大的弱分類器的權重,使其在最終的分類函數中起着較小的決定作用。
  換而言之,誤差率低的弱分類器在最終分類器中佔的權重較大,否則較小。

二、AdaBoost算法過程

    給定訓練數據集:,其中用於表示訓練樣本的類別標籤i=1,...,NAdaboost的目的就是從訓練數據中學習一系列弱分類器或基本分類器,然後將這些弱分類器組合成一個強分類器。

相關符號定義:

Adaboost的算法流程如下:




相關說明:


綜合上面的推導,可得樣本分錯與分對時,其權值更新的公式爲:


三、AdaBoost實例講解

 例:給定如圖所示的訓練樣本,弱分類器採用平行於座標軸的直線用Adaboost算法的實現強分類過程。


數據分析:

   將這10樣本作爲訓練數據根據 X Y 的對應關係,把這10個數據分爲兩類,圖中“+”表示類別1O表示類別-1。本例使用水平或者垂直的直線作爲分類器,圖中已經給出了三個弱分類器,即


初始化:

   首先需要初始化訓練樣本數據的權值分佈,每一個訓練樣本最開始時都被賦予相同的權值:wi=1/N,這樣訓練樣本集的初始權值分佈D1(i)

   令每個權值w1i = 1/N = 0.1,其中,N = 10i = 1,2, ..., 10,然後分別對於t= 1,2,3, ...等值進行迭代(t表示迭代次數,表示第t輪),下表已經給出訓練樣本的權值分佈情況:

1迭代t=1

  初試的權值分佈D11/N10個數據,每個數據的權值皆初始化爲0.1

D1=[0.1,  0.1, 0.1, 0.1, 0.1, 0.1,0.1, 0.1, 0.1, 0.1]

  在權值分佈D1的情況下,已知的三個弱分類器h1h2h3中誤差率最小的分類器作爲第1個基本分類器H1(x)(三個分類器的誤差率都是0.3那就取第1

    在分類器H1(x)=h1情況下,樣本點5 7 8被錯分,因此基本分類器H1(x)的誤差率爲:


  可見,被誤分類樣本的權值之和影響誤差率e,誤差率e影響基本分類器在最終分類器中所佔的權重α

  然後,更新訓練樣本數據的權值分佈,用於下一輪迭代,對於正確分類訓練樣本“1 2 3 4 6 9 10”共7權值更新爲:


  這樣,第1輪迭代後,最後得到各個樣本數據新的權值分佈:

D2=[1/14,1/14,1/14,1/14,1/6,1/14,1/6,1/6,1/14,1/14]

  由於樣本數據5 7 8H1(x)分錯了,所以它們的權值由之前的0.1增大到1/6反之,其它數據皆被分正確,所以它們的權值皆由之前的0.1減小到1/14,下表給出了權值分佈的變換情況:

    可得分類函數:f1(x)= α1H1(x) = 0.4236H1(x)。此時,組合一個基本分類器sign(f1(x))作爲強分類器在訓練數據集上有3個誤分類點(即5 7 8此時強分類器的訓練錯誤爲:0.3

第二次迭代t=2

  在權值分佈D2的情況下,三個弱分類器h1h2h3中誤差率最小的分類器作爲第2個基本分類器H2(x):
① 當取弱分類器h1=X1=2.5時,此時被錯分的樣本點爲“5 7 8”:
誤差率e=1/6+1/6+1/6=3/6=1/2② 當取弱分類器h2=X1=8.5時,此時被錯分的樣本點爲“3 4 6”:
誤差率e=1/14+1/14+1/14=3/14③ 當取弱分類器h3=X2=6.5時,此時被錯分的樣本點爲“1 2 9”:
誤差率e=1/14+1/14+1/14=3/14   因此,取當前最小的分類器h2作爲第2個基本分類器H2(x)
                                                          


    顯然H2(x)把樣本3 4 6分錯了,根據D2可知它們的權值爲D2(3)=1/14,D2(4)=1/14, D2(6)=1/14,所以H2(x)在訓練數據集上的誤差率:



  這樣,第2輪迭代後,最後得到各個樣本數據新的權值分佈:

D3=[1/22,1/22,1/6,1/6,7/66,1/6,7/66,7/66,1/22,1/22]

  下表給出了權值分佈的變換情況:


   可得分類函數:f2(x)=0.4236H1(x) + 0.6496H2(x)。此時,組合兩個基本分類器sign(f2(x))作爲強分類器在訓練數據集上有3個誤分類點(即3 4 6此時強分類器的訓練錯誤爲:0.3

第三次迭代t=3:

  在權值分佈D3的情況下,三個弱分類器h1h2h3中誤差率最小的分類器作爲第3個基本分類器H3(x):
① 當取弱分類器h1=X1=2.5時,此時被錯分的樣本點爲“5 7 8”:
誤差率e=7/66+7/66+7/66=7/22② 當取弱分類器h2=X1=8.5時,此時被錯分的樣本點爲“3 4 6”:
誤差率e=1/6+1/6+1/6=1/2=0.5③ 當取弱分類器h3=X2=6.5時,此時被錯分的樣本點爲“1 2 9”:
誤差率e=1/22+1/22+1/22=3/22


   因此,取當前最小的分類器h3作爲第3個基本分類器H3(x)


  這樣,第3輪迭代後,得到各個樣本數據新的權值分佈

D4=[1/6,1/6,11/114,11/114,7/114,11/114,7/114,7/114,1/6,1/38]

  下表給出了權值分佈的變換情況:


    可得分類函數:f3(x)=0.4236H1(x) + 0.6496H2(x)+0.9229H3(x)。此時,組合三個基本分類器sign(f3(x))作爲強分類器,在訓練數據集上有0個誤分類點。至此,整個訓練過程結束。

  整合所有分類器,可得最終的強分類器爲

     這個強分類器Hfinal對訓練樣本的錯誤率爲0!

    本例Matlab代碼,如下:

    先建立Matlab函數文件,定義h1,h2和h3三個弱分類器

[javascript] view plain copy
  1. function kind = wcH1( X,TH )  
  2. %h1弱分類器  
  3. X1=X(1);  
  4. X2=X(2);  
  5. if X1<TH  
  6.     kind=1;  
  7. else  
  8.     kind=-1;  
  9. end  
  10. end  
[javascript] view plain copy
  1. function kind = wcH2( X,TH )  
  2. %h2弱分類器  
  3. X1=X(1);  
  4. X2=X(2);  
  5. if X1<TH  
  6.     kind=1;  
  7. else  
  8.     kind=-1;  
  9. end  
  10. end  
[javascript] view plain copy
  1. function kind = wcH3( X,TH )  
  2. %h3弱分類器  
  3. X1=X(1);  
  4. X2=X(2);  
  5. if X2<TH  
  6.     kind=-1;  
  7. else  
  8.     kind=1;  
  9. end  
  10. end  

   主程序Matlab代碼:

[javascript] view plain copy
  1. clc,clear all;  
  2. %% 訓練樣本數據  
  3.  xData=[1 5;2 2;3 1;4 6;6 8;6 5;7 9;8 7;9 8;10 2] %樣本數據點,對應編號爲1,2,...10  
  4.  Y=[1 1 -1 -1 1 -1 1 1 -1 -1]';                             %對應的樣本類別,用1和-1表示  
  5.  xNum=1:10;                                                      %編號  
  6.  format rat  
  7.  %% 繪製樣本分佈圖  
  8.  L1=find(Y==1);  
  9.  x=xData(L1,1);y=xData(L1,2);  
  10. plot(x,y,'b+','LineWidth',3,'MarkerSize',12);  
  11. hold on;  
  12.  L2=find(Y==-1);  
  13. x=xData(L2,1);y=xData(L2,2);  
  14. plot(x,y,'ro','LineWidth',3,'MarkerSize',12);  
  15. xlabel('X1');ylabel('X2');axis([0 10 0 10])  
  16. %% ***********************************初試過程************************************  
  17. H1=zeros(10,1);H2=H1;H3=H1  
  18. for i=1:10  
  19.     X=xData(i,:);  
  20.     H1(i) = wcH1( X,2.5 );%弱分類器h1  
  21.     H2(i) = wcH2( X,8.5 );%弱分類器h2  
  22.     H3(i) = wcH3( X,6.5 );%弱分類器h3  
  23. end  
  24. errDataH1=find(H1~=Y);%找到被h1錯分的樣本點的序號  
  25. errDataH2=find(H2~=Y);%找到被h2錯分的樣本點的序號  
  26. errDataH3=find(H3~=Y);%找到被h3錯分的樣本點的序號  
  27. accDataH1=find(H1==Y);%找到被h1正確分的樣本點的序號  
  28. accDataH2=find(H2==Y);%找到被h2正確分的樣本點的序號  
  29. accDataH3=find(H3==Y);%找到被h3正確分的樣本點的序號  
  30. errDataAll=[errDataH1,errDataH2,errDataH3];  
  31. accDataAll=[accDataH1,accDataH2,accDataH3];  
  32.   
  33. N=10;  
  34. D1=zeros(10,1)+1/N       % 初始化權值分佈  
  35. %% ***********************************第一次迭代***********************************  
  36. err1=sum(D1(errDataH1,:));%所有被錯分類的樣本點的權值之和即爲誤差率  
  37. err2=sum(D1(errDataH2,:));%所有被錯分類的樣本點的權值之和即爲誤差率  
  38. err3=sum(D1(errDataH3,:));%所有被錯分類的樣本點的權值之和即爲誤差率  
  39. errAll=[err1,err2,err3];  
  40. [minErr,minIndex]=min(errAll);  
  41. %根據誤差率e1計算H1的係數:  
  42. a1=0.5*log((1-minErr)/minErr)  
  43. minErrData=errDataAll(:,minIndex);  
  44. minAccData=accDataAll(:,minIndex);  
  45. D2=D1;  
  46. for i=minAccData'  
  47.     D2(i)=D2(i)/(2*(1-minErr));  
  48. end  
  49. for i=minErrData'  
  50.      D2(i)=D2(i)/(2*minErr);  
  51. end  
  52. D2  
  53. %分類函數  
  54. f1=a1.*H1;  
  55. kindFinal=sign(f1)%此時強分類器的分類結果  
  56.   
  57. %% ***********************************第二次迭代***********************************  
  58. err1=sum(D2(errDataH1,:));%所有被錯分類的樣本點的權值之和即爲誤差率  
  59. err2=sum(D2(errDataH2,:));%所有被錯分類的樣本點的權值之和即爲誤差率  
  60. err3=sum(D2(errDataH3,:));%所有被錯分類的樣本點的權值之和即爲誤差率  
  61. errAll=[err1,err2,err3];  
  62. [minErr,minIndex]=min(errAll);  
  63. % 根據誤差率e2計算H2的係數:  
  64. a2=0.5*log((1-minErr)/minErr)  
  65. minErrData=errDataAll(:,minIndex);  
  66. minAccData=accDataAll(:,minIndex);  
  67. D3=D2;  
  68. for i=minAccData'  
  69.     D3(i)=D3(i)/(2*(1-minErr));  
  70. end  
  71. for i=minErrData'  
  72.      D3(i)=D3(i)/(2*minErr);  
  73. end  
  74. D3  
  75. % 分類函數  
  76. f2=a1.*H1+a2*H2;  
  77. kindFinal=sign(f2)%此時強分類器的分類結果  
  78.   
  79. %% ***********************************第三次迭代***********************************  
  80. err1=sum(D3(errDataH1,:));%所有被錯分類的樣本點的權值之和即爲誤差率  
  81. err2=sum(D3(errDataH2,:));%所有被錯分類的樣本點的權值之和即爲誤差率  
  82. err3=sum(D3(errDataH3,:));%所有被錯分類的樣本點的權值之和即爲誤差率  
  83. errAll=[err1,err2,err3];  
  84. [minErr,minIndex]=min(errAll);  
  85. % 根據誤差率e3計算G3的係數:  
  86. a3=0.5*log((1-minErr)/minErr)  
  87. minErrData=errDataAll(:,minIndex);  
  88. minAccData=accDataAll(:,minIndex);  
  89. D4=D3;  
  90. for i=minAccData'  
  91.     D4(i)=D4(i)/(2*(1-minErr));  
  92. end  
  93. for i=minErrData'  
  94.      D4(i)=D4(i)/(2*minErr);  
  95. end  
  96. D4  
  97. % 分類函數  
  98. f3=a1.*H1+a2*H2+a3*H3;  
  99. kindFinal=sign(f3)%此時強分類器的分類結果  
  100. %%  

    Adaboost算法的某些特性是非常好的,這裏主要介紹Adaboost的兩個特性。(1)是訓練的錯誤率上界,隨着迭代次數的增加,會逐漸下降;(2)Adaboost算法即使訓練次數很多,也不會出現過擬合的問題。關於這兩方面的研究和分析,我建議各大網友,還是看看大神的博客:http://blog.csdn.net/v_july_v/article/details/40718799

四、AdaBoost的優點和缺點

優點

     (1)Adaboost提供一種框架,在框架內可以使用各種方法構建子分類器。可以使用簡單的弱分類器,不用對特徵進行篩選,也不存在過擬合的現象

     (2)Adaboost算法不需要弱分類器的先驗知識,最後得到的強分類器的分類精度依賴於所有弱分類器。無論是應用於人造數據還是真實數據,Adaboost都能顯著的提高學習精度。

     (3)Adaboost算法不需要預先知道弱分類器的錯誤率上限,且最後得到的強分類器的分類精度依賴於所有弱分類器的分類精度,可以深挖分類器的能力。Adaboost可以根據弱分類器的反饋,自適應地調整假定的錯誤率,執行的效率高。

     (4)Adaboost對同一個訓練樣本集訓練不同的弱分類器,按照一定的方法把這些弱分類器集合起來,構造一個分類能力很強的強分類器,即“三個臭皮匠賽過一個諸葛亮”。

缺點:

     在Adaboost訓練過程中,Adaboost會使得難於分類樣本的權值呈指數增長,訓練將會過於偏向這類困難的樣本,導致Adaboost算法易受噪聲干擾。此外,Adaboost依賴於弱分類器,而弱分類器的訓練時間往往很長。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章