機器學習(machine learning)之AdaBoost算法

轉自:http://blog.csdn.net/haidao2009/article/details/7514787? ?淺談 Adaboost 算法

? ? ? ? ?機器學習是利用一些方法來使機器實現人的學習行為,以便獲取新的知識或技能,重新組織已有的知識結構使之不斷改善自身的性能。

? ? ? ? ?AdaBoost全名“adaptive Boost”

? ? ? ?

一 Boosting 算法的起源

boost 算法系列的起源來自于PAC Learnability(PAC 可學習性)。這套理論主要研究的是什么時候一個問題是可被學習的,當然也會探討針對可學習的問題的具體的學習算法。這套理論是由Valiant提出來的,也因此(還有其他貢獻哈)他獲得了2010年的圖靈獎。這里也貼出Valiant的頭像,表示下俺等菜鳥的膜拜之情。哈哈哈



PAC 定義了學習算法的強弱

? 弱學習算法---識別錯誤率小于1/2(即準確率僅比隨機猜測略高的學習算法)

? 強學習算法---識別準確率很高并能在多項式時間內完成的學習算法


同時 ,Valiant和 Kearns首次提出了 PAC學習模型中弱學習算法和強學習算法的等價性問題,即任意給定僅比隨機猜測略好的弱學習算法 ,是否可以將其提升為強學習算法 ? 如果二者等價 ,那么只需找到一個比隨機猜測略好的弱學習算法就可以將其提升為強學習算法 ,而不必尋找很難獲得的強學習算法。 也就是這種猜測,讓無數牛人去設計算法來驗證PAC理論的正確性。

不過很長一段時間都沒有一個切實可行的辦法來實現這個理想。細節決定成敗,再好的理論也需要有效的算法來執行。終于功夫不負有心人, Schapire在1996年提出一個有效的算法真正實現了這個夙愿,它的名字叫AdaBoost。AdaBoost把多個不同的決策樹用一種非隨機的方式組合起來,表現出驚人的性能!第一,把決策樹的準確率大大提高,可以與SVM媲美。第二,速度快,且基本不用調參數。第三,幾乎不Overfitting。我估計當時Breiman和Friedman肯定高興壞了,因為眼看著他們提出的CART正在被SVM比下去的時候,AdaBoost讓決策樹起死回生!Breiman情不自禁地在他的論文里贊揚AdaBoost是最好的現貨方法(off-the-shelf,即“拿下了就可以用”的意思)。(這段話摘自統計學習那些事)


了解了這段有意思的起源,下面來看adaboost算法應該會興趣大增。

二 Boosting算法的發展歷史(摘自http://stblog.baidu-tech.com/?p=19

Boosting算法是一種把若干個分類器整合為一個分類器的方法,在boosting算法產生之前,還出現過兩種比較重要的將多個分類器整合 為一個分類器的方法,即boostrapping方法和bagging方法。我們先簡要介紹一下bootstrapping方法和bagging方法。

  1)bootstrapping方法的主要過程

  主要步驟:

  i)重復地從一個樣本集合D中采樣n個樣本

  ii)針對每次采樣的子樣本集,進行統計學習,獲得假設Hi

  iii)將若干個假設進行組合,形成最終的假設Hfinal

  iv)將最終的假設用于具體的分類任務

  2)bagging方法的主要過程 -----bagging可以有多種抽取方法

  主要思路:

  i)訓練分類器

  從整體樣本集合中,抽樣n*?<?N個樣本 針對抽樣的集合訓練分類器Ci

  ii)分類器進行投票,最終的結果是分類器投票的優勝結果

  但是,上述這兩種方法,都只是將分類器進行簡單的組合,實際上,并沒有發揮出分類器組合的威力來。直到1989年,Yoav Freund與 Robert Schapire提出了一種可行的將弱分類器組合為強分類器的方法。并由此而獲得了2003年的哥德爾獎(Godel price)。

  Schapire還提出了一種早期的boosting算法,其主要過程如下:

  i)從樣本整體集合D中,不放回的隨機抽樣n1?<?n個樣本,得到集合?D1

  訓練弱分類器C1

  ii)從樣本整體集合D中,抽取?n2?<?n個樣本,其中合并進一半被C1?分類錯誤的樣本。得到樣本集合D2

  訓練弱分類器C2

  iii)抽取D樣本集合中,C1?和?C2?分類不一致樣本,組成D3

  訓練弱分類器C3

  iv)用三個分類器做投票,得到最后分類結果

  到了1995年,Freund and schapire提出了現在的adaboost算法,其主要框架可以描述為:

  i)循環迭代多次

  更新樣本分布

  尋找當前分布下的最優弱分類器

  計算弱分類器誤差率

  ii)聚合多次訓練的弱分類器

