這篇是從我的簡書賬号移植過來的 ,因為之前簡書出了一些問題,是以有些格式無法完美相容,是以附上連結,同學們請點我
stay simple,stay naive
hahaha,今天連文章的第一句話都改了。
不過,我标題黨了… …畢竟你奶奶可能連機率是什麼都不知道,而我這裡沒有基礎的教學。之是以取這個名字是因為,你隻要順着我的思路認真讀下去,可以清楚地融會貫通Naive Bayes,搞懂它的原理。
樸素貝葉斯(Naive Bayes)是基于貝葉斯定理和特征條件獨立假設的分類方法。
換句話說,Naive Bayes的構造基礎是貝葉斯定理,基本數學假設是:輸入資料在各個次元上的特征被分類的條件機率之間是互相獨立的。
本文将從樸素貝葉斯的算法出發,一點一點的剖析算法的原理,分析清楚樸素貝葉斯為什麼要這樣進行運算。
最後。上手實踐。
樸素貝葉斯算法(naive Bayes algorithm)
輸入:訓練資料 T = {(x~1~,y~1~),(x~2~,y~2~),(x~3~,y~3~),···,(x~N~,y~N~)}
其中x~i~ = (x~i~^(1)^, x~i~^(2)^, …, x~i~^(n)^)^T^,x~i~代表一條執行個體,這個資料集中每一條執行個體都由n個次元組成。
x~i~^(j)^是訓練資料中第i個樣本的第j維特征。
x~i~^(j)^∈{a~j1~, a~j2~, a~j3~, a~j4~, …, a~jS~},說明j維可以在a這個集合中取值。
y~i~是x~i~這個執行個體對應的類别,有可能是c~1~,c~2~,c~3~,··· , c~K~。
輸出:執行個體x的分類
1. 計算先驗機率及條件機率
2. 根據輸入的資料x~i~ = (x~i~^(1)^, x~i~^(2)^, …, x~i~^(n)^)^T^計算後驗機率。
3. 最大化後驗機率,得到x~i~對應的類别。
我知道你沒看懂。
因為上述算法隻是一個引子,請認真閱讀下邊的内容,我會從頭開始分析,講清楚上邊的算法為什麼是這樣,引導你真正懂得樸素貝葉斯。
注:
= = 經過之前有一篇文章受累不讨好地使用Latex手打公式,最後還出現了下圖錯誤無法加載的情況,這次我決定手寫,同學們就湊合看吧。O__O “…

