讓你奶奶輕松搞懂Naive Bayes的理論與實踐

stay simple,stay naive

hahaha捍靠,今天連文章的第一句話都改了。
不過递瑰,我標(biāo)題黨了... ...畢竟你奶奶可能連概率是什么都不知道粟誓,而我這里沒有基礎(chǔ)的教學(xué)。之所以取這個名字是因為仑鸥,你只要順著我的思路認真讀下去吮播,可以清楚地融會貫通Naive Bayes,搞懂它的原理眼俊。

樸素貝葉斯(Naive Bayes)是基于貝葉斯定理特征條件獨立假設(shè)的分類方法意狠。
換句話說,Naive Bayes的構(gòu)造基礎(chǔ)是貝葉斯定理疮胖,基本數(shù)學(xué)假設(shè)是:輸入數(shù)據(jù)在各個維度上的特征被分類的條件概率之間是相互獨立的环戈。

本文將從樸素貝葉斯的算法出發(fā)闷板,一點一點的剖析算法的原理,分析清楚樸素貝葉斯為什么要這樣進行運算院塞。
最后遮晚。上手實踐。


樸素貝葉斯算法(naive Bayes algorithm)
輸入:訓(xùn)練數(shù)據(jù) T = {(x1,y1),(x2,y2),(x3,y3),···,(xN,yN)}
其中xi = (xi(1), xi(2), ..., xi(n))T拦止,xi代表一條實例县遣,這個數(shù)據(jù)集中每一條實例都由n個維度組成。
xi(j)是訓(xùn)練數(shù)據(jù)中第i個樣本的第j維特征汹族。
xi(j)∈{aj1, aj2, aj3, aj4, ..., ajS}萧求,說明j維可以在a這個集合中取值。
yi是xi這個實例對應(yīng)的類別顶瞒,有可能是c1夸政,c2,c3搁拙,··· 秒梳, cK
輸出:實例x的分類

  1. 計算先驗概率及條件概率
  2. 根據(jù)輸入的數(shù)據(jù)xi = (xi(1), xi(2), ..., xi(n))T計算后驗概率箕速。
  3. 最大化后驗概率酪碘,得到xi對應(yīng)的類別。

我知道你沒看懂盐茎。
因為上述算法只是一個引子兴垦,請認真閱讀下邊的內(nèi)容,我會從頭開始分析字柠,講清楚上邊的算法為什么是這樣探越,引導(dǎo)你真正懂得樸素貝葉斯。

注:
= = 經(jīng)過之前有一篇文章受累不討好地使用Latex手打公式窑业,最后還出現(xiàn)了下圖錯誤無法加載的情況钦幔,這次我決定手寫,同學(xué)們就湊合看吧常柄。O__O "…


教訓(xùn)

用通俗的話來講鲤氢,樸素貝葉斯,就是要學(xué)習(xí)一個X與Y的聯(lián)合概率分布西潘,這個聯(lián)合概率分布就代表了X與某個Y之間的組合的可能性卷玉。這個聯(lián)合概率分布學(xué)好了,就意味著樸素貝葉斯這個模型學(xué)好了喷市。有了這個聯(lián)合概率分布相种,再給一個輸入值x,我想品姓,學(xué)過概率的人都應(yīng)該知道怎么計算在x的條件下的條件概率吧寝并。這就是樸素貝葉斯的基本思路箫措,非常簡單,具體怎么計算衬潦,向下看蒂破。

在使用樸素貝葉斯分類時,有給定的輸入x, 和訓(xùn)練得到的P(X, Y)别渔,就可以計算得到模型的后驗概率分布P(Y = ck | X = x),也就是說得到了在X = x的條件下Y = ck的概率惧互。最大化P(Y = ck | X = x)哎媚,等同于Y = ck的概率最大時的那個ck,就是這個模型的輸出喊儡,就是輸入x的類別拨与。最大化后驗概率,這是后話艾猜。這里就來解釋一下這個后驗概率买喧。

公式推導(dǎo)

請看上圖,公式(1)代表了條件獨立性假設(shè)匆赃,說明X = x(n)相互之間是彼此獨立的淤毛。
公式(2)就是我們所需要的后驗概率,是我們要求的在輸入x的條件下各種類別的概率算柳,我們需要做的就是計算這個公式低淡。為了讓公式(1)可以在公式(2)中發(fā)揮作用,我們需要將公式(2)變形瞬项,變出含有公式(1)的樣子蔗蹋,具體步驟見上圖。
然后將公式(1)帶入公式(2)囱淋。見公式(3)猪杭,就是我們的目標(biāo)函數(shù),也就是本節(jié)題目所說的后驗概率妥衣。