三 Adaboost 算法

? AdaBoost 是一種迭代算法,其核心思想是針對同一個訓練集訓練不同的分類器,即弱分類器,然后把這些弱分類器集合起來,構造一個更強的最終分類器。(很多博客里說的三個臭皮匠賽過諸葛亮)

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

完整的adaboost算法如下

簡單來說,Adaboost有很多優點:

  1)adaboost是一種有很高精度的分類器

  2)可以使用各種方法構建子分類器,adaboost算法提供的是框架

  3)當使用簡單分類器時,計算出的結果是可以理解的。而且弱分類器構造極其簡單

  4)簡單,不用做特征篩選

  5)不用擔心overfitting!

四 Adaboost 舉例

也許你看了上面的介紹或許還是對adaboost算法云里霧里的,沒關系,百度大牛舉了一個很簡單的例子,你看了就會對這個算法整體上很清晰了。

  下面我們舉一個簡單的例子來看看adaboost的實現過程:

  圖中,“+”和“-”分別表示兩種類別,在這個過程中,我們使用水平或者垂直的直線作為分類器,來進行分類。

  第一步:

  根據分類的正確率,得到一個新的樣本分布D2-,一個子分類器h1

  其中劃圈的樣本表示被分錯的。在右邊的途中,比較大的“+”表示對該樣本做了加權。

也許你對上面的?1,ɑ1怎么算的也不是很理解。下面我們算一下,不要嫌我啰嗦,我最開始就是這樣思考的,只有自己把算法演算一遍,你才會真正的懂這個算法的核心,后面我會再次提到這個。

算法最開始給了一個均勻分布 D 。所以h1 里的每個點的值是0.1。ok,當劃分后,有三個點劃分錯了,根據算法誤差表達式得到 誤差為分錯了的三個點的值之和,所以?1=(0.1+0.1+0.1)=0.3,而ɑ1 根據表達式?的可以算出來為0.42. 然后就根據算法 把分錯的點權值變大。如此迭代,最終完成adaboost算法。

  第二步:

  根據分類的正確率,得到一個新的樣本分布D3,一個子分類器h2

  第三步:

  得到一個子分類器h3

  整合所有子分類器:

  因此可以得到整合的結果,從結果中看,及時簡單的分類器,組合起來也能獲得很好的分類效果,在例子中所有的。

五 Adaboost 疑惑和思考

? 到這里,也許你已經對adaboost算法有了大致的理解。但是也許你會有個問題,為什么每次迭代都要把分錯的點的權值變大呢?這樣有什么好處呢?不這樣不行嗎? 這就是我當時的想法,為什么呢?我看了好幾篇介紹adaboost 的博客,都沒有解答我的疑惑,也許大牛認為太簡單了,不值一提,或者他們并沒有意識到這個問題而一筆帶過了。然后我仔細一想,也許提高錯誤點可以讓后面的分類器權值更高。然后看了adaboost算法,和我最初的想法很接近,但不全是。 注意到算法最后的表到式為,這里面的a 表示的權值,是由得到的。而a是關于誤差的表達式,到這里就可以得到比較清晰的答案了,所有的一切都指向了誤差。提高錯誤點的權值,當下一次分類器再次分錯了這些點之后,會提高整體的錯誤率,這樣就導致 a 變的很小,最終導致這個分類器在整個混合分類器的權值變低。也就是說,這個算法讓優秀的分類器占整體的權值更高,而挫的分類器權值更低。這個就很符合常理了。到此,我認為對adaboost已經有了一個透徹的理解了。


