夜深人靜寫算法(八)- 樸素貝葉斯分類

目錄  

一、引例
      1、旅遊問題
二、貝葉斯理論
      1、事件和概率
      2、聯合概率
      3、條件概率
      4、全概率公式
      5、貝葉斯定理
三、樸素貝葉斯分類實例
      1、回到旅遊問題
      2、樸素
      3、特徵和類別
      4、拉普拉斯平滑
      5、概率修正
四、樸素貝葉斯分類算法
      1、分類問題
      2、樸素貝葉斯分類算法原理
五、參考資料


一、引例
1、旅遊問題
今天要講的這個算法很有意思,看了好多資料,打算整理一下。一開始就講概念,則讀者減半。所以我打算從大家都感興趣的話題開始聊,神不知鬼不覺的讓大家領會這個算法的真諦。
公司一般都會組織旅遊,那麼去不去是我們自己決定的,天氣、心情、工作等等的外在原因都會影響我們的選擇。我收集了一些數據,如圖一-1-1所示。來看看大家在不同情況下對旅遊是如何選擇的。
圖一-1-1
我們看到這些數據可以大致分析一下,比如:“真的想出去的玩的時候風雨無阻”、“有時候宅是沒有任何理由的”等等。
那麼現在我問你,如果下雨、心情好、工作忙,去還是不去?這條數據在上述的表中是找不到的,然而或許你會脫口而出:“不去”。那麼我就要問了:“你是怎麼想出來的?”你可能想都不用想就能告訴我:“第三條數據,下雨、心情好、工作閒”的時候都不去,工作忙了怎麼可能還會去?
你如果要這麼說,那我可以說:“忙的時候我就想出去走走,放鬆下心情,爲什麼不可以?”
這個問題爭論下去沒有什麼意義,還是要拿數據說話。其實我們只要能夠證明這樣一個事實,即:下雨、心情好、工作忙的前提下,“不去旅遊”的概率大於“去旅遊”的概率。這樣就能做出決定了:“不去”。反之亦然。
這就是我們今天要講的---樸素貝葉斯分類算法。

二、貝葉斯理論
這是一個基於概率的算法,所以有必要複習一下大學概率論的相關知識。
1、事件和概率
簡單掃一遍事件的概念,完全可以略過,只需要瞄一眼圖二-1-1的文氏圖就行:
        a.包含事件:AB,即事件A發生則必然導致事件B發生;
        b.和事件:A∪B,即事件A和事件B至少一個發生,事件A∪B發生;
        c.積事件:A∩B(或AB),即事件A和事件B同時發生,則事件A∩B發生;
        d.互斥事件:A∩B=∅,即事件A和B不能同時發生;
        e.對立事件:A∩B=∅且A∪B=Ω,即事件A和B必定並且僅有一個發生,A的對立事件記爲A'(數學中是上劃線);
        f.差事件:A-B,即當且僅當A發生而B不發生時,事件A-B發生;
