樸素貝葉斯算法原理小結
From https://www.cnblogs.com/pinard/p/6069267.html
在所有的機器學習分類算法中,樸素貝葉斯和其他絕大多數的分類算法都不同。對於大多數的分類算法,比如決策樹, KNN ,邏輯迴歸,支持向量機等,他們都是判別方法,也就是直接學習出特徵輸出Y和特徵X之間的關係,要麼是決策函數 Y=f(X) , 要麼是條件分佈 P(Y|X) 。但是樸素貝葉斯卻是生成方法,也就是直接找出特徵輸出 Y 和特徵 X 的聯合分佈 P(X,Y) , 然後用 P(Y|X)=P(X,Y)/P(X) 得出。
樸素貝葉斯很直觀,計算量也不大,在很多領域有廣泛的應用,這裏我們就對樸素貝葉斯算法原理做一個小結。
1. 樸素貝葉斯相關的統計學知識
在瞭解樸素貝葉斯的算法之前,我們需要對相關必須的統計學知識做一個回顧。
貝葉斯學派很古老,但是從誕生到一百年前一直不是主流。主流是頻率學派。頻率學派的權威皮爾遜和費歇爾都對貝葉斯學派不屑一顧,但是貝葉斯學派硬是憑藉在現代特定領域的出色應用表現爲自己贏得了半壁江山。
貝葉斯學派的思想可以概括爲先驗概率+數據=後驗概率。也就是說我們在實際問題中需要得到的後驗概率,可以通過先驗概率和數據一起綜合得到。數據大家好理解,被頻率學派攻擊的是先驗概率,一般來說先驗概率就是我們對於數據所在領域的歷史經驗,但是這個經驗常常難以量化或者模型化,於是貝葉斯學派大膽的假設先驗分佈的模型,比如正態分佈,beta分佈等。這個假設一般沒有特定的依據,因此一直被頻率學派認爲很荒謬。雖然難以從嚴密的數學邏輯裏推出貝葉斯學派的邏輯,但是在很多實際應用中,貝葉斯理論很好用,比如垃圾郵件分類,文本分類。
我們先看看條件獨立公式,如果X和Y相互獨立,則有:
P(X,Y)=P(X)P(Y)
我們接着看看
條件概率公式:
P(Y|X)=P(X,Y)/P(X)
P(X|Y)=P(X,Y)/P(Y)
或者說:
P(Y|X)=P(X|Y)P(Y)/P(X)
接着看看
全概率公式:
P(X)=∑kP(X|Y=Yk)P(Yk)其中∑kP(Yk)=1
從上面的公式很容易得出
貝葉斯公式:
P(Yk|X)=P(X,Yk)P(X)=P(X|Y=Yk)P(Yk)∑kP(X|Y=Yk)P(Yk)
2. 樸素貝葉斯的模型
從統計學知識回到我們的數據分析。假如我們的分類模型樣本是:
(x(1)1,x(1)2,...x(1)n,y1),(x(2)1,x(2)2,...x(2)n,y2),...(x(m)1,x(m)2,...x(m)n,yn)
即我們有 m 個樣本,每個樣本有 n 個特徵,特徵輸出有 K 個類別,定義爲 C1,C2,...,CK
從樣本我們可以學習得到樸素貝葉斯的先驗分佈: P(Y=Ck)(k=1,2,...K)
接着學習到條件概率分佈: P(X=x|Y=Ck)=P(X1=x1,X2=x2,...Xn=xn|Y=Ck)
然後, 使用先驗概率和條件概率就可以得到 X 和 Y 的聯合分佈 P(X,Y) 了。聯合分佈 P(X,Y) 定義爲:
P(X,Y=Ck)=P(Y=Ck)P(X=x|Y=Ck)=P(Y=Ck)P(X1=x1,X2=x2,...Xn=xn|Y=Ck)(1)(2)
從上面的式子可以看出
P(Y=Ck) 比較容易通過最大似然法求出,得到的
P(Y=Ck) 就是類別
Ck 在訓練集裏面出現的頻數。
但是, P(X1=x1,X2=x2,...Xn=xn|Y=Ck) 很難求出,這是一個超級複雜的有 n 個維度的條件分佈。樸素貝葉斯模型在這裏做了一個大膽的假設,即 X 的 n 個維度之間相互獨立,這樣就可以得出:
P(X1=x1,X2=x2,...Xn=xn|Y=Ck)=P(X1=x1|Y=Ck)P(X2=x2|Y=Ck)...P(Xn=xn|Y=Ck)
因此,聯合分佈 P(X,Y) 變爲:
P(X,Y=Ck)=P(Y=Ck)P(X=x|Y=Ck)=P(Y=Ck)P(X1=x1,X2=x2,...Xn=xn|Y=Ck)=P(Y=Ck)P(X1=x1|Y=Ck)P(X2=x2|Y=Ck)...P(Xn=xn|Y=Ck)(3)(4)(5)
故,樸素貝葉斯公式
P(Y=Ck|X) :
P(Y=Ck|X)=P(X,Y=Ck)P(X)=P(Y=Ck)P(X=x|Y=Ck)∑kP(X=x|Y=Ck)P(Ck)=P(Y=Ck)P(X1=x1|Y=Ck)P(X2=x2|Y=Ck)...P(Xn=xn|Y=Ck)∑k(P(Y=Ck)P(X1=x1|Y=Ck)P(X2=x2|Y=Ck)...P(Xn=xn|Y=Ck))(6)(7)(8)
公式(15)中,分母對所有 Ck 都是相同的。故聯合概率P(X,Y=Ck) 即可代表 Ck 的概率
從上式可以看出,這個很難的條件分佈大大的簡化了,但是這也可能帶來預測的不準確性。你會說如果我的特徵之間非常不獨立怎麼辦?如果真是非常不獨立的話,那就儘量不要使用樸素貝葉斯模型了,考慮使用其他的分類方法比較好。但是一般情況下,樣本的特徵之間獨立這個條件的確是弱成立的,尤其是數據量非常大的時候。雖然我們犧牲了準確性,但是得到的好處是模型的條件分佈的計算大大簡化了,這就是貝葉斯模型的選擇。
最後回到我們要解決的問題,我們的問題是給定測試集的一個新樣本特徵 (x(test)1,x(test)2,...x(test)n) ,我們如何判斷它屬於哪個類型?
既然是貝葉斯模型,當然是後驗概率最大化來判斷分類了。我們只要計算出所有的 K 個條件概率 P(Y=Ck|X=X(test)) , 然後找出最大的條件概率對應的類別,這就是樸素貝葉斯的預測了。
3. 樸素貝葉斯的推斷過程
上節我們已經對樸素貝葉斯的模型也預測方法做了一個大概的解釋,這裏我們對樸素貝葉斯的推斷過程做一個完整的詮釋過程。
我們預測的類別 Cresult 是使 P(Y=Ck|X=x(test)) 最大化的類別,數學表達式爲:
Cresult=argmaxCkP(Y=Ck|X=x(test))=argmaxCkP(X=x(test)|Y=Ck)P(Y=Ck)/P(X=x(test))(9)(10)
由於對於所有的類別計算
P(Y=Ck|X=x(test)) 時,上式的分母是一樣的,都是
P(X=x(test)) , 因此,我們的預測公式可以簡化爲:
Cresult=argmaxCkP(X=x(test)|Y=Ck)P(Y=Ck)
接着我們利用樸素貝葉斯的獨立性假設,就可以得到通常意義上的樸素貝葉斯推斷公式:
Cresult=argmaxCkP(Y=Ck)∏j=1nP(Xj=x(test)j|Y=Ck)
4. 樸素貝葉斯的參數估計
在上一節中,我們知道只要求出, P(Y=Ck)和P(Xj=x(test)j|Y=Ck)(j=1,2,...n) ,我們通過比較就可以得到樸素貝葉斯的推斷結果。這一節我們就討論怎麼通過訓練集計算這兩個概率。
對於 P(Y=Ck) ,比較簡單,通過極大似然估計我們很容易得到 P(Y=Ck) 爲樣本類別 Ck 出現的頻率,即樣本類別 Ck 出現的次數 mk 除以樣本總數 m 。
對於 P(Xj=x(test)j|Y=Ck)(j=1,2,...n) ,這個取決於我們的先驗條件:
a) 如果我們的 Xj 是離散的值,那麼我們可以假設 Xj 符合多項式分佈,這樣得到 P(Xj=x(test)j|Y=Ck) 是在樣本類別 Ck 中,x(test)j 出現的頻率。即:
P(Xj=x(test)j|Y=Ck)=mkjtestmk
其中
mk 爲樣本類別
Ck 出現的次數,而
mkjtest 爲類別爲
Ck 的樣本中,第
j 維特徵
X(test)j 出現的次數.
某些時候,可能某些類別在樣本中沒有出現,這樣可能導致 P(Xj=x(test)j|Y=Ck) 爲0,這樣會影響後驗的估計,爲了解決這種情況,我們引入了拉普拉斯平滑,即此時有:
P(Xj=x(test)j|Y=Ck)=mkjtest+λmk+Ojλ
其中
λ 爲一個大於
0 的常數,常常取爲1。
Oj 爲第j個特徵的取值個數。
b) 如果我們我們的Xj 是非常稀疏的離散值,即各個特徵出現概率很低,這時我們可以假設Xj 符合伯努利分佈,即特徵Xj 出現記爲1,不出現記爲0。即只要Xj出現即可,我們不關注Xj 的次數。這樣得到 P(Xj=x(test)j|Y=Ck) 是在樣本類別Ck 中,x(test)j 出現的頻率。此時有:
P(Xj=x(test)j|Y=Ck)=P(Xj|Y=Ck)x(test)j+(1−P(Xj|Y=Ck))(1−x(test)j)
其中,
x(test)j 取值爲0和1。
c) 如果我們我們的Xj 是連續值,我們通常取Xj 的先驗概率爲正態分佈,即在樣本類別Ck 中,Xj 的值符合正態分佈。這樣 P(Xj=x(test)j|Y=Ck) 的概率分佈是:
P(Xj=x(test)j|Y=Ck)=12πσ2k−−−−√exp(−(x(test)j−μk)22σ2k)
其中
μk和σ2k 是正態分佈的期望和方差,可以通過極大似然估計求得。
μk 爲在樣本類別
Ck 中,所有
Xj 的平均值。
σ2k 爲在樣本類別
Ck 中,所有
Xj 的方差。對於一個連續的樣本值,帶入正態分佈的公式,就可以求出概率分佈了。
5. 樸素貝葉斯算法過程
6. 樸素貝葉斯算法小結
樸素貝葉斯算法的主要原理基本已經做了總結,這裏對樸素貝葉斯的優缺點做一個總結。
樸素貝葉斯的主要優點有:
1)樸素貝葉斯模型發源於古典數學理論,有穩定的分類效率。
2)對小規模的數據表現很好,能個處理多分類任務,適合增量式訓練,尤其是數據量超出內存時,我們可以一批批的去增量訓練。
3)對缺失數據不太敏感,算法也比較簡單,常用於文本分類。
樸素貝葉斯的主要缺點有:
1) 理論上,樸素貝葉斯模型與其他分類方法相比具有最小的誤差率。但是實際上並非總是如此,這是因爲樸素貝葉斯模型給定輸出類別的情況下,假設屬性之間相互獨立,這個假設在實際應用中往往是不成立的,在屬性個數比較多或者屬性之間相關性較大時,分類效果不好。而在屬性相關性較小時,樸素貝葉斯性能最爲良好。對於這一點,有半樸素貝葉斯之類的算法通過考慮部分關聯性適度改進。
2)需要知道先驗概率,且先驗概率很多時候取決於假設,假設的模型可以有很多種,因此在某些時候會由於假設的先驗模型的原因導致預測效果不佳。
3)由於我們是通過先驗和數據來決定後驗的概率從而決定分類,所以分類決策存在一定的錯誤率。
4)對輸入數據的表達形式很敏感。
以上就是樸素貝葉斯算法的一個總結,希望可以幫到朋友們。