[ML學習筆記] 樸素貝葉斯算法(Naive Bayesian)

[ML學習筆記] 樸素貝葉斯算法(Naive Bayesian)


貝葉斯公式

\[P(A\mid B) = \frac{P(B\mid A)P(A)}{P(B)}\]python

咱們把P(A)稱爲"先驗機率"(Prior probability),即在B事件發生以前,對A事件機率的一個判斷。P(A|B)稱爲"後驗機率"(Posterior probability),即在B事件發生以後,對A事件機率的從新評估。P(B|A)/P(B)稱爲"可能性函數"(Likelyhood),這是一個調整因子,使得預估機率更接近真實機率。算法

因此,條件機率能夠理解成式子:後驗機率 = 先驗機率 x 調整因子。這就是貝葉斯推斷的含義。先預估一個"先驗機率",而後加入實驗結果,看這個實驗究竟是加強仍是削弱了"先驗機率",由此獲得更接近事實的"後驗機率"。函數

而分類問題的目標是,根據給定特徵得出類別。代入到貝葉斯公式中就是:學習

\[P(類別\mid 特徵) = \frac{P(特徵\mid 類別)P(類別)}{P(特徵)}\]spa


拼寫糾正實例

需求:當用戶輸入一個不在字典中的單詞,推測他想輸入的單詞code

猜想用戶想輸入的單詞爲h,而實際輸入的單詞D,根據公式有:事件

\[P(h\mid D) = \frac{P(h)P(D\mid h)}{P(D)}\]string

對於不一樣的猜想詞h一、h二、h3...,P(h)爲詞頻,P(D|h)可用不一樣字母的個數 / 鍵盤上的字母鍵位距離等評估,P(D)爲一常數,在比較時可忽略。it

因而有 \(P(h\mid D) \propto{P(h)P(D\mid h)}\) ,比較多種猜想中哪一個機率最大則能夠判斷糾正爲這個正確的單詞。io


模型比較理論

  • 最大似然:最符合觀測數據的(即P(D|h)最大的)最有優點
  • 奧卡姆剃刀:P(h)較大的模型有較大的優點(越常見的最好 如在擬合曲線中不會使用高階函數去擬合由於出現機率少)


代碼

import re, collections

def words(text):
    return re.findall('[a-z]+', text.lower()) #findall(pattern, string, flags=0) 返回string中全部與pattern相匹配的所有子串

def train(features):
    model = collections.defaultdict(lambda: 1) #py2.7中的經常使用集合模塊collections
    for f in features:
        model[f] += 1
    return model

NWORDS = train(words(open('big.txt').read()))

alphabet = 'abcdefghijklmnopqrstuvwxyz'

#兩個詞之間的編輯距離定義爲 使用了幾回插入、刪除、交換、替換

def edits1(word):   #編輯距離爲1
    n = len(word)
    return set([word[0:i]+word[i+1:] for i in range(n)] +                     #刪除
               [word[0:i]+word[i+1]+word[i]+word[i+2:] for i in range(n)] +   #交換
               [word[0:i]+c+word[i+1:] for i in range(n) for c in alphabet] + #替換 
               [word[0:i]+c+word[i:] for i in range(n) for c in alphabet]    #插入
                )

def edits2(word):    #編輯距離爲2
    return set(e2 for e1 in edits1(word) for e2 in edits1(e1))

#只返回正確的單詞
def known(words):
    return set(w for w in words if w in NWORDS)

#若是known(set)非空 則再也不計算後面的
def correct(word):
    candidates = known([word]) or known(edits1(word)) or known(edits2(word)) or [word]
    return max(candidates, key=lambda w: NWORDS[w]) #返回機率最大的值

# argmaxc P(c|w) -> argmaxc P(w|c)P(c)/P(w)
# P(c) c的詞頻 P(w|c) 在想鍵入c的狀況下敲成w的機率


垃圾郵件過濾實例

這是一個典型的二分類問題。設郵件內容爲D,h+表示垃圾郵件 h-表示正常郵件。

因而有

P(h+|D) = P(h+)P(D|h+)/P(D)
P(h-|D) = P(h-)P(D|h-)/P(D)

假設D裏面含有N個單詞d1,d2,d3...,

P(D|h+) = P(d1,d2,...,dn|h+) = P(d1|h+) * P(d2|d1,h+) * P(d3|d2,d1,h+) * ...

因爲樸素貝葉斯分類器基於一個簡單的假定:給定目標值時屬性之間相互條件獨立,因而可化爲 P(d1|h+) * P(d2|h+) * P(d3|h+) * ... 也即統計詞頻

相關文章
相關標籤/搜索