圖二-1-1
概率則是對事件發生可能性大小的客觀度量。事件A的概率記爲P(A)。
2、聯合概率
聯合概率是指事件A和事件B同時發生的概率,記爲P(A∩B)或P(AB)。
圖二-2-1
用S(x)表示圖二2-1的文氏圖中x塊代表的面積,用面積的比值來代表概率是最直觀的了:
圖二-2-2
3、條件概率
條件概率是指已知事件B發生的條件下,事件A發生的概率,記爲P(A|B)。由於事件A和B之間可能會有一定聯繫,因而事件B發生以後,事件A的概率可能會發生變化。即P(A|B)不一定等於P(A)。
從圖二-2-1可以看出,P(A|B)=S(A∩B)/S(B),分子分母同時除上S(Ω),則:
圖二-3-1
同理可得:
圖二-3-2
將分母移到等式左邊,則有如下乘法等式:
圖二-3-3
這個就是乘法公式。
最後將P(B)移到等式右邊成爲分子,得到條件概率的計算公式如下:
圖二-3-4
這時候有人可能會問P(A|B)和P(B|A)有什麼區別?在數學思維裏,當一個量不容易求的時候總是將它轉換成等價的好求的量,這裏也是如此。接下來的這個例子中,你會發現P(A|B)不好求而P(B|A)是顯而易見的例子。
【例題1】假設人口中有1%的人攜帶SB病毒。進行檢查時,由於技術和操作不完善的原因,攜帶者未必呈陽性,而不攜帶者也可能呈陽性。在不清楚是否攜帶的情況下,檢測呈陽性概率爲10%;明確攜帶病毒的情況下,檢測呈陽性概率爲98%。
請問,現在某人檢查結果呈陽性,那麼他攜帶SB病毒的概率有多大?
爲了簡化問題,我們令人羣中攜帶SB病毒的事件爲A,檢測呈陽性的事件爲B。那麼需要求的就是P(A|B)。
P(B|A)表示攜帶病毒者檢測呈陽性的概率,是個已知量,爲0.98;P(A)表示攜帶SB病毒的概率爲0.01;P(B)爲0.10。
所以P(A|B)=P(B|A)P(A)/P(B)=0.98*0.01/0.10=9.8%
我們發現,即使檢驗結果爲陽性,攜帶病毒的概率也不是很大,這是因爲有誤報率的存在。對於這個病毒問題,下文還會繼續探討,目前只是作爲拋磚引玉的作用。
4、全概率公式
圖二-4-1
如圖二-4-1所示,B代表全集,並且被切分成B1、B2、B3三部分,那麼A可以表示成如下:
圖二-4-2
然後計算A的概率就可以轉換成計算A和B的積事件的概率之和,利用乘法公式,有如下等式:
圖二-4-3
以上就是劃分爲3的全概率公式,接下來看下更一般的情況:
圖二-4-4
還是以病毒攜帶爲例說一說全概率公式。
【例題2】假設人口中有1%的人攜帶SB病毒。進行檢查時,由於技術和操作不完善的原因,攜帶者未必呈陽性,而不攜帶者也可能呈陽性。不攜帶病毒的情況下,檢測呈陽性概率爲9%;攜帶病毒的情況下,檢測呈陽性概率爲98%。
請問,在不清楚是否攜帶病毒的情況下,檢測呈陽性的概率爲多少?
該問題對例題1進行了擴展,紅字部分是兩道題的區別,沿着上個問題的思路,P(A)代表攜帶病毒的概率,P(B)代表檢測呈陽性的概率。那麼P(B)就是我們需要求的量。有全概率公式,我們可以將事件按照是否攜帶病毒分成兩類:A表示攜帶,A'表示不攜帶。根據全概率公式,有:
圖二-4-5
    其中P(B|A)和P(B|A')分別代表攜帶病毒和不攜帶病毒時,檢測呈陽性的概率,題中已經給出;P(A)和P(A')也都是已知量;所以P(B)可以輕鬆計算得出:P(B) = 0.98*0.01 + 0.09*(1-0.01) = 9.89%

5、貝葉斯定理
貝葉斯公式看起來複雜,其實很簡單,將條件概率的推算公式的分母P(B)用全概率公式替換,就有了貝葉斯公式:
圖二-5-1
好了,貝葉斯相關的理論部分到這裏就結束了,接下來我們看一個SB病毒的完整例題。
【例題3】假設人口中有1%的人攜帶SB病毒。進行檢查時,由於技術和操作不完善的原因,攜帶者未必呈陽性,而不攜帶者也可能呈陽性。不攜帶病毒的情況下,檢測呈陽性概率爲9%;攜帶病毒的情況下,檢測呈陽性概率爲98%。
請問,現在某人檢查結果呈陽性,那麼他攜帶SB病毒的概率有多大?
沿用【例題2】的題面和【例題1】的提問,就有了【例題3】。爲了套用貝葉斯公式,我們用A1和A2代表攜帶病毒和不攜帶病毒,那麼A1和A2構成一個全集Ω,P(B)代表檢測呈陽性的概率。需要求的就是P(A1|B)。直接套用貝葉斯公式:
圖二-5-2
我們發現,攜帶病毒的的情況下檢測呈陽性的概率高達98%。然而反過來,檢查結果爲陽性,攜帶病毒的概率不到10%,單純從圖二-5-2的公式就能看出一些端倪,98%和1%都是確定的,99%也是從1%通過反算取得,所以影響最後的概率的最大因素就是那個9%(不攜帶病毒時檢查呈陽性的概率),也就是誤報率。誤報率越大,公式的分母越大,最後的概率就越小。
再來分析一下條件概率的計算公式,P(A)被稱爲“先驗概率”,它是事件B發生前對事件A概率的一個判斷,有的資料上也叫 “古典概率”,往往通過大量的數據估算得出(最經典的是拋一枚硬幣,正面朝上的概率爲1/2);P(A|B)被稱爲“後驗概率”,即在事件B發生後,對事件A概率的一個再判斷;而P(B|A)/P(B)作爲調整因子,用於加強或減弱先驗概率。
圖二-5-3
這樣講可能不是很直觀,那麼我們現在把A和B用具體的事件來表示,用A表示加班,用B表示身體被掏空。則有如下等式:
圖二-5-4
我們需要求的是:想知道某個人“身體被掏空”,是因爲“加班”呢還是別的什麼原因?屬於加班的概率有多少?等式右邊的三項都可以通過大量數據統計得出。
P(加班):該員工從入職到現在加班的天數/總天數;
P(身體被掏空):請假的天數/總天數;
P(身體被掏空|加班):當晚加班後次日請假的天數/總加班數;
(以上的計算方法只是一個參考方案,並且和樣本數量有關。比如入職越久的老員工數據越準確,因爲採樣次數越多頻率越接近概率)
當然,“身體被掏空”這個結果發生的原因還有其它的,讀者可以發揮自己的想象,比較各個原因發生的概率,抽絲剝繭,逐步找到“身體被掏空”的真正原因。

