樸素貝葉斯分類學習總結
寫在前面:還是筆記的總結輸出,大佬看了笑笑就好
樸素貝葉斯
-
首先我們在小學二年級就學過先驗概率,百度百科給出的解釋:先驗概率(prior probability)是指根據以往經驗和分析得到的概率,個人理解上來說其實先驗概率沒那複雜,它本質就是一個概率,p(X=x),事件X=x發生的概率,追根溯源計算的方式是用事件X=x發生的次數/總樣本事件發生的次數,就是數頻數,然而在試題中,一般分子上的先驗概率已知,而分母的先驗概率一般是通過全概率公式計算得到的,即其先驗概率不能直接得到,要通過∑(完備事件組發生的概率×對應的條件概率)計算得到。
-
後驗概率:p(X|H)=在假定事件H發生的條件下,X發生的概率,稱為X的後驗概率
-
p(X|H) 計算公式 p(X,H) / p(H)。其中p(X,H)為聯合概率,從某種程度上來說,通過聯合概率計算把計算p(X|H)轉化為計算p(H|X),或者簡單一點的題目p(H|X)都不用算,直接通過計數的方式把聯合概率數出來了。說到底,後驗概率計算的本質還是把它都轉化先驗概率計算問題。
如何理解先驗和後驗概率,這裡給個例子,直接引用下知乎的吧:
如何理解先驗概率與後驗概率 https://zhuanlan.zhihu.com/p/26464206
樸素貝葉斯分類,假設有屬性集U{A1,A2,A3,…,An,C},這裡給個圖比較好理解,圖片來自資料探勘課本,這裡的A1,A2…代表的是attribute(屬性),在下面例子中A1代表outlook,A2代表temperature,A3代表humidity,A4代表wind,C代表class(分類),play ball。用tenserflow的角度來看A1,A2,A3,…,An就是feature(輸入x),維度是[data_size * n],C對應的就是y(label),用輸入x去預測y。
基本思想
說回樸素貝葉斯分類,給一個未知C的樣本X,其中樣本X={a1,a2,a3,…,an},(這裡A可以是向量,但是為了化簡就用小寫的a作標量)我們的目標就是為樣本X預測C,那我們要求的 C = a r g m a x C i P ( C i ∣ X ) C=argmax_{C_i}P(Ci|X) C=argmaxCiP(Ci∣X),換句話說就是求出使得P(C|X)取得最大值所對應的變數點C,這裡的C就作為預測結果,預測一次要計算的次數為class_size次,因為你要找出最大值,你得把所有的類別都算一次,這是基本思想。
計算要點
(p和P都是計算概率的意思,下面一致)
- 計算
P
(
C
i
∣
X
)
=
P
(
X
∣
C
i
)
⋅
P
(
C
i
)
P
(
X
)
P(Ci|X)=\frac{P(X|C_i)·P(C_i)}{P(X)}
- 如何計算P(Ci|X)還是會遇到的一個問題就是如何計算p(x|C),這要分兩種情況討論,一個是離散型,離散型的話就比較簡單了,直接數就行了,計算資料集中屬性為x並且類別為C的樣本點的個數/類別為C的樣本點的個數,但如果是數值型,樸素貝葉斯分類做出了第二個假設:屬性服從高斯分佈,公式太長不好打,放圖了
虛擬碼
虛擬碼來自課本
拉普拉斯平滑處理
laplace估計,主要是用來解決條件概率為0的問題,在計算條件概率P(X|Y),分母+l,分子+l*p,l為等價樣本大小的引數(一般l取原本分母的值),p為使用者指定引數,使用者進行調節。其實在深度學習中常用的還是分子+1,分母+對應類別樣本數
對數解決溢位為0
因為概率過於的小同時要進行累乘,計算機計算後會發現結果為0,某種程度上來說,我們計算貝葉斯分類最終目的不是得到真實值是多少,而是比較哪一個為最大值,為了解決溢位為0的問題可以採取的措施是在計算後驗概率前面加log,由累乘轉化為累加,進而解決溢位問題,機器學習的loss函式、語言模型概率計算都用了這個處理。
小結
優點:容易實現,大多數情況下效果較好
缺點:假設前提是滿足獨立性和高斯分佈,而在實際情況中會更為複雜。