關於Adaboost算法

2021-03-02 圖像處理知識庫

Adaboost是一種迭代算法,其核心思想是針對同一個訓練集訓練不同的分類器(弱分類器),然後把這些弱分類器集合起來,構成一個更強的最終分類器(強分類器)。

一.引入

對於Adaboost,可以說是久聞大名,據說在Deep Learning出來之前,SVM和Adaboost是效果最好的 兩個算法,而Adaboost是提升樹(boosting tree),所謂「提升樹」就是把「弱學習算法」提升(boost)為「強學習算法」(語自《統計學習方法》),而其中最具代表性的也就是Adaboost了,貌似Adaboost的結構還和Neural Network有幾分神似,我倒沒有深究過,不知道是不是有什麼乾貨

二.過程

(from PRML)

這就是Adaboost的結構,最後的分類器YM是由數個弱分類器(weak classifier)組合而成的,相當於最後m個弱分類器來投票決定分類,而且每個弱分類器的「話語權」α不一樣。

這裡闡述下算法的具體過程:

1. 初始化所有訓練樣例的權重為1 / N,其中N是樣例數

2. for m=1,……M:

a).訓練弱分類器ym(),使其最小化權重誤差函數(weighted error function):

b)接下來計算該弱分類器的話語權α:

c)更新權重:

其中Zm:

是規範化因子,使所有w的和為1。(這裡公式稍微有點亂)

可以看到整個過程就是和最上面那張圖一樣,前一個分類器改變權重w,同時組成最後的分類器

如果一個訓練樣例 在前一個分類其中被誤分,那麼它的權重會被加重,相應地,被正確分類的樣例的權重會降低

使得下一個分類器 會更在意被誤分的樣例,那麼其中那些α和w的更新是怎麼來的呢?

下面我們從前項分步算法模型的角度來看看Adaboost:

直接將前項分步加法模型具體到adaboost上:

其中 fm是前m個分類器的結合

此時我們要最小化E,同時要考慮α和yl,

但現在我們假設前m-1個α和y都已經fixed了:那麼

其中,可以被看做一個常量,因為它裡面沒有αm和ym:

接下來:

其中Tm表示正分類的集合,Mm表示誤分類的集合,這一步其實就是把上面那個式子拆開,沒什麼複雜的東西。

然後就是找ym了,就是最小化下式的過程,其實就是我們訓練弱分類器

有了ym,α也就可以找了,然後繼續就可以找到更新w的公式了(注意這裡得到的w公式是沒有加規範化因子Z的公式,為了計算方便我們加了個Z進去)。因為這裡算出來直接就是上面過程裡的公式,就不再贅述了,有興趣你可以自己算一算。

   

終於到實現了,本次實現代碼基本基於《統計學習方法》,比如有些符號(弱分類器是G(x),訓練樣例的目標是y而不是上文所述的t)差異

所有的代碼你可以在我寫的toy toolkit裡面找到:DML (你都看到這了,給個star好不好)

              

# coding: UTF-8

from __future__ import division

import numpy as np

import scipy as sp

from weakclassify import WEAKC

from dml.tool import sign

class ADABC:

def __init__(self,X,y,Weaker=WEAKC):

'''

Weaker is a class of weak classifier

It should have a train(self.W) method pass the weight parameter to train

pred(test_set) method which return y formed by 1 or -1

see detail in <統計學習方法>

'''

self.X=np.array(X)

self.y=np.array(y)

self.Weaker=Weaker

self.sums=np.zeros(self.y.shape)

self.W=np.ones((self.X.shape[1],1)).flatten(1)/self.X.shape[1]

self.Q=0

#print self.W

def train(self,M=4):

'''

M is the maximal Weaker classification

'''

self.G={}

self.alpha={}

for i in range(M):

self.G.setdefault(i)

self.alpha.setdefault(i)

for i in range(M):

self.G[i]=self.Weaker(self.X,self.y)

e=self.G[i].train(self.W)

#print self.G[i].t_val,self.G[i].t_b,e

self.alpha[i]=1/2*np.log((1-e)/e)

#print self.alpha[i]

sg=self.G[i].pred(self.X)

Z=self.W*np.exp(-self.alpha[i]*self.y*sg.transpose())

self.W=(Z/Z.sum()).flatten(1)

self.Q=i

#print self.finalclassifer(i),'==========='

if self.finalclassifer(i)==0:

 

print i+1," weak classifier is enough to  make the error to 0"

break

def finalclassifer(self,t):

'''

the 1 to t weak classifer come together

'''

self.sums=self.sums+self.G[t].pred(self.X).flatten(1)*self.alpha[t]

#print self.sums

pre_y=sign(self.sums)

#sums=np.zeros(self.y.shape)

#for i in range(t+1):

# sums=sums+self.G[i].pred(self.X).flatten(1)*self.alpha[i]

# print sums

#pre_y=sign(sums)

t=(pre_y!=self.y).sum()

