我個(gè)人認(rèn)為,在數(shù)據(jù)挖掘領(lǐng)域,分類(lèi)算法是最為重要。它根據(jù)以往的數(shù)據(jù)來(lái)對(duì)新的數(shù)據(jù)做預(yù)測(cè)。垃圾郵件判斷,潛在用戶(hù)挖掘等都會(huì)用到分類(lèi)算法。今天把總結(jié)樸素貝葉斯算法的學(xué)習(xí)心得。

#Bayes是誰(shuí)#
Thomas Bayes,英國(guó)數(shù)學(xué)家。約1701年出生于倫敦,做過(guò)神甫。1742年成為英國(guó)皇家學(xué)會(huì)會(huì)員。1761年4月7日逝世。貝葉斯在數(shù)學(xué)方面主要研究概率論。他首先將歸納推理法用于概率論基礎(chǔ)理論,并創(chuàng)立了貝葉斯統(tǒng)計(jì)理論,對(duì)于統(tǒng)計(jì)決策函數(shù)、統(tǒng)計(jì)推斷、統(tǒng)計(jì)的估算等做出了貢獻(xiàn)。
#Bayes定理#
通俗來(lái)說(shuō)就是:****
已知事件B的發(fā)生概率P(B)
已知在事件B已經(jīng)發(fā)生的情況下,事件A發(fā)生的概率P(A|B)
則可根據(jù)Bayes定理,計(jì)算事件A發(fā)生的條件下,事件B發(fā)生的概率P(B|A)。
計(jì)算方法為:
P(B|A)=P(A|B)× P(B)/ P(A)
#NaiveBayes分類(lèi)算法實(shí)例#
門(mén)診部一共就診了6位患者,情況如下:

