1. 程式人生 > >樸素貝葉斯

樸素貝葉斯

9.png 貝葉斯 分詞 世界 最大 log 制造 技術分享 規律

  樸素貝葉斯分類是基於貝葉斯概率的思想,假設屬性之間相互獨立,求得各特征的概率,最後取較大的一個作為預測結果(為了消弱罕見特征對最終結果的影響,通常會為概率加入權重,在比較時加入閾值)。樸素貝葉斯是較為簡單的一種分類器。

  屬性獨立性:事件B的發生不對事件A的發生造成影響,這樣的兩個事件叫做相互獨立事件。然而其屬性獨立性假設在現實世界中多數不能成立,例如: “spring”的後面更有可能跟著“MVC”。

  A和B中至少有一件事情發生:A∪B; A與B同時發生:A∩B(或AB);如果P(AB) =P(A)P(B),稱A,B 相互獨立。即:從數學上說,若N (N≥2) 個事件相互獨立,則必須滿足這樣的條件:其中任意k (N ≥ k ≥2)個事件同時發生的概率等於該k個事件單獨發生時的概率的乘積。

例:假設事件相互獨立,P(spring) = 0.2,P(MVC) = 0.8, 則 P(spring MVC) = 0.2 * 0.8=0.16。

實例應用

  很多時候,無法將樸素貝葉斯求得的結果作用於實際,因為樸素的假設(屬性之間相互獨立)會使其得到錯誤的結果。

樸素貝葉斯假設各特征項是獨立的,整體概率=各特征項概率的乘積,計算出特征集在每個分類的概率後進行比較,最大值即預測結果。

  根據概率公式,在實際應用中是:

技術分享

 下面以垃圾郵件過濾器為例,描述貝葉斯分類的實際應用。

  早期的郵件過濾器使用的基於規則的樸素貝葉斯分類,典型的規則包括:大寫的過度使用、與醫藥相關的單詞、過於花哨的HTML等。

這種過濾有兩個問題:

  1.如果垃圾制造者知道規律就能繞開過濾器,其行為變得更加隱蔽。

  2.某些被當作垃圾的分類中某些情況下並不適用(可能是正常內容)。

  本例將在開始階段和逐漸接收到更多消息後,由人們告訴它哪些是垃圾,哪些不是,不斷學習後,程序對垃圾信息的界定逐漸形成自己的觀點。這是典型的監督學習中的分類。

下面是實現過程的描述:

  1. 問題描述:郵件分為兩類,bad and good,令郵件內容為doc,分類為cat;程序判斷給定doc是哪個分類。上述描述實際是計算doc是某一分類的概率,即P(cat|doc)
  2. 設置特征集,將特征集定為分詞,每個分詞是一個特征,doc = FeatureSet = Set(分詞)
  3. 字典fc記錄每個特征在不同分類下的數量:fc = {} = {feature:{good:N, bad:M}},cc記錄每個分類下特征的總數:cc = {good:N, bad:M};則對於某個特定分類,特征f出現的概率 P(f|cat) = fc[f][cat] / cc[cat]
  4. 根據Navies Bayes計算 P(cat|doc),假設每個特征彼此獨立,下圖是核心公式:

技術分享

  由上圖的公式可推導:

P(cat|doc) = P(doc|cat) * P(cat) / P(doc)

= P(FeatureSet|cat) * P(cat) / P(doc)

= [(P(F1|cat) * P(F2|cat) * … * P(Fn|cat)] * P(cat) / P(doc)

= ∏(Fn|cat) * P(cat) / P(doc)

  由於絕大多數doc的內容都不同,可認為P(doc)是一個固定值1,計算P(doc)沒有意義。由此上式可等價為[(P(F1|cat) * P(F2|cat) * … * P(Fn|cat)] * P(cat)

偽代碼:

docProbability = [(P(F1|cat) * P(F2|cat) * … * P(Fn|cat)] * P(cat)

docProbability.setDefaultValue(1)

compute docProbability:

Features.forEach(f -> { docProbability *= P(f|cat)}) = Features.forEach(f->{docProbability *= fc[f][cat] / cc[cat]})

catProbabilty = P(cat) = cc[cat] / cc.all

最終 P(cat|doc) ≈ docProbability / catProbabilty

5. 當訓練數據較少時,避免將普通doc歸為bad非常重要。為解決這個問題,為每個分類設置閾值。對於一個doc來說,其概率與所有其他分類的概率相比,要大於閾值,即:

P(cat|doc) / P(other|doc) > threshold。

例如:假設過濾到bad的閾值是3, 則當P(bad|doc) / P(good|doc) > 3時才能劃分到bad類中。

如果good的閾值是1, 則 P(good|doc) > P(bad|doc)是就能劃分到good類中。

對於 1 < P(bad|doc) / P(good|doc) < 3, 劃分到unknow,可令unknow = good。

函數predict(doc) 是最終暴露的方法,使用threshold處理分類。

6.添加訓練集,使用predict方法判斷測試項屬於哪個分類。


參考文獻:

《集體智慧編程》

作者:我是8位的

出處:http://www.cnblogs.com/bigmonkey

本文以學習、研究和分享為主,如需轉載,請聯系本人,標明作者和出處,非商業用途!

樸素貝葉斯