return t

def pred(self,test_set):

sums=np.zeros(self.y.shape)

for i in range(self.Q+1):

sums=sums+self.G[i].pred(self.X).flatten(1)*self.alpha[i]

#print sums

pre_y=sign(sums)

return pre_y

看train裡面的過程和上文 闡述的一模一樣,finalclassifier()函數是用來判斷是否已經無誤分類的點 的。

當然這裡用的Weak Classifier是比較基礎的Decision Stump,是根據x>v和x<v來分類的,這個代碼稍微煩一點,就不貼到這裡了,在DML裡也有,先試驗下《統計學習方法》裡面那個最簡單的例子:

可以看到也是三個分類器就沒有誤分點了,權值的選擇也是差不多的。

其中後面那個-1 表示大於threshold分為負類,小於分為正類。1則相反。

加一些其它數據試試:

結果:

  

我們把圖畫出來就是:

基本還是正確的,這是四個子分類器的圖,不是最後總分類器的圖啊~~~

(實驗的代碼你也可以在DML裡面找到,你都看到這了,給個star好不好~~~~~)

Reference:

      【1】 《Pattern Recognition And Machine Learning》

      【2】 《統計學習方法》

版權聲明:本文為CSDN博主「Dark_Scope」的原創文章,遵循CC 4.0 by-sa版權協議,轉載請附上原文出處連結及本聲明。

原文連結:https://blog.csdn.net/Dark_Scope/article/details/14103983