這時(shí),來(lái)了第七位患者,一位“打噴嚏的工人”,請(qǐng)推斷他得了啥病。
這就是一個(gè)分類(lèi)問(wèn)題。現(xiàn)狀把所有患者分成了三類(lèi)“感冒”“過(guò)敏”“腦震蕩”,我們的目的是把“打噴嚏的工人”分到這三類(lèi)中的一類(lèi)中。具體做法為:根據(jù)Bayes定理,計(jì)算這個(gè)“打噴嚏的工人”患三種疾病的概率。
P(感冒|打噴嚏&工人)
= P(打噴嚏&工人|感冒)×P(感冒) / P(打噴嚏&工人)
= P(打噴嚏|感冒)× P(工人|感冒)× P(感冒) / P(打噴嚏)× P(工人)
= (2/3 × 1/3 × 1/2)/ (1/2 × 1/3)
= 66.7%
解釋:
- '&'項(xiàng)可以分成兩個(gè),是因?yàn)椤鞍Y狀”變量和“職業(yè)”變量是相互獨(dú)立的,沒(méi)什么聯(lián)系
- 感冒的有3個(gè),其中打噴嚏的2個(gè),所以P(打噴嚏|感冒)=2/3
- 感冒的有3個(gè),其中工人1個(gè),所以P(工人|感冒)=1/3
- 一共六個(gè)人,感冒3個(gè),所以P(感冒)=1/2
- 一共六個(gè)人,打噴嚏的3個(gè),所以P(打噴嚏)=1/2
- 一共六個(gè)人,其中工人2個(gè),所以P(工人)=1/3
按照這個(gè)方法,計(jì)算“打噴嚏的工人”另外兩種疾病的概率;
P(過(guò)敏|打噴嚏&工人)
= P(打噴嚏&工人|過(guò)敏)×P(過(guò)敏) / P(打噴嚏&工人)
= P(打噴嚏|過(guò)敏)× P(工人|過(guò)敏)× P(過(guò)敏) / P(打噴嚏)× P(工人)
= (1 × 0 × 1/6)/ (1/2 × 1/3)
= 0%
P(腦震蕩|打噴嚏&工人)
= P(打噴嚏&工人|腦震蕩)×P(腦震蕩) / P(打噴嚏&工人)
= P(打噴嚏|腦震蕩)× P(工人|腦震蕩)× P(腦震蕩) / P(打噴嚏)× P(工人)
= (0 × 1/2 × 1/3)/ (1/2 × 1/3)
= 0%
可見(jiàn),“打噴嚏的工人”患感冒概率66.7%,初步判斷應(yīng)該是感冒。但是一般的分類(lèi)器都要根據(jù)具體業(yè)務(wù)設(shè)置閾值,對(duì)于人命關(guān)天的事,最好嚴(yán)格一些,比如95%以上才做出判斷,那么這里最好的答案應(yīng)該是“機(jī)器無(wú)法判斷,建議去讓醫(yī)生看看”。
#補(bǔ)充說(shuō)明#
- 算法叫做樸素貝葉斯(NaiveBayes),是因?yàn)樗惴ㄊ窃谔?jiǎn)單了
- ‘&’能分開(kāi)兩個(gè)概率相乘是因?yàn)樽兞康莫?dú)立性,如果不獨(dú)立的話(huà),這樣計(jì)算會(huì)有誤差
- 分母項(xiàng) P(打噴嚏)× P(工人)在每次計(jì)算中都一樣,可以只互相比較分子計(jì)算的結(jié)果作出判斷
- 例子中最初的6個(gè)病人的數(shù)據(jù)叫做訓(xùn)練集
#訓(xùn)練集樣本較小情況下的概率調(diào)整#
P(打噴嚏|過(guò)敏)和P(工人|過(guò)敏)分別為1,0,實(shí)際中不可能是這樣的,因?yàn)闆](méi)有什么是一定不發(fā)生,也沒(méi)有什么100%發(fā)生。出現(xiàn)這種情況是因?yàn)槲覀兊臉颖咎伲绻麡颖咀銐蚨?,概率?huì)相對(duì)靠譜。
在起步階段,樣本就是很少,為了避免0,1這種極端概率,需要人為做一些數(shù)學(xué)變換。
比如,對(duì)過(guò)敏來(lái)說(shuō),每個(gè)癥狀的初始概率都為50%,當(dāng)來(lái)了一個(gè)過(guò)敏病人,如果出現(xiàn)打噴嚏,那么P(打噴嚏|過(guò)敏)的概率就提升一點(diǎn)點(diǎn),反之如果不打噴嚏,則P(打噴嚏|過(guò)敏)的概率就下降一點(diǎn)點(diǎn)。
這樣使得每一個(gè)概率都變得在(0,1)之間平滑變化,對(duì)其他的變量也這樣處理。
在《Programming Collective Intelligence》這本書(shū)中給出了這個(gè)變換的公式,我套用到過(guò)敏來(lái)說(shuō)就是:
P(打噴嚏|過(guò)敏)調(diào)整 =(1×0.5 + 打噴嚏數(shù) × P(打噴嚏|過(guò)敏)) / (1+打噴嚏數(shù))
所以調(diào)整后的概率為:
P(打噴嚏|過(guò)敏)調(diào)整 = (0.5 + 3 ×1 )/(1+3 )=87.5%
P(工人|過(guò)敏)調(diào)整 = (0.5 + 2 ×0)/ (1+2)=16.7%
所以,在上例中計(jì)算第二種疾病的時(shí)候,如果用調(diào)整后的概率結(jié)果如下:
P(過(guò)敏|打噴嚏&工人)
= P(打噴嚏&工人|過(guò)敏)×P(過(guò)敏) / P(打噴嚏&工人)
= P(打噴嚏|過(guò)敏)× P(工人|過(guò)敏)× P(過(guò)敏) / P(打噴嚏)× P(工人)
= (87.5% × 16.7% × 1/6)/ (1/2 × 1/3)
= 14.6%
****#連續(xù)變量處理#****
對(duì)于上例來(lái)說(shuō),不論是職業(yè)還是癥狀,都是離散變量,也就是取值數(shù)有限,這樣都可以通過(guò)數(shù)個(gè)數(shù)的方式來(lái)計(jì)算概率(古典概率模型),但是如果出現(xiàn)連續(xù)型變量就不能靠數(shù)個(gè)數(shù)了,比如身高,可以有175cm 176cm 176.1cm 176.11cm,無(wú)窮盡……
- 處理方式一:離散化
身高來(lái)說(shuō),可以就精確到cm,那么基于現(xiàn)實(shí)世界從40cm(嬰兒)到230cm(姚明)基本就夠用了,可以數(shù)個(gè)數(shù)。要么就分段【小于100cm】【100-150cm】【150-180cm】……這樣也可以。 - 處理方式二:利用變量的分布來(lái)計(jì)算概率
一般來(lái)說(shuō)自然界中的大部分變量都是符合正態(tài)分布的,正態(tài)分布是一個(gè)鐘型曲線(xiàn),概率意義是,一次實(shí)驗(yàn)取到均值附近概率最大,去到遠(yuǎn)離均值的值的概率越來(lái)越小。那么可以計(jì)算樣本的均值和標(biāo)準(zhǔn)差,利用Z值【(實(shí)際值-均值)/標(biāo)準(zhǔn)差】,查標(biāo)準(zhǔn)正態(tài)分布表,查出取到每個(gè)樣本值的概率。
當(dāng)然,如果明確知道變量屬于某個(gè)其他分布,如泊松分布,那么就直接用分布函數(shù)求概率即可。
#數(shù)學(xué)表達(dá)以備裝B之需#
