樸素貝葉斯是經典的機器學習算法之一,同時也是爲數不多的基於概率論的分類算法。不過樸素貝葉斯算法相對而言,還是很簡單,很容易理解的。用一句話概括理解就是:通過已知數據判定未知數據的一個概率問題,多用於文本分類,比如垃圾郵件過濾等。
本篇主要從以下幾方面來總結:
- 基本概念
- 基於前提
- 三種實現方式
- 優化改進
- 延伸
宏觀見如下思維導圖:
一、基本概念:
1、定義
樸素貝葉斯法是基於貝葉斯定理與特徵條件獨立假設的分類方法。
2、“樸素”的含義
各樣本特徵間相互獨立;
就比如體重和身高是有直接關係的,但是我們在這裏就可以很天真的假設兩者是沒有任何關係的。樸素其實就是各樣本特徵間保持相互獨立。
二、基於前提
1、貝葉斯公式
根據如上可愛的圖,我們可以得到很多有用信息
在A發生的條件下,B發生的概率(A∩B的部分)
在B發生的條件下,A發生的概率(A∩B的部分)
推斷可得到:(貝葉斯公式)
- 先驗概率:P(A), P(B)
- 條件概率:P(A|B) ,P(B|A)
2、相互獨立
獨立的定義有多種表達方式。在討論概率問題時,獨立性是一種重要的基礎概念。常用的幾種表達如下:
- A與B獨立
- (條件概率與條件無關)P(A|B)=P(A|非B)
- (添加或去除條件不受影響)P(A|B)=P(A)
- (聯和概率之比相同)P(B|A):P(B|非A)=P(非B,A):P(非B,非A)
- ※(聯和概率是邊緣概率的乘積)P(B,A)=P(B)P(A)
我們可以舉一個很簡單明瞭的例子,見如下表格:
– | Y=松 | Y=竹 | Y=梅 |
---|---|---|---|
X=優 | |||
X=良 | |||
X=中 |
X 與Y是否相互獨立?
優: ::=1:2:3
良: ::=1:2:3
中: ::=1:2:3
根據第4種表達方式,聯合概率之比相同,松竹梅之間的比例和優良中是毫無關係的。這種比值的方式是最能直接了當看明白的。但是方式5是最能體現相互獨立的,計算流程如下:
P(松,優)=
P(松)=++=
P(優)=++=
P(松)P(優)== 滿足P(松,優)=P(松)*P(優)
P(松,良)=
P(良)=++=
P(松)P(良)== 滿足P(松,良)=P(松)*P(良)
P(松,中)=
P(中)=++=
P(松)P(中)== 滿足P(松,中)=P(松)*P(中)
同理:
P(竹,優)=P(竹)*P(優)
P(竹,良)=P(竹)*P(良)
P(竹,中)=P(竹)*P(中)
P(梅,優)=P(梅)*P(優)
P(梅,良)=P(梅)*P(良)
P(梅,中)=P(梅)*P(中)
看到以上計算流程,發現若是人工計算的話,居然還挺麻煩。但是最後一條便於計算,也是很合理的。(詳細可參考 《程序員的數學-概率論》)
三、三種常用模型
(2019年06月17日14:59:49-後期博客詳細說明)
- 基於伯努利模型,即先驗爲伯努利分佈的樸素貝葉斯
- 基於多項式模型,即先驗爲多項式分佈的樸素貝葉斯
- 基於高斯模型,即先驗爲高斯分佈的樸素貝葉斯
四、公式
從一個很簡單的下例子入手,然後理解公式。
掛科了(Y) | 玩遊戲(X1) | 喝酒(X2) | 學習(X3) |
---|---|---|---|
1 | 1 | 1 | 0 |
0 | 0 | 0 | 1 |
1 | 1 | 0 | 1 |
1 | 0 | 1 | 0 |
0 | 0 | 1 | 1 |
0 | 1 | 0 | 1 |
0 | 0 | 1 | 0 |
1 | 0 | 0 | 1 |
問題:我們來判定一個人,沒有玩遊戲,沒有喝酒,還學習了,掛科的概率?
通過如上的表格,我們可以得到如下的基本概率:
掛科了的概率:
不掛科的概率:
玩遊戲的概率:
不玩遊戲的概率:
喝酒了的概率:
沒喝酒的概率:
學習了的概率:
沒學習的概率:
玩遊戲了且掛科的概率:
喝酒了且掛科的概率:
學習了且掛科的概率:
條件概率:玩遊戲了且掛科的概率:
喝酒了且掛科的概率:
學習了且掛科的概率:
對於貝葉斯推論,由於上邊已經證明,所以這邊不多做描述。
我們可以通過X1舉例得到一個貝葉斯公式:
我們此刻重寫貝葉斯準則,其不僅僅與X1有關,而且與X2,X3都有關。
把X1替換成X1,X2,X3,即
X1,X2,X3之間是相互獨立的,在樸素貝葉斯中,假設所有條件都是相互獨立的,該假設也稱作條件獨立性假設,
意味着可以使用P(X1|Y)P(X2|Y)P(X3|Y)來計算 P(X1,X2,X3|Y)P(Y),也就是說
P(X1,X2,X3|Y)P(Y)≈P(X1|Y)P(X2|Y)P(X3|Y)
其中
所以P(Y|X1,X2,X3)≈P(X1|Y)P(X2|Y)P(X3|Y)P(Y),在此忽略了P(X1,X2,X3)
最終需要的問題是求:沒有玩遊戲,麼有喝酒,還學習了,掛科的概率是多少。
P(Y=0|X1=0,X2=0,X3=1)=
將如上的X1,X2,X3換成W,W爲一個向量,即它由多個數值組成,這就是我們的樸素貝葉斯公式
五、優化方式
1、拉普拉斯平滑
比如上邊的掛科的例子,我們來計算沒玩遊戲,沒喝酒,還學習了掛科與不掛科的概率
P(Y=0|X1=0,X2=0,X3=1)=P(X1|Y)P(X2|Y)P(X3|Y)P(Y)=*=
P(Y=1|X1=0,X2=0,X3=1)=P(X1|Y)P(X2|Y)P(X3|Y)P(Y)=*=
所以通過以上概率,我們可以分析得到,若不玩遊戲,不喝酒,還學習了,不掛科的概率比較大。
但是用極大似然估計法,有可能會出現所要估計的概率值爲0的情況,這會影響後驗概率的計算結果。這種情況我們則引入貝葉斯估計的情況,也就是專業術語,拉普拉斯平滑,加入一個參數λ,進行調和,來避免0的情況的發生。當λ=1的時候,就是拉普拉蘇平滑;當λ=0的時候,也就是極大似然估計。
其中K就是表示有幾種類別,我們都知道樸素貝葉斯算法是適用於標稱型數據的,也就是隻存在是和否兩種情況,掛科與否的例子,我們用了1和0兩種,所以K=2.加入λ的取值,我們計算的結果如下:
P(Y=0|X1=0,X2=0,X3=1)=P(X1|Y)P(X2|Y)P(X3|Y)P(Y)=*=
P(Y=1|X1=0,X2=0,X3=1)=P(X1|Y)P(X2|Y)P(X3|Y)P(Y)=*=
計算結果是不一樣的。
2、條件概率對數化
另一個遇到的問題則是下溢出,就依舊取值上述的例子,當P(X1|Y)P(X2|Y)P(X3|Y)太小時,當用python語言計算的時候會出現下溢出或者得不到正確的答案,這時候我們則可以通過取對數的方式來解決出錯的問題。(在手動計算是沒有問題的)
由上邊的圖我們可以瞭解到,f(x)與In(f(x))在相同的區域內會同時增加或者減少,並且在相同點上取到極值,取值雖然不同,但是由於樸素貝葉斯是一種分類的算法,所以並不影響最後的結果。
六、延伸 貝葉斯網絡
樸素貝葉斯是基於各特徵之間相互獨立的,直接計算條件概率進行分類,是最簡單的一種貝葉斯算法。而實際情況下,各特徵獨立這個條件是難以滿足的,此時需要使用貝葉斯網絡進行分類。本篇不多做介紹,後期學習。