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的分類
- 計算先驗概率及條件概率
- 根據(jù)輸入的數(shù)據(jù)xi = (xi(1), xi(2), ..., xi(n))T計算后驗概率箕速。
- 最大化后驗概率酪碘,得到xi對應(yīng)的類別。
我知道你沒看懂盐茎。
因為上述算法只是一個引子兴垦,請認真閱讀下邊的內(nèi)容,我會從頭開始分析字柠,講清楚上邊的算法為什么是這樣探越,引導(dǎo)你真正懂得樸素貝葉斯。
注:
= = 經(jīng)過之前有一篇文章受累不討好地使用Latex手打公式窑业,最后還出現(xiàn)了下圖錯誤無法加載的情況钦幔,這次我決定手寫,同學(xué)們就湊合看吧常柄。O__O "…
用通俗的話來講鲤氢,樸素貝葉斯,就是要學(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的類別拨与。最大化后驗概率,這是后話艾猜。這里就來解釋一下這個后驗概率买喧。
請看上圖,公式(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)部分結(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. 極大似然估計
2. 貝葉斯估計
然而用極大似然估計可能會出現(xiàn)所要估計的概率值為0的情況定嗓,0就會影響后驗概率的計算結(jié)果,使分類產(chǎn)生偏差萍桌。因此我們在極大似然估計的分子和分母部分分別加上一個小尾巴蜕乡,防止0的出現(xiàn)。改進之后的估計方法叫做貝葉斯估計梗夸。
根據(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ò)匆浙,部分本人手寫
最后安寺,字丑勿怪,但是人帥呀