好了皂吮,后驗概率已經(jīng)出來了。
然后的問題是称鳞,我們?yōu)槭裁凑J為最大化后驗概率就可以得到我們想要的結(jié)果呢涮较。
來看下圖告訴你為什么。
下圖中最上邊的公式大家應(yīng)該認識冈止,是0-1損失函數(shù)狂票。在預(yù)測值和真實值相等的時候,函數(shù)為0熙暴;預(yù)測值和真實值不等的時候闺属,函數(shù)為1慌盯。
看公式(5),是期望風(fēng)險函數(shù)掂器。接下來將這個風(fēng)險期望變形亚皂。具體情況見下圖,由公式(5)到公式(6)的轉(zhuǎn)化国瓮。優(yōu)化一個模型灭必,我們需要最小化他的期望風(fēng)險函數(shù),也就是最小化公式(6)乃摹。具體情況見下圖禁漓,推導(dǎo)地也很清楚。最后可以發(fā)現(xiàn)最小化使用0-1損失函數(shù)的風(fēng)險函數(shù)就是最大化后驗概率孵睬。

知道了為什么要最大化后驗概率播歼,后驗概率也有了,進入到算法的最后一步掰读,最大化這個后驗概率秘狞。

看上圖,看公式(4)蹈集。注意注意注意:在此糾正一下上圖中的錯誤:公式(4)右邊的那行字有誤烁试,并不是最大化ck,而是最大化這個后驗概率從而得到使這個后驗概率最大的ck拢肆。
把公式(3)帶入公式(4)廓潜,觀察公式(4)第2行中的分母,他用一個求和符號把每一個c求和善榛,可知P(c1),P(c2),...,P(ck)的和為1辩蛋。因此分母中的內(nèi)容其實與ck無關(guān)。因為公式(4)被最大化是用來尋找ck的值移盆,所以與ck無關(guān)的部分為了簡化計算舍去悼院。于是得到最終最大化后驗概率的公式。

公式推導(dǎo)

到此為止咒循!公式推導(dǎo)部分結(jié)束据途。你已經(jīng)跟著我的思路得出了一個樸素貝葉斯的輸出的最終公式。

y = argmaxckP(Y = ck) ∏jP(X(j) = x(j) | Y = ck)

對的叙甸,前邊說了什么基本理論颖医,什么公式推導(dǎo),你可以暫時忘掉裆蒸,因為到了這一步熔萧,我們的任務(wù)僅僅是計算上邊這個公式的值,這個公式的值就是樸素貝葉斯的輸出值。

我們要計算什么佛致,相信你此時已經(jīng)非常了解了贮缕。然后,算俺榆。
這就來到了文章開頭的算法的第一個步驟:

計算先驗概率及條件概率

y = argmaxckP(Y = ck) ∏jP(X(j) = x(j) | Y = ck) 這個公式就是由Y的先驗概率和條件概率相乘得到的感昼,所以為了計算這個公式,我們要在這里計算先驗概率及條件概率罐脊。
這里提供兩種方式來估計這兩種概率:

  • 極大似然估計
  • 貝葉斯估計
1. 極大似然估計
先驗概率P(Y = c~k~) 的極大似然估計
條件概率P(X^(j)^ = x^(j)^ | Y = c~k~) 的極大似然估計
2. 貝葉斯估計

然而用極大似然估計可能會出現(xiàn)所要估計的概率值為0的情況定嗓,0就會影響后驗概率的計算結(jié)果,使分類產(chǎn)生偏差萍桌。因此我們在極大似然估計的分子和分母部分分別加上一個小尾巴蜕乡,防止0的出現(xiàn)。改進之后的估計方法叫做貝葉斯估計梗夸。

先驗概率P(Y = c~k~) 的貝葉斯估計
條件概率P(X^^(j)^ = x^(j)^ | Y = c~k~) 的貝葉斯估計
根據(jù)輸入的數(shù)據(jù)xi = (xi(1), xi(2), ..., xi(n))T計算P(Y = ck) ∏jP(X(j) = x(j) | Y = ck)

上一步驟中已經(jīng)有了條件概率的計算公式,在這一步驟中根據(jù)輸入的x通過公式計算出我們需要的條件概率号醉。

最大化后驗概率反症,得到xi對應(yīng)的類別

到了這一步,整個樸素貝葉斯的計算就完成了畔派。
理論結(jié)合實踐铅碍,下邊一道例題讓你對上邊所講的理論部分有更深入的理解。

例題

根據(jù)下表中的訓(xùn)練數(shù)據(jù)來訓(xùn)練一個貝葉斯分類器线椰,來確定輸入值x = (2, S)的類別胞谈。
下表中X1,X2為輸入值的2個維度憨愉,Y為輸出值烦绳,可以看出是一個分類問題,分為1和-1兩類配紫。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
X1 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
X2 S M M S S S M M L L L M M L L
Y -1 -1 1 1 -1 -1 -1 1 1 1 1 1 1 1 -1

上圖的解題過程清晰易懂径密,模擬了前文講解的樸素貝葉斯的過程.


到了代碼實現(xiàn)的時間。
這次使用的是20類新聞文本作為數(shù)據(jù)集躺孝。