三、樸素貝葉斯分類算法
1、回到旅遊問題
回到之前的問題,下雨、心情好、工作忙的前提下,“去旅遊”還是“不去旅遊”?我們先把這個問題用公式來描述出來:
圖三-1-1
那麼,如果我們能夠計算P1和P2的值,然後比較兩者的大小,就能做出決定了。先計算P1。根據條件概率的推算公式,有:
圖三-1-2
還是那句話,當一個量不容易求的時候,總是可以將它轉換成等價的好求的量,那麼爲什麼這三個量好求呢?這樣看來貌似還不是很好求,我們需要把等式進行再一次變形。
接下來我們看下樸素貝葉斯分類算法是如何將上式進行變形的。
2、樸素
“樸素”的意思就是簡單,爲了讓問題足夠簡單,我們需要假定影響結果(這裏特指“去旅遊”這件事)的各個因素相互獨立。相互獨立意味着什麼?意味着事件B發生與否,並不會影響事件A發生的概率,即:P(A|B) = P(A)。則根據乘法公式,有:
P(AB) = P(A|B)P(B) = P(A)P(B)
可以推廣到n個獨立事件的情況。那麼就有:
圖三-2-1
同理,再加上“去旅遊”這個事件的前提下,原本獨立的事件還是滿足如下等式:
P(BC|A) = P(B|A)P(C|A)
圖三-2-2
然而,問題來了,有人說天氣可能影響我的心情,它們之間並不是相互獨立的。沒錯,這也是爲何稱之爲“樸素”的一個原因,這裏的相互獨立這個假設往往是理想化的,這也是樸素貝葉斯分類的一個缺點,所以這個算法適用於各個決定因素之間相關性較小的實際問題。但是這並不影響我們學習這個算法的思維。
  最後我們把上述P1的連等式進行一番整理,有:
圖三-2-3
3、特徵和類別
仔細觀察最後的連等式,我們可以將這些概率分成幾類,天氣、心情、工作可以認爲是一些“特徵”,而去不去旅遊作爲我們需要分類的“類別”(這裏爲去和不去兩類),那麼我們需要統計的就是P(特徵)、P(類別)、P(特徵|類別)這三類概率。
樸素貝葉斯分類算法的含義就是根據一些給定的“特徵”進行“分類”。
統計的數據越多,事情發生的頻率越接近事情發生的概率(我們現在爲了把事情簡單化,所以數據量比較小,這樣更方便說明問題)。
    a)P(特徵):如圖三-3-1,以“下雨”爲例,10條樣本數據中“下雨”的數據佔據了3條,所以P(下雨)=3/10=0.3
圖三-3-1
    b)P(類別):如圖三-3-2,以“去旅遊”爲例,10條樣本數據中“去旅遊”的數據佔據了5條,所以P(去旅遊)=5/10=0.5
圖三-3-2
    c)P(特徵|類別):如圖三-3-3,以“去旅遊”的情況下“心情好”爲例,5條“去旅遊”的樣本數據中“心情好”佔據了1條,所以P(心情好|去旅遊)=1/5=0.2
圖三-3-3
按照上述方式進行統計,就能計算出下雨、心情好、工作忙的情況下“去旅遊”和“不去旅遊”的概率了。
圖三-3-4
計算完P1和P2,仔細一看!哇靠!不去旅遊的概率還能大於1?這是爲什麼呢?難道是爲了替公司節省資金,所以竭力阻止我們去旅遊?
當然不是啦...
真正的原因是因爲我們的數據樣本太少,所以其實頻率並不等於概率,爲了緩解這個問題,需要引入拉普拉斯平滑使得概率的計算更爲精確。
     4、拉普拉斯平滑
