譯文 樸素貝葉斯算法總結

在所有的機器學習分類算法中,樸素貝葉斯和其他絕大多數的分類算法都不同。對于大多數的分類算法,比如決策樹,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) = \sum\limits_{k}P(X|Y =Y_k)P(Y_k) 其中\sum\limits_{k}P(Y_k)=1$$

從上面的公式很容易得出貝葉斯公式:

$$P(Y_k|X) = \frac{P(X|Y_k)P(Y_k)}{\sum\limits_{k}P(X|Y =Y_k)P(Y_k)}$$

2. 樸素貝葉斯的模型

從統計學知識回到我們的數據分析。假如我們的分類模型樣本是:$$(x_1^{(1)}, x_2^{(1)}, ...x_n^{(1)}, y_1), (x_1^{(2)}, x_2^{(2)}, ...x_n^{(2)},y_2), ... (x_1^{(m)}, x_2^{(m)}, ...x_n^{(m)}, y_n)$$

即我們有m個樣本,每個樣本有n個特征,特征輸出有K個類別,定義為${C_1,C_2,...,C_K}$。

從樣本我們可以學習得到樸素貝葉斯的先驗分布$P(Y=C_k)(k=1,2,...K)$,接著學習到條件概率分布$P(X=x|Y=C_k) = P(X_1=x_1, X_2=x_2,...X_n=x_n|Y=C_k)$,然后我們就可以用貝葉斯公式得到X和Y的聯合分布P(X,Y)了。聯合分布P(X,Y)定義為:

$$ \begin{align} P(X,Y=C_k) &= P(Y=C_k)P(X=x|Y=C_k) \\&= P(Y=C_k)P(X_1=x_1, X_2=x_2,...X_n=x_n|Y=C_k) \end{align}$$

從上面的式子可以看出$ P(Y=C_k)$比較容易通過最大似然法求出,得到的$ P(Y=C_k)$就是類別$C_k$在訓練集里面出現的頻數。但是$P(X_1=x_1, X_2=x_2,...X_n=x_n|Y=C_k)$很難求出,這是一個超級復雜的有n個維度的條件分布。樸素貝葉斯模型在這里做了一個大膽的假設,即X的n個維度之間相互獨立,這樣就可以得出:

$$P(X_1=x_1, X_2=x_2,...X_n=x_n|Y=C_k) = P(X_1=x_1|Y=C_k)P(X_2=x_2|Y=C_k)...P(X_n=x_n|Y=C_k)$$

從上式可以看出,這個很難的條件分布大大的簡化了,但是這也可能帶來預測的不準確性。你會說如果我的特征之間非常不獨立怎么辦?如果真是非常不獨立的話,那就盡量不要使用樸素貝葉斯模型了,考慮使用其他的分類方法比較好。但是一般情況下,樣本的特征之間獨立這個條件的確是弱成立的,尤其是數據量非常大的時候。雖然我們犧牲了準確性,但是得到的好處是模型的條件分布的計算大大簡化了,這就是貝葉斯模型的選擇。