六 總結

  最后,我們可以總結下adaboost算法的一些實際可以使用的場景:

  1)用于二分類或多分類的應用場景

  2)用于做分類任務的baseline

  無腦化,簡單,不會overfitting,不用調分類器

  3)用于特征選擇(feature selection)

  4)Boosting框架用于對badcase的修正

  只需要增加新的分類器,不需要變動原有分類器

  由于adaboost算法是一種實現簡單,應用也很簡單的算法。Adaboost算法通過組合弱分類器而得到強分類器,同時具有分類錯誤率上界隨著訓練增加而穩定下降,不會過擬合等的性質,應該說是一種很適合于在各種分類場景下應用的算法。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/255029.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/255029.shtml
英文地址,請注明出處:http://en.pswp.cn/news/255029.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

交換兩個整形變量的數值

課堂問題一: #include<stdio.h>void swap(int *p,int *q) {int *m;printf("m%d\n",m);printf("%s\n",*m);*m*p;*p*q;*q*m; } int main(){int a,b;scanf("%d,%d",&a,&b);swap(&a,&b);printf("a%d b%d\n",a,b);re…

使用CodeFirst創建并更新數據庫

本文主要介紹如何使用CodeFirst模式來新建并更新數據庫 在使用Entity Framwork的三種方式&#xff08;ModelFist、DBFirst、CodeFirst&#xff09;中&#xff0c;CodeFirst方式書寫的代碼最為干凈。 至于CodeFist方式的詳細優缺點請各位讀者自行搜索&#xff0c;這里不多贅述。…

fedora 15怎么修改運行級別?

inittab改了已經在fedora15中&#xff0c;你vim它就可以看到更改說明&#xff0c;就是說都改到/etc/systemd/system/default.target這里了&#xff0c;就是缺省的設置。如果你要改變缺省值就把對應的runlevel移動過去覆蓋了。 To 3 字符 [root15 system]# rm -rf /etc/systemd…

淺析人臉檢測之Haar分類器方法

由于工作需要&#xff0c;我開始研究人臉檢測部分的算法&#xff0c;這期間斷斷續續地學習Haar分類器的訓練以及檢測過程&#xff0c;在這里根據各種論文、網絡資源的查閱和對代碼的理解做一個簡單的總結。我試圖概括性的給出算法的起源、全貌以及細節的來龍去脈&#xff0c;但…

利用微軟平臺生成報表,線性圖,柱形圖

說來慚愧,以前的工作中一直借助第三方dll進行報表制作,比如線性圖,柱形圖. 因為現在工作的這家公司不允許隨便引入第三方dll,聽同事說起可以建rdl類型文件進行引入到winform窗體中,窗體上使用reportViewer控件進行關聯展示.下面是我今天摸索3個小時的結果分享. 第一步. 首先找到…

Linux ffmpeg的安裝編譯過程

Linux ffmpeg的安裝編譯過程 1、下載ffmpeg。    在網上搜索一下,或者到官方網站下載2、解壓   tar命令解壓3、配置  ./configure --enable-shared --prefix/usr/local/ffmpeg  其中&#xff1a;--enable-shared 是允許其編譯產生動態庫&#xff0c;在以后的編程中…

opencv 模板匹配(cvMatchTemplate)

opencv 模板匹配(cvMatchTemplate) 模板匹配是通過在輸入圖像上滑動模板圖像塊對實際的圖像塊和輸入圖像進行匹配&#xff0c;并且可以利用函數cvMinMaxLoc()找到最佳匹配的位置。例如在工業應用中&#xff0c;可以鎖定圖像中零部件的位置&#xff0c;并根據具體的位置&…

爬蟲系統Lucene分詞

思路&#xff1a;查詢數據庫中信息&#xff0c;查詢出id和name把那么進行分詞存入文件 package com.open1111.index; import java.io.IOException;import java.nio.file.Paths;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet; impor…

[BZOJ1880] [Sdoi2009] Elaxia的路線 (SPFA 拓撲排序)

Description 最近&#xff0c;Elaxia和w**的關系特別好&#xff0c;他們很想整天在一起&#xff0c;但是大學的學習太緊張了&#xff0c;他們 必須合理地安排兩個人在一起的時間。Elaxia和w**每天都要奔波于宿舍和實驗室之間&#xff0c;他們 希望在節約時間的前提下&#xff0…