(百度拉普拉斯平滑,你可以看到一個比較牛逼的圖,我就不貼了。免得貼完圖,導致又一批祖國的花朵對數學失去信心)。
拉普拉斯平滑又被稱爲加1平滑,是比較常用的平滑方法。平滑方法的存在主要是爲了解決零概率問題。
還是以拋硬幣來舉例,硬幣出現正面的概率爲p,已知前m次出現正面的次數爲n。當m足夠大的時候,p=n/m;然而,當m很小時,這個結果顯然是不成立的,試想m=4的時候,4次都是反面,那麼p=0這肯定是不合理的。
爲了解決這個零概率問題,我們在分母加上取值範圍的大小,並且在分子加1。概率計算公式變爲p=(n + 1)/(m + 2)。其中分母的2代表正面、反面兩種情況,分子的1則代表“1”次正面,當m足夠大的時候,極限爲n/m符合概率的計算;當m較小時,則認爲正面這個事件至少發生一次。
更加一般的情況,對於一個隨機變量x,取值範圍爲[1, n]內的整數。進行m次取值試驗後,記錄第i次取出的結果爲a(i),那麼取到j的概率爲:
圖三-4-1
加入拉普拉斯平滑以後,計算公式變爲:
圖三-4-2
分子加1是爲了避免零概率問題,分母加n是爲了公平,讓每個能取到的值都加1。
5、概率修正
然後,通過拉普拉斯平滑對特徵、類別概率進行修正。以P(下雨)爲例,10次天氣樣本數據中,3次爲下雨,然後對分母加上3(天氣的種類數),分子加上1,得到最後的概率P(下雨) = (3 + 1) / (10 + 3) = 4/13。繼續把P1和P2帶入進行計算:
圖三-5-1
選擇不去旅遊的概率還是大於1(真的很後悔選了這麼個例子...)。這對於作者來說簡直就是晴天霹靂,感覺有種編不下去了的感覺。但是,作者還是傾向於把產生這個的原因歸結爲樣本數據太少引起的。
然而,其實我們並不需要糾結這個問題,我們要做的只是需要比較P1和P2哪個大,我們發現P1和P2的分母是一樣的,換言之只要比較兩者的分子即可,因爲引入了拉普拉斯平滑,所以這裏涉及的所有概率都是大於0的,也就是說如果拿P1或P2作爲除數不會產生除零異常。那麼,令k = P1/P2,如果k>1,則說明P1>P2;反之,則P1<=P2。
實際情況是P1<P2,不去旅遊的概率遠大於去旅遊的概率。所以我們選擇不去旅遊。

四、樸素貝葉斯分類算法
1、分類問題
所謂分類問題,就是根據事物的特徵,對事物的類別進行劃分。上文描述的旅遊問題就是一個分類問題,其中天氣、心情、工作的忙或閒就是特徵量,根據這些特徵,分爲去旅遊和不去旅遊兩類。
從數學的角度來闡述分類問題:
定義待分類集合X和類別集合Y,其中X = {x1, x2, ...},Y = {y1, y2,...yn}。 需要找到一種映射規則y = F(x),使得對於任何一個特徵xiX有且僅有一個yjY使得yj = F(xi)成立。
分類問題的實質就是構造這個分類器F。其實你在遇到一個問題,然後思考用什麼算法來解決這個問題的時候,就是一個分類的過程。分類的準確率與你學過的算法多少(構造方式)、問題本身適合什麼算法的特性(特徵量)以及你對每個算法的經驗(樣本數量)有關。
2、樸素貝葉斯分類算法原理
1、x = {a1, a2,...am}爲一個待分類項,其中ai代表x的第i條特徵(例如:x = {下雨,心情好,工作忙});
2、類別集合Y = {y1, y2,...yn}(例如:Y = {去旅遊,不去旅遊});
3、分別計算P(y1|x)、P(y2|x)、...、P(yn|x);
4、找出滿足P(y1|x),P(y2|x),...,P(yn|x)中值最大的yk,那麼x屬於類別yk;
樸素貝葉斯算法要求各個特徵量ai相互獨立,其中第3條的計算可以通過貝葉斯公式進行轉換:
圖四-2-1
在找滿足P(yi|x)最大的yk時,分母P(x)是確定的,所以只需要計算分子即可。分子的計算可以通過大量樣本訓練統計得出。

五、參考資料
a.阮一峯的貝葉斯定理,解釋的很到位
b.貝葉斯的理論知識
c.算法雜貨鋪——分類算法之樸素貝葉斯分類
d.普拉斯平滑,一個比較好的解釋

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章