Adaboost算法原理以及matlab代码实现(超详细)
一、AdaBoost簡(jiǎn)介
? ? ??Boosting, 也稱為增強(qiáng)學(xué)習(xí)或提升法,是一種重要的集成學(xué)習(xí)技術(shù), 能夠?qū)㈩A(yù)測(cè)精度僅比隨機(jī)猜度略高的弱學(xué)習(xí)器增強(qiáng)為預(yù)測(cè)精度高的強(qiáng)學(xué)習(xí)器,這在直接構(gòu)造強(qiáng)學(xué)習(xí)器非常困難的情況下,為學(xué)習(xí)算法的設(shè)計(jì)提供了一種有效的新思路和新方法。其中最為成功應(yīng)用的是,Yoav Freund和Robert Schapire在1995年提出的AdaBoost算法。
? ? ? AdaBoost是英文"Adaptive Boosting"(自適應(yīng)增強(qiáng))的縮寫,它的自適應(yīng)在于:前一個(gè)基本分類器被錯(cuò)誤分類的樣本的權(quán)值會(huì)增大,而正確分類的樣本的權(quán)值會(huì)減小,并再次用來(lái)訓(xùn)練下一個(gè)基本分類器。同時(shí),在每一輪迭代中,加入一個(gè)新的弱分類器,直到達(dá)到某個(gè)預(yù)定的足夠小的錯(cuò)誤率或達(dá)到預(yù)先指定的最大迭代次數(shù)才確定最終的強(qiáng)分類器。
Adaboost算法可以簡(jiǎn)述為三個(gè)步驟:
?(1)首先,是初始化訓(xùn)練數(shù)據(jù)的權(quán)值分布D1。假設(shè)有N個(gè)訓(xùn)練樣本數(shù)據(jù),則每一個(gè)訓(xùn)練樣本最開始時(shí),都被賦予相同的權(quán)值:w1=1/N。
?(2)然后,訓(xùn)練弱分類器hi。具體訓(xùn)練過(guò)程中是:如果某個(gè)訓(xùn)練樣本點(diǎn),被弱分類器hi準(zhǔn)確地分類,那么在構(gòu)造下一個(gè)訓(xùn)練集中,它對(duì)應(yīng)的權(quán)值要減小;相反,如果某個(gè)訓(xùn)練樣本點(diǎn)被錯(cuò)誤分類,那么它的權(quán)值就應(yīng)該增大。權(quán)值更新過(guò)的樣本集被用于訓(xùn)練下一個(gè)分類器,整個(gè)訓(xùn)練過(guò)程如此迭代地進(jìn)行下去。
?(3)最后,將各個(gè)訓(xùn)練得到的弱分類器組合成一個(gè)強(qiáng)分類器。各個(gè)弱分類器的訓(xùn)練過(guò)程結(jié)束后,加大分類誤差率小的弱分類器的權(quán)重,使其在最終的分類函數(shù)中起著較大的決定作用,而降低分類誤差率大的弱分類器的權(quán)重,使其在最終的分類函數(shù)中起著較小的決定作用。
? 換而言之,誤差率低的弱分類器在最終分類器中占的權(quán)重較大,否則較小。
二、AdaBoost算法過(guò)程
? ? 給定訓(xùn)練數(shù)據(jù)集:,其中用于表示訓(xùn)練樣本的類別標(biāo)簽,i=1,...,N。Adaboost的目的就是從訓(xùn)練數(shù)據(jù)中學(xué)習(xí)一系列弱分類器或基本分類器,然后將這些弱分類器組合成一個(gè)強(qiáng)分類器。
相關(guān)符號(hào)定義:
?
Adaboost的算法流程如下:
?
綜合上面的推導(dǎo),可得樣本分錯(cuò)與分對(duì)時(shí),其權(quán)值更新的公式為:?
?
三、AdaBoost實(shí)例講解
?例:給定如圖所示的訓(xùn)練樣本,弱分類器采用平行于坐標(biāo)軸的直線,用Adaboost算法的實(shí)現(xiàn)強(qiáng)分類過(guò)程。
?
數(shù)據(jù)分析:
? ?將這10個(gè)樣本作為訓(xùn)練數(shù)據(jù),根據(jù)?X?和Y?的對(duì)應(yīng)關(guān)系,可把這10個(gè)數(shù)據(jù)分為兩類,圖中用“+”表示類別1,用“O”表示類別-1。本例使用水平或者垂直的直線作為分類器,圖中已經(jīng)給出了三個(gè)弱分類器,即:
初始化:
? ?首先需要初始化訓(xùn)練樣本數(shù)據(jù)的權(quán)值分布,每一個(gè)訓(xùn)練樣本最開始時(shí)都被賦予相同的權(quán)值:wi=1/N,這樣訓(xùn)練樣本集的初始權(quán)值分布D1(i):
? ?令每個(gè)權(quán)值w1i?= 1/N?= 0.1,其中,N?= 10,i?= 1,2, ..., 10,然后分別對(duì)于t= 1,2,3, ...等值進(jìn)行迭代(t表示迭代次數(shù),表示第t輪),下表已經(jīng)給出訓(xùn)練樣本的權(quán)值分布情況:
第1次迭代t=1:
??初試的權(quán)值分布D1為1/N(10個(gè)數(shù)據(jù),每個(gè)數(shù)據(jù)的權(quán)值皆初始化為0.1),
D1=[0.1, ?0.1, 0.1, 0.1, 0.1, 0.1,0.1, 0.1, 0.1, 0.1]
? 在權(quán)值分布D1的情況下,取已知的三個(gè)弱分類器h1、h2和h3中誤差率最小的分類器作為第1個(gè)基本分類器H1(x)(三個(gè)弱分類器的誤差率都是0.3,那就取第1個(gè)吧)
在分類器H1(x)=h1情況下,樣本點(diǎn)“5 7 8”被錯(cuò)分,因此基本分類器H1(x)的誤差率為:
可見,被誤分類樣本的權(quán)值之和影響誤差率e,誤差率e影響基本分類器在最終分類器中所占的權(quán)重α
然后,更新訓(xùn)練樣本數(shù)據(jù)的權(quán)值分布,用于下一輪迭代,對(duì)于正確分類的訓(xùn)練樣本“1 2 3 4 6 9 10”(共7個(gè))的權(quán)值更新為:
這樣,第1輪迭代后,最后得到各個(gè)樣本數(shù)據(jù)新的權(quán)值分布:
D2=[1/14,1/14,1/14,1/14,1/6,1/14,1/6,1/6,1/14,1/14]
??由于樣本數(shù)據(jù)“5 7 8”被H1(x)分錯(cuò)了,所以它們的權(quán)值由之前的0.1增大到1/6;反之,其它數(shù)據(jù)皆被分正確,所以它們的權(quán)值皆由之前的0.1減小到1/14,下表給出了權(quán)值分布的變換情況:
可得分類函數(shù):f1(x)=?α1H1(x) = 0.4236H1(x)。此時(shí),組合一個(gè)基本分類器sign(f1(x))作為強(qiáng)分類器在訓(xùn)練數(shù)據(jù)集上有3個(gè)誤分類點(diǎn)(即5 7 8),此時(shí)強(qiáng)分類器的訓(xùn)練錯(cuò)誤為:0.3
?
顯然,H2(x)把樣本“3 4 6”分錯(cuò)了,根據(jù)D2可知它們的權(quán)值為D2(3)=1/14,D2(4)=1/14,?D2(6)=1/14,所以H2(x)在訓(xùn)練數(shù)據(jù)集上的誤差率:
?
這樣,第2輪迭代后,最后得到各個(gè)樣本數(shù)據(jù)新的權(quán)值分布:
D3=[1/22,1/22,1/6,1/6,7/66,1/6,7/66,7/66,1/22,1/22]
? 下表給出了權(quán)值分布的變換情況:
可得分類函數(shù):f2(x)=0.4236H1(x) + 0.6496H2(x)。此時(shí),組合兩個(gè)基本分類器sign(f2(x))作為強(qiáng)分類器在訓(xùn)練數(shù)據(jù)集上有3個(gè)誤分類點(diǎn)(即3 4?6),此時(shí)強(qiáng)分類器的訓(xùn)練錯(cuò)誤為:0.3
因此,取當(dāng)前最小的分類器h3作為第3個(gè)基本分類器H3(x):
這樣,第3輪迭代后,得到各個(gè)樣本數(shù)據(jù)新的權(quán)值分布為:
D4=[1/6,1/6,11/114,11/114,7/114,11/114,7/114,7/114,1/6,1/38]
? 下表給出了權(quán)值分布的變換情況:
可得分類函數(shù):f3(x)=0.4236H1(x) + 0.6496H2(x)+0.9229H3(x)。此時(shí),組合三個(gè)基本分類器sign(f3(x))作為強(qiáng)分類器,在訓(xùn)練數(shù)據(jù)集上有0個(gè)誤分類點(diǎn)。至此,整個(gè)訓(xùn)練過(guò)程結(jié)束。
? 整合所有分類器,可得最終的強(qiáng)分類器為:
?這個(gè)強(qiáng)分類器Hfinal對(duì)訓(xùn)練樣本的錯(cuò)誤率為0!
本例Matlab代碼,如下:
?
? ? 先建立Matlab函數(shù)文件,定義h1,h2和h3三個(gè)弱分類器
function kind = wcH1( X,TH ) %h1弱分類器 X1=X(1); X2=X(2); if X1<TH kind=1; else kind=-1; end end function kind = wcH2( X,TH ) %h2弱分類器 X1=X(1); X2=X(2); if X1<TH kind=1; else kind=-1; end end function kind = wcH3( X,TH ) %h3弱分類器 X1=X(1); X2=X(2); if X2<TH kind=-1; else kind=1; end end %%主程序代碼 clc,clear all; %% 訓(xùn)練樣本數(shù)據(jù) xData=[1 5;2 2;3 1;4 6;6 8;6 5;7 9;8 7;9 8;10 2] %樣本數(shù)據(jù)點(diǎn),對(duì)應(yīng)編號(hào)為1,2,...10 Y=[1 1 -1 -1 1 -1 1 1 -1 -1]'; %對(duì)應(yīng)的樣本類別,用1和-1表示 xNum=1:10; %編號(hào) format rat %% 繪制樣本分布圖 L1=find(Y==1); x=xData(L1,1);y=xData(L1,2); plot(x,y,'b+','LineWidth',3,'MarkerSize',12); hold on; L2=find(Y==-1); x=xData(L2,1);y=xData(L2,2); plot(x,y,'ro','LineWidth',3,'MarkerSize',12); xlabel('X1');ylabel('X2');axis([0 10 0 10]) %% ***********************************初試過(guò)程************************************ H1=zeros(10,1);H2=H1;H3=H1 for i=1:10 X=xData(i,:); H1(i) = wcH1( X,2.5 );%弱分類器h1 H2(i) = wcH2( X,8.5 );%弱分類器h2 H3(i) = wcH3( X,6.5 );%弱分類器h3 end errDataH1=find(H1~=Y);%找到被h1錯(cuò)分的樣本點(diǎn)的序號(hào) errDataH2=find(H2~=Y);%找到被h2錯(cuò)分的樣本點(diǎn)的序號(hào) errDataH3=find(H3~=Y);%找到被h3錯(cuò)分的樣本點(diǎn)的序號(hào) accDataH1=find(H1==Y);%找到被h1正確分的樣本點(diǎn)的序號(hào) accDataH2=find(H2==Y);%找到被h2正確分的樣本點(diǎn)的序號(hào) accDataH3=find(H3==Y);%找到被h3正確分的樣本點(diǎn)的序號(hào) errDataAll=[errDataH1,errDataH2,errDataH3]; accDataAll=[accDataH1,accDataH2,accDataH3]; N=10; D1=zeros(10,1)+1/N % 初始化權(quán)值分布 %% ***********************************第一次迭代*********************************** err1=sum(D1(errDataH1,:));%所有被錯(cuò)分類的樣本點(diǎn)的權(quán)值之和即為誤差率 err2=sum(D1(errDataH2,:));%所有被錯(cuò)分類的樣本點(diǎn)的權(quán)值之和即為誤差率 err3=sum(D1(errDataH3,:));%所有被錯(cuò)分類的樣本點(diǎn)的權(quán)值之和即為誤差率 errAll=[err1,err2,err3]; [minErr,minIndex]=min(errAll); %根據(jù)誤差率e1計(jì)算H1的系數(shù): a1=0.5*log((1-minErr)/minErr) minErrData=errDataAll(:,minIndex); minAccData=accDataAll(:,minIndex); D2=D1; for i=minAccData' D2(i)=D2(i)/(2*(1-minErr)); end for i=minErrData' D2(i)=D2(i)/(2*minErr); end D2 %分類函數(shù) f1=a1.*H1; kindFinal=sign(f1)%此時(shí)強(qiáng)分類器的分類結(jié)果 %% ***********************************第二次迭代*********************************** err1=sum(D2(errDataH1,:));%所有被錯(cuò)分類的樣本點(diǎn)的權(quán)值之和即為誤差率 err2=sum(D2(errDataH2,:));%所有被錯(cuò)分類的樣本點(diǎn)的權(quán)值之和即為誤差率 err3=sum(D2(errDataH3,:));%所有被錯(cuò)分類的樣本點(diǎn)的權(quán)值之和即為誤差率 errAll=[err1,err2,err3]; [minErr,minIndex]=min(errAll); % 根據(jù)誤差率e2計(jì)算H2的系數(shù): a2=0.5*log((1-minErr)/minErr) minErrData=errDataAll(:,minIndex); minAccData=accDataAll(:,minIndex); D3=D2; for i=minAccData' D3(i)=D3(i)/(2*(1-minErr)); end for i=minErrData' D3(i)=D3(i)/(2*minErr); end D3 % 分類函數(shù) f2=a1.*H1+a2*H2; kindFinal=sign(f2)%此時(shí)強(qiáng)分類器的分類結(jié)果 %% ***********************************第三次迭代*********************************** err1=sum(D3(errDataH1,:));%所有被錯(cuò)分類的樣本點(diǎn)的權(quán)值之和即為誤差率 err2=sum(D3(errDataH2,:));%所有被錯(cuò)分類的樣本點(diǎn)的權(quán)值之和即為誤差率 err3=sum(D3(errDataH3,:));%所有被錯(cuò)分類的樣本點(diǎn)的權(quán)值之和即為誤差率 errAll=[err1,err2,err3]; [minErr,minIndex]=min(errAll); % 根據(jù)誤差率e3計(jì)算G3的系數(shù): a3=0.5*log((1-minErr)/minErr) minErrData=errDataAll(:,minIndex); minAccData=accDataAll(:,minIndex); D4=D3; for i=minAccData' D4(i)=D4(i)/(2*(1-minErr)); end for i=minErrData' D4(i)=D4(i)/(2*minErr); end D4 % 分類函數(shù) f3=a1.*H1+a2*H2+a3*H3; kindFinal=sign(f3)%此時(shí)強(qiáng)分類器的分類結(jié)果 %%四、AdaBoost的優(yōu)點(diǎn)和缺點(diǎn)
優(yōu)點(diǎn)
? ? ?(1)Adaboost提供一種框架,在框架內(nèi)可以使用各種方法構(gòu)建子分類器??梢允褂煤?jiǎn)單的弱分類器,不用對(duì)特征進(jìn)行篩選,也不存在過(guò)擬合的現(xiàn)象。
? ? ?(2)Adaboost算法不需要弱分類器的先驗(yàn)知識(shí),最后得到的強(qiáng)分類器的分類精度依賴于所有弱分類器。無(wú)論是應(yīng)用于人造數(shù)據(jù)還是真實(shí)數(shù)據(jù),Adaboost都能顯著的提高學(xué)習(xí)精度。
? ? ?(3)Adaboost算法不需要預(yù)先知道弱分類器的錯(cuò)誤率上限,且最后得到的強(qiáng)分類器的分類精度依賴于所有弱分類器的分類精度,可以深挖分類器的能力。Adaboost可以根據(jù)弱分類器的反饋,自適應(yīng)地調(diào)整假定的錯(cuò)誤率,執(zhí)行的效率高。
? ? ?(4)Adaboost對(duì)同一個(gè)訓(xùn)練樣本集訓(xùn)練不同的弱分類器,按照一定的方法把這些弱分類器集合起來(lái),構(gòu)造一個(gè)分類能力很強(qiáng)的強(qiáng)分類器,即“三個(gè)臭皮匠賽過(guò)一個(gè)諸葛亮”。
缺點(diǎn):
? ? ?在Adaboost訓(xùn)練過(guò)程中,Adaboost會(huì)使得難于分類樣本的權(quán)值呈指數(shù)增長(zhǎng),訓(xùn)練將會(huì)過(guò)于偏向這類困難的樣本,導(dǎo)致Adaboost算法易受噪聲干擾。此外,Adaboost依賴于弱分類器,而弱分類器的訓(xùn)練時(shí)間往往很長(zhǎng)。
?
?
?轉(zhuǎn)載自https://blog.csdn.net/guyuealian/article/details/70995333?
總結(jié)
以上是生活随笔為你收集整理的Adaboost算法原理以及matlab代码实现(超详细)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: matlab gui实例_App Des
- 下一篇: mysql 6.5安装配置,RedHat