相關焦點

  • AdaBoost算法詳解以及代碼實現
    這篇博客主要解釋AdaBoost的算法詳情以及實現。它可以理解為是首個「boosting」方式的集成算法。是一個關注二分類的集成算法。一、算法的總體情況AdaBoost的目標是建立如下的最終的分類器:其中,假設我們輸入的訓練數據總共有nn個,用(x_1,y_y),\cdots,(x_n,y_n)(x1,yy),⋯,(xn,yn)表示,其中xx是一個多為向量,而其對應的y=\{-1,1\}y={−1,1}。1.1、sign函數這裡的sign函數是符號函數。
  • AdaBoost--從原理到實現
    (這段話摘自統計學習那些事)了解了這段有意思的起源,下面來看adaboost算法應該會興趣大增。Adaboost 舉例也許你看了上面的介紹或許還是對adaboost算法雲裡霧裡的,沒關係,百度大牛舉了一個很簡單的例子,你看了就會對這個算法整體上很清晰了。
  • 比較全面的Adaboost算法總結(二)
    Boosting算法基本原理2. Boosting算法的權重理解3. AdaBoost的算法流程4. AdaBoost算法的訓練誤差分析5. AdaBoost算法的解釋6. AdaBoost算法的過擬合問題討論7. AdaBoost算法的正則化8.
  • Adaboost 算法的原理與推導
    是一個加法模型,而Adaboost算法其實是前向分步算法的特例。其實,Adaboost算法就是前向分步算法的一個特例,Adaboost 中,各個基本分類器就相當於加法模型中的基函數,且其損失函數為指數函數。
  • 理解AdaBoost算法
    AdaBoost看上去是一個腦洞大開想出來的算法,你可能會問:為什麼弱分類器的權重計算公式是這樣的?為什麼樣本權重的更新公式是這樣的?事實上,它們是有來歷的。我們可以用廣義加法模型+指數損失函數來推導出AdaBoost的訓練算法。廣義加法模型擬合的目標函數是多個基函數的線性組合:其中為基函數的參數,為基函數的權重係數。
  • 獨家 | 一文讀懂Adaboost
    算法分析通過2.2算法的偽代碼我們可以分析一下Adaboost算法。分析算法的性能(收斂性、複雜度):在此處的分析中,我們忽略基礎模型優化的複雜度,默認基礎模型是非常簡單的模型。前面已經說明了Adaboost算法其最終模型訓練集的誤差是有上確界的,也就是說該算法是確切可以收斂到誤差界的。這一點保證了Adaboost算法的可收斂性。算法的優劣勢:前面就Adaboost算法分析了這麼多,那麼它到底有哪些優勢,又有哪些不足呢?
  • 【白話機器學習】算法理論+實戰之AdaBoost算法
    寫在前面如果想從事數據挖掘或者機器學習的工作,掌握常用的機器學習算法是非常有必要的,常見的機器學習算法:監督學習算法:邏輯回歸,線性回歸,決策樹,樸素貝葉斯,K近鄰,支持向量機,集成算法Adaboost等無監督算法:聚類,降維,關聯規則, PageRank等為了詳細的理解這些原理
  • 通俗講解集成學習算法!
    集成學習是這樣一個過程,按照某種算法生成多個模型,如分類器或者稱為專家,再將這些模型按照某種方法組合在一起來解決某個智能計算問題。集成學習主要用來提高模型(分類,預測,函數估計等)的性能,或者用來降低模型選擇不當的可能性。集成算法本身是一種監督學習算法,因為它可以被訓練然後進行預測,組合的多個模型作為整體代表一個假設(hypothesis)。
  • 機器學習十大經典算法之AdaBoost
    Boosting是一族算法,其主要目標為將弱學習器「提升」為強學習器,大部分Boosting算法都是根據前一個學習器的訓練效果對樣本分布進行調整,再根據新的樣本分布訓練下一個學習器,如此迭代M次,最後將一系列弱學習器組合成一個強學習器。而這些Boosting算法的不同點則主要體現在每輪樣本分布的調整方式上。
  • 機器學習第九篇:詳解Adaboost算法
    在概率近似正確學習的框架中(簡稱PAC),一個概念(類),如果存在一個多項式的學習算法能夠學習它,並且正確率很高,那麼就稱這個概念是強可學習的;一個概念,如果存在一個多項式的學習算法能夠學習它,學習的正確率僅比隨機猜測略好,那麼就稱這個概念是弱可學習的。
  • GBDT算法(詳細版)
    GBDT是一個應用很廣泛的算法,可以用於分類,回歸和特徵選擇,特別是用於和其他算法進行模型組成時,如logistic+GBDT,該算法在很多數據上都有不錯的效果,GBDT還有其他的名字,如MART,GBRT和Tree Net等。
  • 輕鬆看懂機器學習十大常用算法
    通過本篇文章可以對ML的常用算法有個常識性的認識,沒有代碼,沒有複雜的理論推導,就是圖解一下,知道這些算法是什麼,它們是怎麼應用的,例子主要是分類問題。每個算法都看了好幾個視頻,挑出講的最清晰明了有趣的,便於科普。 以後有時間再對單個算法做深入地解析。
  • 【AI】一文突破人工智慧AI十大算法
    通過本篇文章大家可以對人工智慧AI的常用算法形成常識性的認識沒有代碼,沒有複雜的理論推導,僅是圖解,介紹這些算法是什麼以及如何應用(例子主要是分類問題)。以後有機會再對單個算法做深入地解析。今天的算法如下:決策樹隨機森林算法邏輯回歸SVM樸素貝葉斯K最近鄰算法K均值算法Adaboost 算法神經網絡馬爾可夫1.
  • 基於Adaboost算法的人臉檢測分類器!
    主要包括主成分分析與特徵臉、神經網絡方法、支持向量機、隱馬爾可夫模型、Adaboost算法等。本文主要基於統計的方法,通過Adaboost算法和Haar特徵來構建Haar分類器,對人臉和非人臉進行分類。本文目錄    1. 算法要點        1.1. Haar分類器訓練步驟        1.2.
  • 各種機器學習算法的應用場景分別是什麼(比如樸素貝葉斯、決策樹、K 近鄰、SVM、邏輯回歸最大熵模型)?
    連結:https://www.zhihu.com/question/26726794編輯:深度學習與計算機視覺聲明:僅做學術分享,侵刪k近鄰、貝葉斯、決策樹、svm、邏輯斯蒂回歸和最大熵模型、隱馬爾科夫、條件隨機場、adaboost
  • 機器學習算法比較
    假如你在乎精度(accuracy)的話,最好的方法就是通過交叉驗證(cross-validation)對各個算法一個個地進行測試,進行比較,然後調整參數確保每個算法達到最優解,最後選擇最好的一個。但是如果你只是在尋找一個「足夠好」的算法來解決你的問題,或者這裡有些技巧可以參考,下面來分析下各個算法的優缺點,基於算法的優缺點,更易於我們去選擇它。
  • 關於人工智慧領域ID3算法分析
    關於人工智慧領域ID3算法分析 工程師飛燕 發表於 2018-06-27 09:57:00 前言:人工智慧機器學習有關算法內容,人工智慧之機器學習主要有三大類:1)分類;2)回歸;3)聚類。
  • 8種常見機器學習算法比較
    ,文中主要介紹了8種計算機算法及其優缺點,為大家進行算法選擇時提供一點意見。常見算法優缺點1.樸素貝葉斯樸素貝葉斯屬於生成式模型(關於生成模型和判別式模型,主要還是在於是否是要求聯合分布),非常簡單,你只是做了一堆計數。
  • (七)AdaBoost 簡介
    (一)機器學習中的集成學習入門(二)bagging 方法(三)使用Python進行交易的隨機森林算法(四)Python中隨機森林的實現與解釋(五)如何用 Python 從頭開始實現 Bagging 算法(六)如何利用Python從頭開始實現隨機森林算法(七)AdaBoost 簡介
  • 深入理解AdaBoost
    寫在前面如果想從事數據挖掘或者機器學習的工作,掌握常用的機器學習算法是非常有必要的,常見的機器學習算法:監督學習算法:邏輯回歸,線性回歸,決策樹,樸素貝葉斯,K近鄰,支持向量機,集成算法Adaboost等無監督算法:聚類,降維,關聯規則, PageRank等