AdaBoost演算法與MATLAB實踐

2021-08-11 01:46:43 字數 4358 閱讀 4021

boosting演算法是指將弱學習器提公升為強學習器,adaboost是其中之一。adaboost是基於「加性模型」,即對基學習器線性組合來最小化損失函式。

對給定訓練樣本用乙個弱分類器進行分類,通過上次分類的準確率,來確定這個分類器及分錯樣本的權值,並且根據更新後的樣本(上一次分錯的樣本能夠有更大的權值),來重新選擇乙個分類器進行分類。

最終,分類的錯誤率得到要求,停止分類。並根據權值把這些分類器組合成乙個強分類器。

擬合函式 h(x

)=∑α

tht(

x)

h(x) = \sum

h(x)=∑

αt​h

t​(x

),權重 αt=

1/2∗

ln(1

−ete

t)

\alpha_t = 1/2*ln(\frac)

αt​=1/

2∗ln

(et​

1−et

​​),其中,e

te_t

et​ 為第 t 個學習器的分類錯誤率。

1.weaklearner()函式

構建乙個弱分類器,這個分類器根據採用樣本的平均值作為閾值,進行分類。

function wl = weaklearner(w, traindata, label)

% input: w - sample weight

% traindata - data to be classified

% label - the class label of traindata

% output: wl - 結構體,儲存弱分類器向量相關資訊

% wl.

[m n] = size(traindata);

% search the best discriminative feature exhaustly

pind = (label == 1); % 正例的索引

nind = (label == -1); % 反例的索引

for ifeature = 1:n

% 以正例和反例在ifeature特徵那一維上的均值作為分類域值

pmean = pind' * traindata(:, ifeature) / sum(pind); % 正例的均值(與traindata的每一列相乘)

nmean = nind' * traindata(:, ifeature) / sum(nind); % 反例的均值

thres(ifeature) = (pmean + nmean) / 2; % 在ifeature那一維特徵上的分類閾值

nres = traindata(:, ifeature) >= thres(ifeature);

pres = traindata(:, ifeature) < thres(ifeature);

nres = -1 * nres;

res = pres + nres;

error(ifeature) = w * ( label ~= res);

end[val, ind] = max(abs(error-0.5))

if error(ind) > 0.5

% 應當將分類器反向判別

error(ind) = 1 - error(ind);

wl.direction = -1;

else

wl.direction = 1;

endwl.ifeature = ind;%wl struct包含direction,ifeature,error,threshold。

wl.error = error(ind);

wl.thres = thres(ind);

2.adaboost()函式

根據weaklearner()函式構造的弱分類器,更新弱分類器權重及訓練的樣本集,組成乙個強分類器,從而得到新的假設序列caboosted。

function caboosted = adaboost( traindata, label, niter )

% training : boosting the weak classifiers

% input:

% traindata - 訓練資料

% label - 類標籤

% niter - 弱分類器個數

pind = find(label == 1);

nind = find(label == -1);

np = length(pind);

nn = length(nind);

% 初始化權重向量,讓正例和反例各自計算權重可以保證每次分類時都考慮正例和反例的貢獻

% 否則如果正例遠遠大於反例,反例w比例太小,數量又少,其作用(貢獻、代價)的不到體現

w(pind) = 1 / (2 * np);

w(nind) = 1 / (2 * nn);

%w = ones(1, (np + nn));

%w = w/ sum(w);

eps = 0.001;

%eps = 0;

% 建立niter個弱分類器分量,組成乙個強分類器

for iit = 1:niter

% 歸一化 w

w = w / sum(w);

% if(mod(iit,10)==0)

% disp([iit,niter]);

% end

wl = weaklearner(w,traindata,label);

caboosted.classifier = wl;

% beta(iit) = wl.error / (1 - wl.error);

% alfa(iit) = log( 1 / (beta(iit) + eps) );

nres = traindata(:, wl.ifeature) >= wl.thres;

pres = traindata(:, wl.ifeature) < wl.thres;

nres = -1 * nres;

res = pres + nres;

if wl.direction == -1

res = -1 * res;

end% w = w .* exp( log(beta(iit) + eps) * ( 1-(res~=label) ) )'; % 更新w ?????

alfa(iit) = (1/2) * log( (1-wl.error) / (wl.error + eps) );

w = w .* exp( -alfa(iit) * (label .* res) )';

caboosted.alfa = alfa(iit);

if wl.error < eps

break;

endend

3.adaboostclassify()函式

將若干個的弱分類器進行近似經驗估計,轉換成強分類器,對data進行分類,存放在classlabel。

function [classlabel, sum] = adaboostclassify( data, caboosted )

% input:

% data - 待分類資料矩陣,每行乙個樣本

% caboosted - cellarray 型別,記錄著每個若分類器的相關資訊

% output:

% classlabel - data的類標號

% sum - 可以作為分類置信度資訊

[m n] = size(data);

sum = zeros(m, 1);

nwl = length(caboosted);

for iwl = 1:nwl

wl = caboosted.classifier;

alfa = caboosted.alfa;

pres = data(:, wl.ifeature) >= wl.thres;

nres = data(:, wl.ifeature) < wl.thres;

nres = -1 * nres;

res = pres + nres;

if wl.direction == -1

res = -1 * res;

endsum = sum + alfa * res;

endclasslabel = ones(m, 1);

ind = find(sum >= 0);

classlabel(ind) = -1;

boosting是一種整合學習,通過「重賦權法」學習特定資料分布,主要降低偏差。

AdaBoost元演算法與提公升樹

1.1 強學習與弱學習 提公升方法的思想是,對於乙個複雜任務,多個專家綜合的判斷所得出的結果要比乙個專家號,即三個臭皮匠賽過諸葛亮的道理。弱學習演算法是指學習的正確率比隨機猜測略好,強學習演算法不僅可以學習,還能得到很高正確率。經學者證明,強可學習和弱可學習是等價的,即同時成立。所以我們的目標是找到...

AdaBoost演算法原理

每個haar特徵對應看乙個弱分類器,但並不是任伺乙個haar特徵都能較好的描述人臉灰度分布的某一特點,如何從大量的haar特徵中挑選出最優的haar特徵並製作成分類器用於人臉檢測,這是adaboost演算法訓練過程所要解決的關鍵問題。paul viola和michael jones於2001年將ad...

AdaBoost演算法詳解

adaboost 演算法介紹 adaboost演算法本身是通過改變資料分布來實現的,它根據每次訓練集之中每個樣本的分類是否正確,以及上次的總體分類的準確率,來修改每個樣本的權值。將修改過權值的新資料集送給下層分類器進行訓練,最後將每次得到的分類器最後融合起來,作為最後的決策分類器。adaboost演...