ffmpeg的編譯大全

ffmpeg的編譯大全 最近互聯網視頻共享的網站很火&#xff0c;公司也想搞類似的網站&#xff0c;初步是用fmsffmpeg形式 fms負責在線錄制&#xff0c;播放&#xff0c;ffmpeg則在后臺處理上傳的資源轉換成一定的格式。 為了讓ffmpeg支持的格式盡量多&#xff0c;所以特把我的編譯…

用OPENCV視覺解數獨

用OPENCV視覺解數獨 2010-06-29 看到增強視覺網站上介紹老外用視覺解SUDOKU(http://www.cvchina.info/2011/05/29/video-sudoku-solver/)&#xff0c;覺得應該不難&#xff0c;于是用OPENCV和訓練好的數字分類器&#xff0c;也試著做一個&#xff0c;純屬娛樂 基本思路如下&…

集成ffmpeg/x264:ERROR: libx264 not found的問題

集成ffmpeg/x264:ERROR: libx264 not found的問題--拔劍集成ffmpeg/x264碰到如下問題&#xff1a; ERROR: libx264 not found察看config.log,詳細信息如下&#xff1a;check_lib x264.h x264_encoder_encode -lx264check_header x264.hcheck_cppBEGIN/tmp/ffconf.isuazGlg.c1 …

[ActionScript 3.0] AS3.0 下雨及漣漪效果

幀代碼&#xff1a; stage.frameRate 80;function init(x1:Number,y1:Number) {var mc:MovieClipnew MovieClip();addChild(mc);mc.x x1;mc.y y1;mc.graphics.lineStyle(0.5,0xbbffff,0.6);mc.graphics.drawEllipse(-1,-0.3,2,0.6);mc.addEventListener(Event.ENTER_FRAME,f…

JS Math.round()方法原理

請先測試代碼&#xff1a; 1 <!doctype html>2 <html lang"en">3 4 <head>5 <meta charset"UTF-8" />6 <title>Math.round方法</title>7 <style type"text/css">8 …

一個通用Makefile的編寫

我們在 LinuxLinux Linux是一套免費使用和自由傳播的操作系統&#xff0c;它主要用于基于Intel系列CPU的計算機上。這個系統是由全世界各地的成千上萬的程序員設計和實現的&#xff0c;其目的是建立不受任何商品化軟件的版權制約的、全世界都能自由使用的Unix兼容產品。 環境下…

Cache替換算法:LRU與LFU的區別

LFU&#xff08;Least Frequently Used&#xff09;最近最少使用算法。它是基于“如果一個數據在最近一段時間內使用次數很少&#xff0c;那么在將來一段時間內被使用的可能性也很小”的思路。LRU&#xff08;Least Recently Used&#xff09;. 注意LFU和LRU算法的不同之處&…

001-Ansible-參考http://www.ansible.com.cn/docs/playbooks_intro.html#about-playbooks

1. Patterns 在Ansible中,Patterns 是指我們怎樣確定由哪一臺主機來管理. 意思就是與哪臺主機進行交互. ansible <pattern_goes_here> -m <module_name> -a <arguments>ansible webservers -m service -a "namehttpd staterestarted"同時讓我們提前…

linux下通用Makefile寫法

linux編譯多個源文件的程序比較麻煩&#xff0c;這下就需要通用的Makefile了&#xff0c;編譯的時候執行一下make命令就OK&#xff0c;下面介紹通用makfile的寫法。 假設現在有以下源文件&#xff1a;file1.h file1.c file2.h file2.c mainproc.c&#xff0c;程序的主函數在mai…

客服彈出框

html代碼&#xff1a; <head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><title>QQ在線客服jquery特效</title><link rel"stylesheet" type"text/css" href"common/css/lay…

第三次畢業設計任務書

一. 進度計劃 時間 計劃進度 3.24-3.30 嘗試將kdd數據預處理用代碼實現 3.31-4.6 將kdd數據預處理用代碼實現以及與aprior算法的結合 二. 課題需求 2.1 數據預處理的功能和主要方法 在現實中,由于數據的來源、組織、存儲等的多樣性,海量的原始數據中一般都很難避免“臟數據…