最后回到我們要解決的問題,我們的問題是給定測試集的一個新樣本特征$(x_1^{(test)}, x_2^{(test)}, ...x_n^{(test)}$,我們如何判斷它屬于哪個類型?

既然是貝葉斯模型,當然是后驗概率最大化來判斷分類了。我們只要計算出所有的K個條件概率$P(Y=C_k|X=X^{(test)})$,然后找出最大的條件概率對應的類別,這就是樸素貝葉斯的預測了。

3. 樸素貝葉斯的推斷過程

上節我們已經對樸素貝葉斯的模型也預測方法做了一個大概的解釋,這里我們對樸素貝葉斯的推斷過程做一個完整的詮釋過程。

我們預測的類別$C_{result}$是使$P(Y=C_k|X=X^{(test)})$最大化的類別,數學表達式為:

$$ \begin{align} C_{result} & = \underbrace{argmax}_{C_k}P(Y=C_k|X=X^{(test)}) \\& = \underbrace{argmax}_{C_k}P(X=X^{(test)}|Y=C_k)P(Y=C_k) \Bigg{/}P(X=X^{(test)}) \end{align}$$

由于對于所有的類別計算$P(Y=C_k|X=X^{(test)})$時,上式的分母是一樣的,都是$P(X=X^{(test)}$,因此,我們的預測公式可以簡化為:

$$ C_{result} = \underbrace{argmax}_{C_k}P(X=X^{(test)}|Y=C_k)P(Y=C_k) $$

接著我們利用樸素貝葉斯的獨立性假設,就可以得到通常意義上的樸素貝葉斯推斷公式:

$$ C_{result} = \underbrace{argmax}_{C_k}P(Y=C_k)\prod_{j=1}^{n}P(X_j=X_j^{(test)}|Y=C_k) $$

4. 樸素貝葉斯的參數估計

在上一節中,我們知道只要求出$P(Y=C_k)和P(X_j=X_j^{(test)}|Y=C_k)(j=1,2,...n)$,我們通過比較就可以得到樸素貝葉斯的推斷結果。這一節我們就討論怎么通過訓練集計算這兩個概率。

對于$P(Y=C_k)$,比較簡單,通過極大似然估計我們很容易得到$P(Y=C_k)$為樣本類別$C_k$出現的頻率,即樣本類別$C_k$出現的次數$m_k$除以樣本總數m。

對于$P(X_j=X_j^{(test)}|Y=C_k)(j=1,2,...n)$,這個取決于我們的先驗條件:

a) 如果我們的$X_j$是離散的值,那么我們可以假設$X_j$符合多項式分布,這樣得到$P(X_j=X_j^{(test)}|Y=C_k)$ 是在樣本類別$C_k$中,$X_j^{(test)}$出現的頻率。即:

$$P(X_j=X_j^{(test)}|Y=C_k) = \frac{m_{kj^{test}}}{m_k}$$

其中$m_k$為樣本類別$C_k$出現的次數,而$m_{kj^{test}}$為類別為$C_k$的樣本中,第j維特征$X_j^{(test)}$出現的次數。

某些時候,可能某些類別在樣本中沒有出現,這樣可能導致$P(X_j=X_j^{(test)}|Y=C_k)$為0,這樣會影響后驗的估計,為了解決這種情況,我們引入了拉普拉斯平滑,即此時有:

$$P(X_j=X_j^{(test)}|Y=C_k) = \frac{m_{kj^{test}} + \lambda}{m_k + n\lambda}$$

其中$\lambda$ 為一個大于0的常數,常常取為1。

b)如果我們我們的$X_j$是非常稀疏的離散值,即各個特征出現概率很低,這時我們可以假設$X_j$符合伯努利分布,即特征$X_j$出現記為1,不出現記為0。即只要$X_j$出現即可,我們不關注$X_j$的次數。這樣得到$P(X_j=X_j^{(test)}|Y=C_k)$ 是在樣本類別$C_k$中,$X_j^{(test)}$出現的頻率。此時有:

$$P(X_j=X_j^{(test)}|Y=C_k) = P(j|Y=C_k)X_j^{(test)} + (1 - P(j|Y=C_k)(1-X_j^{(test)})$$

其中,$X_j^{(test)}$取值為0和1。

c)如果我們我們的$X_j$是連續值,我們通常取$X_j$的先驗概率為正態分布,即在樣本類別$C_k$中,$X_j$的值符合正態分布。這樣$P(X_j=X_j^{(test)}|Y=C_k)$的概率分布是:

$$P(X_j=X_j^{(test)}|Y=C_k) = \frac{1}{\sqrt{2\pi\sigma_k^2}}exp\Bigg{(}-\frac{(X_j^{(test)} - \mu_k)^2}{2\sigma_k^2}\Bigg{)}$$

其中$\mu_k和\sigma_k^2$是正態分布的期望和方差,可以通過極大似然估計求得。$\mu_k$為在樣本類別$C_k$中,所有$X_j$的平均值。$\sigma_k^2$為在樣本類別$C_k$中,所有$X_j$的方差。對于一個連續的樣本值,帶入正態分布的公式,就可以求出概率分布了。

5. 樸素貝葉斯算法過程

我們假設訓練集為m個樣本n個維度,如下:

$$(x_1^{(0)}, x_2^{(0)}, ...x_n^{(0)}, y_0), (x_1^{(1)}, x_2^{(1)}, ...x_n^{(1)},y_1), ... (x_1^{(m)}, x_2^{(m)}, ...x_n^{(m)}, y_n)$$

共有K個特征輸出類別,分別為${C_1,C_2,...,C_K}$,每個特征輸出類別的樣本個數為${m_1,m_2,...,m_K}$,在第k個類別中,如果是離散特征,則特征$X_j$各個類別取值為$m_{jl}$。其中l取值為$1,2,...S_j$,$S_j$為特征j不同的取值數。

輸出為實例$X^{(test)}$的分類。

算法流程如下:

1) 如果沒有Y的先驗概率,則計算Y的K個先驗概率:$P(Y=C_k) = m_k/m$,否則$P(Y=C_k)$為輸入的先驗概率。

