回覆列表
-
1 # 論智
-
2 # IT老友
一、理解貝葉斯:根據資料集D的內容變化更新假設機率H
P(H|D) = P(H) P(D|H) / P(D)
更多更詳細請看<神奇貝葉斯的兩種理解方式>
二、樸素貝葉斯的特別之處就是假設條件獨立。
以過濾垃圾郵件為例,用D代表一封郵件,用h+表示垃圾郵件。
那麼問題就是求:
先驗機率P(h+):很容易求,從一個郵件庫裡統計垃圾郵件的比例即可;
似然度P(D|h+):在垃圾郵件當中出現跟這封郵件的機率,咋求?
注意到D是由N個單片語成的,用d1...dn表示,那麼
怎麼求P(d1,d2...dn | h+)呢?用完全聯合機率公式!
做極端假設,假設各個詞出現與否完全無關,
那麼上式變成:
繼續分解,得到
同樣的極端假設,標準化常量P(D) :
再利用貝葉斯公式,計算出來P(h+|d)如果大於某閾值,即可斷為垃圾郵件。
假設條件完全獨立,這就是之所以被稱為樸素(Naive)的原因。
首先回顧下貝葉斯定理:
pPost a b = ((p b) / (p a)) * (pPost b a)
上式中,pPost表示後驗機率posterior probability,傳統寫法為`p(b|a)`,我們將`b`置於`a`之後,我們覺得這樣比較自然。如果你更習慣傳統寫法的話可以參考下式
在分類問題中,上式中的`a`表示特徵,`b`表示類別。為了凸顯這一點,我們可以把`a`換成`f`(特徵 feature), `b`換成`C`(類別 class):
pPost f C = ((p C) / (p f)) * (pPost C f)
將其推廣到多個特徵:(實際問題往往需要統計多個特徵,而不是單一特徵)
pPost [f1, f2 .. fn] C =
(p C) * (pPost C [f1, f2 .. fn]) / (p [f1, f2 .. fn])
其中,`p C`和`p [f1, f2 .. fn]`都很容易統計,而`pPost C [f1, f2 .. fn]`的計算複雜度很高,特別是,`C`中同時具有`[f1, f2 .. fn]`的樣本可能很少(稀疏),那訓練的效果就很差了。
那怎麼辦呢?
我們可以假設`[f1, f2 .. fn]`的每一項都是獨立事件。這樣,`pPost C [f1, f2 .. fn]`就可以化簡為
(pPost C f1) * (pPost C f2) * .. * (pPost C fn)
這樣我們就只需要獨立計算分類為`C`的情況下具有某一個特徵的機率了,避免了樣本稀疏的問題,同時,每一項都可以分散式地跑。
別忘了,前面我們為了簡化運算量,假設`[f1, f2 .. fn]`的每一項都是獨立事件,這個假設可不一定成立。因此這個演算法叫做幼稚貝葉斯分類器或者樸素貝葉斯分類器(Naive Bayes Classifier)。這個名稱就是強調獨立事件的假設不一定成立。
儘管獨立事件的假設常常是不準確的,但樸素貝葉斯在實際工程中出乎意料地好用。因為很多應用並不在乎精確的類機率,只關心最後的分類結果。比如垃圾郵件過濾,只需要判斷是否是垃圾郵件,並不需要在使用者介面顯示“本郵件有 87.53% 的機率是垃圾郵件”之類的資訊。