用通俗的話來講,樸素貝葉斯,就是要學習一個X與Y的聯合機率分布,這個聯合機率分布就代表了X與某個Y之間的組合的可能性。這個聯合機率分布學好了,就意味着樸素貝葉斯這個模型學好了。有了這個聯合機率分布,再給一個輸入值x,我想,學過機率的人都應該知道怎麼計算在x的條件下的條件機率吧。這就是樸素貝葉斯的基本思路,非常簡單,具體怎麼計算,向下看。
在使用樸素貝葉斯分類時,有給定的輸入x, 和訓練得到的P(X, Y),就可以計算得到模型的後驗機率分布P(Y = c~k~ | X = x),也就是說得到了在X = x的條件下Y = c~k~的機率。最大化P(Y = c~k~ | X = x),等同于Y = c~k~的機率最大時的那個c~k~,就是這個模型的輸出,就是輸入x的類别。最大化後驗機率,這是後話。這裡就來解釋一下這個後驗機率。
請看上圖,公式(1)代表了條件獨立性假設,說明X = x^(n)^互相之間是彼此獨立的。
公式(2)就是我們所需要的後驗機率,是我們要求的在輸入x的條件下各種類别的機率,我們需要做的就是計算這個公式。為了讓公式(1)可以在公式(2)中發揮作用,我們需要将公式(2)變形,變出含有公式(1)的樣子,具體步驟見上圖。
然後将公式(1)帶入公式(2)。見公式(3),就是我們的目标函數,也就是本節題目所說的後驗機率。
好了,後驗機率已經出來了。
然後的問題是,我們為什麼認為最大化後驗機率就可以得到我們想要的結果呢。
來看下圖告訴你為什麼。
下圖中最上邊的公式大家應該認識,是0-1損失函數。在預測值和真實值相等的時候,函數為0;預測值和真實值不等的時候,函數為1。
看公式(5),是期望風險函數。接下來将這個風險期望變形。具體情況見下圖,由公式(5)到公式(6)的轉化。優化一個模型,我們需要最小化他的期望風險函數,也就是最小化公式(6)。具體情況見下圖,推導地也很清楚。最後可以發現最小化使用0-1損失函數的風險函數就是最大化後驗機率。
知道了為什麼要最大化後驗機率,後驗機率也有了,進入到算法的最後一步,最大化這個後驗機率。
看上圖,看公式(4)。注意注意注意:在此糾正一下上圖中的錯誤:公式(4)右邊的那行字有誤,并不是最大化c~k~,而是最大化這個後驗機率進而得到使這個後驗機率最大的c~k~。
把公式(3)帶入公式(4),觀察公式(4)第2行中的分母,他用一個求和符号把每一個c求和,可知P(c~1~),P(c~2~),…,P(c~k~)的和為1。是以分母中的内容其實與c~k~無關。因為公式(4)被最大化是用來尋找c~k~的值,是以與c~k~無關的部分為了簡化計算舍去。于是得到最終最大化後驗機率的公式。
到此為止!公式推導部分結束。你已經跟着我的思路得出了一個樸素貝葉斯的輸出的最終公式。
y = argmax~c~~k~P(Y = c~k~) ∏~j~P(X^(j)^ = x^(j)^ | Y = c~k~)
對的,前邊說了什麼基本理論,什麼公式推導,你可以暫時忘掉,因為到了這一步,我們的任務僅僅是計算上邊這個公式的值,這個公式的值就是樸素貝葉斯的輸出值。
我們要計算什麼,相信你此時已經非常了解了。然後,算。
這就來到了文章開頭的算法的第一個步驟:
計算先驗機率及條件機率
y = argmax~c~~k~P(Y = c~k~) ∏~j~P(X^(j)^ = x^(j)^ | Y = c~k~) 這個公式就是由Y的先驗機率和條件機率相乘得到的,是以為了計算這個公式,我們要在這裡計算先驗機率及條件機率。
這裡提供兩種方式來估計這兩種機率:
- 極大似然估計
- 貝葉斯估計
1. 極大似然估計
2. 貝葉斯估計
然而用極大似然估計可能會出現所要估計的機率值為0的情況,0就會影響後驗機率的計算結果,使分類産生偏差。是以我們在極大似然估計的分子和分母部分分别加上一個小尾巴,防止0的出現。改進之後的估計方法叫做貝葉斯估計。
根據輸入的資料x~i~ = (x~i~^(1)^, x~i~^(2)^, …, x~i~^(n)^)^T^計算P(Y = c~k~) ∏~j~P(X^(j)^ = x^(j)^ | Y = c~k~)
上一步驟中已經有了條件機率的計算公式,在這一步驟中根據輸入的x通過公式計算出我們需要的條件機率。
最大化後驗機率,得到x~i~對應的類别
到了這一步,整個樸素貝葉斯的計算就完成了。
理論結合實踐,下邊一道例題讓你對上邊所講的理論部分有更深入的了解。
例題
根據下表中的訓練資料來訓練一個貝葉斯分類器,來确定輸入值x = (2, S)的類别。
下表中X^1^,X^2^為輸入值的2個次元,Y為輸出值,可以看出是一個分類問題,分為1和-1兩類。
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
X^1^ | 1 | 1 | 1 | 1 | 1 | 2 | 2 | 2 | 2 | 2 | 3 | 3 | 3 | 3 |
X^2^ | S | M | M | S | S | S | M | M | L | L | L | M | M | L |
Y | -1 | -1 | 1 | 1 | -1 | -1 | -1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
上圖的解題過程清晰易懂,模拟了前文講解的樸素貝葉斯的過程.
到了代碼實作的時間。
這次使用的是20類新聞文本作為資料集。
# coding=utf-8
# import 與這個資料集相關的包
from sklearn.datasets import fetch_20newsgroups
# 與鸢尾不同的是,這個資料集無法直接加載,而是需要從網絡下載下傳資料,不過基本套路與上一篇的knn差不多
news = fetch_20newsgroups(subset='all')
print len(news.data)
print news.data[0]
展示資料集樣例:可以看出有18846條資料,下邊的内容為其中的第1條。
From: Mamatha Devineni Ratnam <[email protected]>
Subject: Pens fans reactions
Organization: Post Office, Carnegie Mellon, Pittsburgh, PA
Lines:
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!!!
然後,還是熟悉的操作,分割測試集和訓練集。分割結果就不向上貼了。
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)
然後,就是要導入模型開始訓練了。
等等,是不是發現了有一些什麼不一樣?上次的鸢尾資料是什麼樣的?這次呢?機器認識這次的自然語言嗎?
是以在這裡需要有一個步驟是将資料中的文本轉化為特征向量。
# 文本與特征向量轉化的子產品
from sklearn.feature_extraction.text import CountVectorizer
# 這裡的操作就像上一次的資料标準化
w2v = CountVectorizer()
X_train = w2v.fit_transform(X_train)
X_test = w2v.transform(X_test)
現在就可以導入模型了。
from sklearn.naive_bayes import MultinomialNB
NB = MultinomialNB()
# 訓練
NB.fit(X_train, Y_train)
# 測試
predict = NB.predict(X_test)
print NB.score(X_test, Y_test)
0.839770797963
ok,大功告成。
炎炎夏日去喝杯冰飲吧。
參考文獻:
統計學方法 | python機器學習及實踐
如果你也喜歡機器學習,并且也像我一樣在ML之路上努力,請關注我,我會進行不定期更新,總有一些可以幫到你。
文中公式推導為我個人了解,不保證了解完全正确,望指正
部分圖檔來自網絡,部分本人手寫
最後,字醜勿怪,但是人帥呀