標籤:樸素貝葉斯
樸素貝葉斯演算法簡潔
http://blog.csdn.net/xlinsist/article/details/51236454
引言
先前曾經看了一篇文章,一個老外程式員寫了一些很牛的Shell指令碼,包括晚下班自動給老婆發簡訊啊,自動沖Coffee啊,自動掃描一個DBA發來的郵件啊, 等等。於是我也想用自己所學來做一點有趣的事情。我的想法如下:
首先我寫個scrapy指令碼來抓取某個網站上的笑話
之後寫個Shell指令碼每天早上6點自動抓取最新的笑話
然後用樸素貝葉斯模型來判斷當前的笑話是否屬於成人笑話
如果是成人笑話,用指令碼把它自動發給好兄弟的郵箱
如果不是成人笑話,用指令碼把它自動發給女朋友的郵箱
在這個系列的文章中,你會學到:
樸素貝葉斯背後的數學原理
演算法具體的工作過程(結合執行個體)
scikit-learn快速實現演算法
這個系列的文章還會涉及到scrapy,pandas,numpy的一些知識,遇到這些知識的時候我會具體解釋的。這個系列的文章我會主要詳細的介紹上面的第3步實現過程,其餘的我會將源碼放在github上供大家參考。下面,就讓我們享受這個奇妙之旅吧。
樸素貝葉斯概述
眾所周知,樸素貝葉斯是一種簡單但是非常強大的線性分類器。它在垃圾郵件分類,疾病診斷中都取得了很大的成功。它只所以稱為樸素,是因為它假設特徵之間是相互獨立的,但是在現實生活中,這種假設基本上是不成立的。那麼即使是在假設不成立的條件下,它依然表現的很好,尤其是在小規模樣本的情況下。但是,如果每個特徵之間有很強的關聯性和非線性分類問題會導致樸素貝葉斯模型有很差的分類效果。
樸素貝葉斯背後的數學原理
後驗機率(Posterior Probabilities)
為了更好地瞭解樸素貝葉斯分類器是怎麼工作的,瞭解貝葉斯法則是很必要的。它可以被簡單地描述成下面的公式:
後驗機率=條件機率先驗機率現象機率
我們可以用一個關於老天是否下雨的例子來解釋上面的公式。
P(給定天上有烏雲,下雨的機率)=P(給定天上下雨,有烏雲的機率)P(下雨的機率)P(有烏雲的機率)
我們可以看到,如果我們想要在給定現象下,預測某種結果的機率,我們必須知道:1、在給定這種結果下,出現這種現象的機率。2、出現這種結果的機率。3、出現這種現象的機率。
在實際應用中,我們的現象不可能只有一個,比如,在垃圾郵件分類中,甚至可能有幾千個詞的特徵向量。下面,我將引入一些數學上的記號來統一後面的表達:
ωj表示屬於哪個類別,j∈{1,2,3,…,m}
xi表示特徵向量中的第i個特徵,i∈{1,2,3,…,n}
樸素貝葉斯的目標就是分別求得P(ωj|給定現象)j∈{1,2,3,…,m},選出最大的機率。
下面我將分別解釋上面的三個機率。
條件機率(Conditional Probabilities)
隨機變數的獨立性意味著我告訴你一個變數的出現,並不影響你相信另一個出現的可能。最簡單的一個例子就是拋硬幣,也就是第一次的反正面並不會影響你再一次拋出現反正面的機率(也就是0.5)。
樸素貝葉斯模型中,特徵之間不僅僅是獨立的,而且是加條件的獨立的。比如說:我的特徵向量x中,有n個特徵,那麼我可以把機率寫成下面的形式:
P(x|ωj)=P(x1|ωj)P(x2|ωj)P(x3|ωj)P(xn|ωj)=∏k=1nP(xk|ωj)
P(x|ωj)的機率我們可以理解成:在給定屬於某個類別的條件下,觀察到出現現象x的機率。在特徵向量中的每個特點的機率我們都可以通過極大似然估計(maximum-likelihood estimate)來求得,也就是簡單地求某個特徵在某個類別中的頻率,公式如下:
P(xi|ωj)=Nxi|ωjNωj(i=(1,…,n))
Nxi|ωj:在所有屬於類別ωj的訓練樣本中,特徵xi出現的次數
Nωj:在所有屬於類別ωj的訓練樣本中,所有特徵出現的次數
現在,我要用一個簡單的分類垃圾郵件的例子來闡明上面的概念。比如我有4封郵件,其中2封為垃圾郵件,特徵向量中有4個特徵。具體如下表:
樣本序號lovebuydealcat是否為垃圾郵件
11001不是
20110是
30101是
41011不是
現在我要求P(buy,deal|spam)這個機率,通過條件的獨立性和極大似然估計,我們可以求出這個機率:
P(buy,deal|spam)=P(buy|spam)P(deal|spam)=1+11+1+1+111+1+1+1=18
先驗機率(Prior Probabilities)
先驗機率道理其實很簡單,在上面的那個垃圾郵件的例子中,我們可以用極大似然估計來求得:24,通式如下:
p(ωj)=NωjNc
Nωj:屬於類ωj的樣本數
Nc:所有的樣本數
通過上面後驗機率的公式,我們可知:如果先驗機率服從均勻分布,那麼後驗機率將完全取決於條件機率和現象機率,然而現象機率是常量,所以後驗機率就完全取決於條件機率了。
注意:我認為在某些分類應用中,先驗機率應該去諮詢應用領域的專家,你不能單憑樣本中出現的機率來求得先驗機率。比如:如果我的訓練集中,下雨天的樣本要比晴天的樣本多,你不能說現實生活中下雨天的機率要比晴天的時候大。因此,對於某些應用,先驗機率應該去諮詢應用領域的專家。
現象機率(Evidence Probabilities)
現象機率是獨立於類別的。比如上面那個垃圾郵件的例子,我想知道P(deal)這個現象發生的機率,我只需要找出我所有的樣本中出現deal這個特徵的機率,與屬於哪個類別沒有任何關係。
其實我們完全沒有必要算出這個機率,因為我們要求屬於哪個類別的機率最大,而在這個過程中,它對於每次計算類別的機率中(也就是P(ωj|xi))都是常量,所以它不會影響到最終的決策。
加上平滑(Additive Smoothing)
還是上面那個郵件的例子,假設我們要求P(love|spam),我們會發現,在垃圾郵件中並沒有出現love這個詞,因此機率為0,如果這個條件機率為0,那麼整個後驗機率就為0。為了避免0機率的發生,我們可以加上平滑項。把上麵條件機率的公式改為下面的形式:
P(xi|ωj)=Nxi|ωj+αNωj+αn(i=(1,…,n))
Nxi|ωj:在所有屬於類別ωj的訓練樣本中,特徵xi出現的次數
Nωj:在所有屬於類別ωj的訓練樣本中,所有特徵出現的次數
α:附加的平滑項參數。α<1叫做Lidstone smoothing ;α=1叫做Laplace smoothing
n:特徵數
一個PHP版本的樸素貝葉斯
http://blog.csdn.net/u012543061/article/details/53005029
樸素貝葉斯演算法資料整理和PHP 實現版本