2) 分別計算第k個類別的第j維特征的第l個個取值條件概率:$P(X_j=x_{jl}|Y=C_k)$

a)如果是離散值:

$$P(X_j=x_{jl}|Y=C_k) = \frac{x_{jl} + \lambda}{m_k + n\lambda}$$

$\lambda$可以取值為1,或者其他大于0的數字。

b)如果是稀疏二項離散值:$$P(X_j=x_{jl}|Y=C_k) = P(j|Y=C_k)x_{jl} + (1 - P(j|Y=C_k)(1-x_{jl}) $$

此時$l$只有兩種取值。

c)如果是連續值不需要計算各個l的取值概率,直接求正態分布的參數:

$$P(X_j=x_j|Y=C_k) = \frac{1}{\sqrt{2\pi\sigma_k^2}}exp\Bigg{(}-\frac{(x_j - \mu_k)^2}{2\sigma_k^2}\Bigg{)}$$

需要求出$\mu_k和\sigma_k^2$。 $\mu_k$為在樣本類別$C_k$中,所有$X_j$的平均值。$\sigma_k^2$為在樣本類別$C_k$中,所有$X_j$的方差。

3)對于實例$X^{(test)}$,分別計算:

$$P(Y=C_k)\prod_{j=1}^{n}P(X_j=x_j^{(test)}|Y=C_k) $$

4)確定實例$X^{(test)}$的分類$C_{result}$

$$C_{result} = \underbrace{argmax}_{C_k}P(Y=C_k)\prod_{j=1}^{n}P(X_j=X_j^{(test)}|Y=C_k) $$

從上面的計算可以看出,沒有復雜的求導和矩陣運算,因此效率很高。

6. 樸素貝葉斯算法小結

樸素貝葉斯算法的主要原理基本已經做了總結,這里對樸素貝葉斯的優缺點做一個總結。

樸素貝葉斯的主要優點有:

1)樸素貝葉斯模型發源于古典數學理論,有穩定的分類效率。

2)對小規模的數據表現很好,能個處理多分類任務,適合增量式訓練,尤其是數據量超出內存時,我們可以一批批的去增量訓練。

3)對缺失數據不太敏感,算法也比較簡單,常用于文本分類。

樸素貝葉斯的主要缺點有:

1) 理論上,樸素貝葉斯模型與其他分類方法相比具有最小的誤差率。但是實際上并非總是如此,這是因為樸素貝葉斯模型假設屬性之間相互獨立,這個假設在實際應用中往往是不成立的,在屬性個數比較多或者屬性之間相關性較大時,分類效果不好。而在屬性相關性較小時,樸素貝葉斯性能最為良好。對于這一點,有半樸素貝葉斯之類的算法通過考慮部分關聯性適度改進。

2)需要知道先驗概率,且先驗概率很多時候取決于假設,假設的模型可以有很多種,因此在某些時候會由于假設的先驗模型的原因導致預測效果不佳。

3)由于我們是通過先驗和數據來決定后驗的概率從而決定分類,所以分類決策存在一定的錯誤率。

4)對輸入數據的表達形式很敏感。

以上就是樸素貝葉斯算法的一個總結,希望可以幫到朋友們。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,367評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,001評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,213評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,535評論 1 308
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,317評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,868評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,963評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,090評論 0 285
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,599評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,549評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,712評論 1 367
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,233評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,961評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,353評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,607評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,321評論 3 389
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,686評論 2 370

推薦閱讀更多精彩內容

  • 忘光了概率統計的知識還想學樸素貝葉斯算法?這一篇就是為你準備的。雖然如此,作為初學者,別指望 5 分鐘就能完全理解...
    kamidox閱讀 2,724評論 4 7
  • 【博客的主要內容主要是自己的學習筆記,并結合個人的理解,供各位在學習過程中參考,若有疑問,歡迎提出;若有侵權,請告...
    Paullu閱讀 2,265評論 0 11
  • 一、實驗目的 學習使用 weka 中的常用分類器,完成數據分類任務。 二、實驗內容 了解 weka 中 explo...
    yigoh閱讀 8,600評論 5 4
  • 一年級語文上冊生字表 生字表一(共400字) 啊(ā)愛(ài)安(ān)岸(àn)爸(bà)八(bā)巴(bā)...
    meychang閱讀 2,828評論 0 6
  • 你背一捆荊棘下山 帶來了萬家燈火 你削尖骨頭破開巖石 換來的清泉是你的血在流 而如今我眼中的星光點點 是你精確計算...
    扁竹桃仙人閱讀 280評論 5 5