1. 程式人生 > >利用樸素貝葉斯實現簡單的留言過濾

利用樸素貝葉斯實現簡單的留言過濾

一、樸素貝葉斯

  首先第一個問題,什麼是樸素貝葉斯?

  貝葉斯分類是一類分類演算法的總稱,這類演算法均以貝葉斯定理為基礎,故統稱為貝葉斯分類。而樸素樸素貝葉斯分類是貝葉斯分類中最簡單,也是常見的一種分類方法。而我們所想要實現的留言過濾其實是一種分類行為,是通過對於概率的判斷,來對樣本進行一個歸類的過程。

  樸素貝葉斯分類(NBC)是以貝葉斯定理為基礎並且假設特徵條件之間相互獨立的方法,先通過已給定的訓練集,以特徵詞之間獨立作為前提假設,學習從輸入到輸出的聯合概率分佈,再基於學習到的模型,輸入A求出使得後驗概率最大的輸出B。

  樸素貝葉斯公式:

      

  或者說:

  

 

 

 

 

  當我們假設各項條件之間是相互獨立的,比如說“我覺得你很美”“他覺得你很美”,不論是“我”還是“他”覺得“你很美”都是無關的,並不會因為是誰來評價而影響這個評價,那麼它就適合用樸素貝葉斯演算法。

  舉一個很典型的例子,假設通過一些指標如長相、性格等來判斷一個人我們是否要嫁給他,有這樣一個表格:

長相 性格 身高 是否上進 結果
不上進 不嫁
上進 不嫁
上進
上進
上進 不嫁
不上進 不嫁
不上進
上進
上進
上進
不上進 不嫁
不上進 不嫁

 

 

 

 

 

 

 

 

 

 

  這時當我們遇到一個小夥子並且我們知道以上條件:長相醜,性格壞,身高低,不上進,現在就可以轉換成一個數學上的分類問題來比較 P(嫁|各項條件) 與 P(不嫁|各項條件) 誰的概率大我們就能給出嫁或者不嫁的答案。然而,我們需要保證這些條件之間沒有關聯,我們發現比如一個人美醜與他是否上進、一個人性格好壞和他身高之間是無關的,所以適用於樸素貝葉斯公式的條件,那麼久可以進行計算了。

  經過統計:

  p(嫁) = 6/12(總樣本數) = 1/2

  p(醜|嫁) = 3/6 = 1/2

  p(壞|嫁)= 1/6

  p(低|嫁) = 1/6

  p(不上進|嫁) = 1/6

  p(醜) = 1/3

  p(壞) = 1/3

  p(低) = 7/12

  p(不上進) = 1/3

  我們帶入公式P(嫁|醜、壞、低、不上進)=P(醜、壞、低、不上進|嫁)*P(嫁)/P(醜、壞、低、不上進)=[P(醜|嫁)*P(壞|嫁)*P(低|嫁)*P(不上進|嫁)] / [P(醜)*P(壞)*P(低)*P(不上進)]= (1/2*1/6*1/6*1/6*1/2)/(1/3*1/3*7/12*1/3)

  下面我們根據同樣的方法來求P(不嫁|醜、壞、低、不上進)= ((1/6*1/2*1*1/2)*1/2)/(1/3*1/3*7/12*1/3)

  由於P(嫁|醜、壞、低、不上進)<P(不嫁|醜、壞、低、不上進),所以我們得出結論 不嫁。

  

  這時就有了一個積蓄已久的問題,在計算之前我們為什麼要保證各項條件之間相互獨立?

  假如沒有這個假設,那麼我們對右邊這些概率的估計其實是不可做的,這麼說,我們這個例子有4個特徵,其中帥包括{帥,醜},性格包括{不好,壞},身高包括{高,低},上進包括{不上進,上進},那麼四個特徵的聯合概率分佈總共是4維空間,總個數為2*2*2*2=16個。在現實生活中,有非常多的特徵,每一個特徵的取值非常多,那麼通過統計來估計後面概率的值,變得幾乎不可做,這是為什麼需要假設特徵之間獨立的原因。假如我們沒有假設特徵之間相互獨立,那麼我們統計的時候,就需要在整個特徵空間中去找,將會更多,比如我們就需要在嫁的條件下,去找四種特徵全滿足的人的個數,這樣的話,由於資料的稀疏性,很容易統計到0的情況。 這樣是不合適的。

  

  那麼我們就引出了下一個問題,如何解決0概率的問題?

  零概率問題:在計算新例項的概率時,如果某個分量在訓練集中從沒出現過,會導致整個例項的概率計算結果為0。針對文字分類就是當一個詞語在訓練集中沒有出現過,那麼該詞語的概率是0,使用連乘法計算文字出現的概率時,整個文字出現的概率就也是0,得到的結果就會非常不合理!

  我們是不是可以對這種資料採用加一來解決?

  法國數學家拉普拉斯最早提出用加1的方法估計沒有出現過的現象的概率,所以加1平滑也叫做拉普拉斯平滑。就是對於一個離散的值我們在使用的時候不是直接輸出它的概率,而是對概率值進行“平滑” 處理。即預設所有的特徵都出現過一次,將概率改成下面的形式 其中 N 是全體特徵的總數。

 

 

   如由如下訓練資料學習一個樸素貝葉斯分類器並確定