1. 程式人生 > >樸素貝葉斯算法資料整理和PHP 實現版本

樸素貝葉斯算法資料整理和PHP 實現版本

樸素貝葉斯

樸素貝葉斯算法簡潔

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個特征。具體如下表:


樣本序號 love buy deal cat 是否為垃圾郵件

1 1 0 0 1 不是

2 0 1 1 0

3 0 1 0 1

4 1 0 1 1 不是

現在我要求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 實現版本