1. 程式人生 > >【十九】機器學習之路——樸素貝葉斯分類

【十九】機器學習之路——樸素貝葉斯分類

  最近在看周志華《機器學習》的貝葉斯分類器這一章時覺得書上講的很難理解,很多專業術語和符號搞的我頭大,大學時候概率論我還是學的還是不錯的,無奈網上搜了搜前輩的部落格,看到一篇把樸素貝葉斯講的很簡單的文章,頓時豁然開朗。關於貝葉斯分類且聽我慢慢道來:

貝葉斯定理

  學習樸素貝葉斯分類器之前,先介紹下貝葉斯定理(來自百度):

  貝葉斯定理由英國數學家貝葉斯 ( Thomas Bayes 1702-1761 ) 發展,用來描述兩個條件概率之間的關係,比如 P(A|B) 和 P(B|A)。按照乘法法則,可以立刻匯出:P(A∩B) = P(A)*P(B|A)=P(B)*P(A|B)。如上公式也可變形為:P(B|A) = P(A|B)*P(B) / P(A)。

  上圖可以很好的說明了貝葉斯的公式,P(A|B)就是在B事件已經發生的基礎上,發生A的概率。同理,P(B|A)就是在A事件已經發生的基礎上,發生B的概率。網上看到過一個很簡單的貝葉斯概率的例子:

  例如:一座別墅在過去的 20 年裡一共發生過 2 次被盜,別墅的主人有一條狗,狗平均每週晚上叫 3 次,在盜賊入侵時狗叫的概率被估計為 0.9,問題是:在狗叫的時候發生入侵的概率是多少?

  我們假設 A 事件為狗在晚上叫,B 為盜賊入侵,則以天為單位統計,P(A) = 3/7,P(B) = 2/(20*365) = 2/7300,P(A|B) = 0.9,按照公式很容易得出結果:P(B|A) = 0.9*(2/7300) / (3/7) = 0.00058

上述例子中:

  • P(A)是A的先驗概率或邊緣概率。之所以稱為”先驗”是因為它不考慮任何B方面的因素。
  • P(A|B)是已知B發生後A的條件概率,也由於得自B的取值而被稱作A的後驗概率。
  • P(B|A)是已知A發生後B的條件概率,也由於得自A的取值而被稱作B的後驗概率。
  • P(B)是B的先驗概率或邊緣概率,也作標準化常量(normalized constant)。

總結:

  看完了以上的介紹,各位同學心裡大概有點數了吧,其實貝葉斯分類器就是通過條件概率來進行分類的。舉一個簡單的例子,我們聽到一段非常非常嗲的女生的聲音,讓你判斷是A.志玲姐姐; B.門口吆喝賣大蔥的大媽; C.女漢子同學;毫無疑問,我們都會選擇A,因為我們知道志玲姐姐說話的聲音很嗲,在這幾個選項當中可能性最大。當然,有的同學就會說我那個女漢子同學平時私下說話超級超級嗲的,但是在沒有這些可用資訊的時候,我們選擇志玲姐姐是概率最大的選項,這其實就是貝葉斯分類器的思想基礎。

樸素貝葉斯分類器

  關於樸素貝葉斯分類器的內容,推薦大家參考前輩阮一峰的部落格——樸素貝葉斯分類器的應用,講的淺顯易懂,非常適合廣大剛入門機器學習的小夥伴。
  另外演算法雜貨鋪——分類演算法之樸素貝葉斯分類(Naive Bayesian classification)
這篇部落格介紹貝葉斯分類器內容較豐富一點,而且不難懂。相信大家看完這兩篇部落格就能夠完全搞懂貝葉斯分類。簡單總結一下樸素貝葉斯里三個重要的點:

主要原理

  樸素貝葉斯分類的基本原理就是貝葉斯定理,簡單來說我們現在手頭有個需要分類的資料。這個資料的特徵屬性值為x1=(a1,a2,...,am),假設它有m個特徵值,類別只有A類和B類兩種類別。想要根據x1的特徵值來判斷它屬於哪個類別的概率最高,從概率的角度來進行分類。

  1. 需要計算P(A|x1)P(B|x1),並進行大小比較確定分類結果。
  2. 根據貝葉斯定理,計算兩種分類的條件概率:
    P(A|x1)=P(A|a1,a2,...,am)=P(a1,a2,...,am|A)P(A)P(a1,a2,...,am)=P(a1|A)P(a2|A)...P(am|A)P(A)P(a1)P(a2)...P(am)

    P(B|x1)=P(B|a1,a2,...,am)=P(a1,a2,...,am|B)P(B)P(a1,a2,...,am)=P(a1|B)P(a2|B)...P(am|B)P(B)P(a1)P(a2)...P(am)
  3. 根據計算結果,給出概率最大的分類結果。

特徵屬性為連續值的處理

  在利用樸素貝葉斯進行分類時,需要計算各個劃分的條件概率P(a1,a2,...,am|A),一般如果特徵屬性取值為離散值,我們根據訓練集就可以輕鬆算出概率。但是,如果特徵屬性取值為連續值的話就很難根據樣本數來求出概率。這個時候我們通常假定連續值服從高斯分佈:


只要計算出訓練樣本中各個類別中此特徵項劃分的各均值和標準差,代入上述公式即可得到需要的估計值。

條件概率P(a|A)=0的處理

  當某個類別下某個特徵項劃分沒有出現過一次時,就會導致P(ai|A)=0,0乘上其他的數結果為0。這就導致我們求得的條件概率結果不準確。為了解決這個問題,我們引入”拉普拉斯修正”,具體思路如下圖所示:

其中|D|所有分類的樣本總數,|DC|表示分類為C的樣本總數。


  樸素貝葉斯分類的理論部分算是講完了,時間不早了,下期說一說樸素貝葉斯的實戰,主要在什麼專案中會用到貝葉斯分類,以及程式碼實現。再見~