# coding=utf-8
# import 與這個數(shù)據(jù)集相關(guān)的包
from sklearn.datasets import fetch_20newsgroups
# 與鳶尾不同的是享扔,這個數(shù)據(jù)集無法直接加載,而是需要從網(wǎng)絡(luò)下載數(shù)據(jù)植袍,不過基本套路與上一篇的knn差不多
news = fetch_20newsgroups(subset='all')

print len(news.data)
print news.data[0]

展示數(shù)據(jù)集樣例:可以看出有18846條數(shù)據(jù)惧眠,下邊的內(nèi)容為其中的第1條。

18846
From: Mamatha Devineni Ratnam <mr47+@andrew.cmu.edu>
Subject: Pens fans reactions
Organization: Post Office, Carnegie Mellon, Pittsburgh, PA
Lines: 12
NNTP-Posting-Host: po4.andrew.cmu.edu



I am sure some bashers of Pens fans are pretty confused about the lack
of any kind of posts about the recent Pens massacre of the Devils. Actually,
I am  bit puzzled too and a bit relieved. However, I am going to put an end
to non-PIttsburghers' relief with a bit of praise for the Pens. Man, they
are killing those Devils worse than I thought. Jagr just showed you why
he is much better than his regular season stats. He is also a lot
fo fun to watch in the playoffs. Bowman should let JAgr have a lot of
fun in the next couple of games since the Pens are going to beat the pulp out of Jersey anyway. I was very disappointed not to see the Islanders lose the final
regular season game.          PENS RULE!!!

然后于个,還是熟悉的操作氛魁,分割測試集和訓(xùn)練集。分割結(jié)果就不向上貼了。

from sklearn.cross_validation import train_test_split

X_train, X_test, Y_train, Y_test = train_test_split(news.data, news.target, test_size=0.25, random_state=33)

然后呆盖,就是要導(dǎo)入模型開始訓(xùn)練了拖云。
等等,是不是發(fā)現(xiàn)了有一些什么不一樣应又?上次的鳶尾數(shù)據(jù)是什么樣的宙项?這次呢?機器認識這次的自然語言嗎株扛?
所以在這里需要有一個步驟是將數(shù)據(jù)中的文本轉(zhuǎn)化為特征向量尤筐。

# 文本與特征向量轉(zhuǎn)化的模塊
from sklearn.feature_extraction.text import CountVectorizer
# 這里的操作就像上一次的數(shù)據(jù)標(biāo)準(zhǔn)化
w2v = CountVectorizer()
X_train = w2v.fit_transform(X_train)
X_test = w2v.transform(X_test)

現(xiàn)在就可以導(dǎo)入模型了。

from sklearn.naive_bayes import MultinomialNB

NB = MultinomialNB()
# 訓(xùn)練
NB.fit(X_train, Y_train)
# 測試
predict = NB.predict(X_test)

print NB.score(X_test, Y_test)
0.839770797963

ok,大功告成洞就。
炎炎夏日去喝杯冰飲吧盆繁。


參考文獻:
統(tǒng)計學(xué)方法 | python機器學(xué)習(xí)及實踐

如果你也喜歡機器學(xué)習(xí),并且也像我一樣在ML之路上努力旬蟋,請關(guān)注我油昂,我會進行不定期更新,總有一些可以幫到你倾贰。

文中公式推導(dǎo)為我個人理解冕碟,不保證理解完全正確,望指正
部分圖片來自網(wǎng)絡(luò)匆浙,部分本人手寫
最后安寺,字丑勿怪,但是人帥呀

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末首尼,一起剝皮案震驚了整個濱河市挑庶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌软能,老刑警劉巖迎捺,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異查排,居然都是意外死亡破加,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門雹嗦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來范舀,“玉大人,你說我怎么就攤上這事了罪《Щ罚” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵泊藕,是天一觀的道長辅辩。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么玫锋? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任蛾茉,我火速辦了婚禮,結(jié)果婚禮上撩鹿,老公的妹妹穿的比我還像新娘谦炬。我一直安慰自己,他們只是感情好节沦,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布键思。 她就那樣靜靜地躺著,像睡著了一般甫贯。 火紅的嫁衣襯著肌膚如雪吼鳞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天叫搁,我揣著相機與錄音赔桌,去河邊找鬼。 笑死渴逻,一個胖子當(dāng)著我的面吹牛疾党,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播裸卫,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼纽竣!你這毒婦竟也來了墓贿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤蜓氨,失蹤者是張志新(化名)和其女友劉穎聋袋,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體穴吹,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡幽勒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了港令。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啥容。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖顷霹,靈堂內(nèi)的尸體忽然破棺而出咪惠,到底是詐尸還是另有隱情,我是刑警寧澤淋淀,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布遥昧,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏炭臭。R本人自食惡果不足惜永脓,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鞋仍。 院中可真熱鬧常摧,春花似錦、人聲如沸凿试。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽那婉。三九已至板甘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間详炬,已是汗流浹背盐类。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留呛谜,地道東北人在跳。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像隐岛,于是被迫代替她去往敵國和親猫妙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容