機器學習基礎——讓你一文學會朴素貝葉斯模型


今天這篇文章和大家聊聊朴素貝葉斯模型,這是機器學習領域非常經典的模型之一,而且非常簡單,適合初學者入門。

朴素貝葉斯模型,顧名思義和貝葉斯定理肯定高度相關。之前我們在三扇門游戲的文章當中介紹過貝葉斯定理,我們先來簡單回顧一下貝葉斯公式:

\[P(A|B)=\frac{P(A)P(B|A)}{P(B)} \]

我們把\(P(A)\)\(P(B)\)當做先驗概率,那么貝葉斯公式就是通過先驗和條件概率推算后驗概率的公式。也就是尋果溯因,我們根據已經發生的事件去探究導致事件發生的原因。而朴素貝葉斯模型正是基於這個原理,它的原理非常朴素,朴素到一句話就可以概率:當一個樣本有可能屬於多個類別的時候,我們簡單地選擇其中概率最大的那個。

所以,既然是選擇樣本所屬的類別,顯然朴素貝葉斯模型是一個分類算法

在我們具體介紹算法原理之前,我們先來熟悉幾個概念。其中幾個概念在我們之前的文章當中也介紹過,這里就當做復習。


先驗概率


先驗概率其實很好理解,我們先不管里面”先后“這兩個字。說白了,其實先驗概率就是我們可以事先通過做實驗計算的概率。比如拋硬幣正面朝上,比如在一個路口遇到紅燈,再比如明天會下雨。

這些事情,有些是我們可以通過實驗得到的,有些是可以根據之前的經驗估計的。在我們問題當中,這些事件的概率是相對明確的。可以認為是我們在做模型探究之前就可以確定的概率,所以稱為先驗概率。


后驗概率


后驗概率從直觀上來看與先驗概率相反,是我們通過實驗或者是之前的經驗沒有辦法直接獲取的。它更多的指的是某個事件由於某個原因或者是另一個事件導致的概率。

舉個例子來說,一個學生參加考試,能夠及格的概率是可以測量的。無論通過一個學生多次考試進行測試,還是批量學生進行統計,都是可行的。但假設學生在考試之前可以選擇復習或者是打游戲,顯然,復習會提升學生通過的概率,打游戲可能會降低也可能變化不大,我們不得而知。假設我們知道小明已經通過了考試,想要知道他在考試之前有沒有復習,這就是一個后驗概率

從邏輯上來看,它和條件概率恰好相反。條件概率是事件A發生的前提下會發生事件B的概率,而后驗概率是已經知道事件B發生了,求事件A發生的概率。


似然估計


這也是一個爛大街的詞,所有介紹貝葉斯的文章,沒有一個不提到這個詞的。但是很少有文章能夠將這個概念講解清楚。

似然的英文是likelihood,從語義上來說它和概率(probability)非常接近,可能只是翻譯的時候做了區分。兩者在數學公式上的表示也非常接近,都可以寫成\(P(x|\theta)\)

其中概率求的是已經知道參數\(\theta\),事件x發生的概率。而似然側重事件A發生時的參數\(\theta\)。那么自然,似然估計函數就是通過概率分布估計參數的函數了。最大似然估計也就好理解了,就是求事件A發生時,最有可能的參數\(\theta\)的值。

舉個很簡單的例子,假設我們有一個不透明的黑箱,里面有若干個黑球和若干個白球。但我們不知道到底黑球有幾個白球有幾個。為了探索這個比例,我們有放回地從箱子當中取出10個球,假設最終結果是7黑3白,那么請問箱子里黑球的比例是多少?

這題簡直不能更簡單,不是小學生的問題么?既然取了10次里面有7個黑球,那顯然黑球的概率應該是70%啊,這有什么問題嗎?

表面上當然毫無問題,但實際上不對。因為我們實驗得到的實驗結果並不代表概率本身,簡單來說,箱子里黑球是70%可以出現7黑3白,箱子里黑球是50%也一樣可以出現這個結果,我們怎么能判斷箱子里黑球一定是70%呢?

這個時候就要用到似然函數了。


似然函數


我們把剛才黑白球的實驗代入到上面的似然估計的公式當中去,實驗最后得到的結果是確定的,是事件x。我們要求的,也就是黑球的比例是參數\(\theta\)。由於我們是有放回的實驗,所以每次拿出黑球的概率是不變的,根據二項分布,我們可以寫出事件x發生的概率:

\[P(x|\theta)=\theta^7*(1-\theta)^3=f(\theta) \]

這個式子就是我們的似然函數,也叫概率函數。它反映不同的參數下,事件x發生的概率。我們要做的就是根據這個函數計算出\(f(\theta)\)最大時\(\theta\)的取值。

這個計算過程就很簡單了,我們對\(\theta\)求導,然后令導數等於0,然后求出此時對應的\(\theta\)的取值。最后的結果當然是\(\theta=0.7\)時方程有最大值。

我們也可以把\(f(\theta)\)的函數圖像畫出來,直觀地感受概率分布。

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 1, 100)
y = np.power(x, 7) * np.power(1 - x, 3)

plt.plot(x, y)
plt.xlabel('value of theta')
plt.ylabel('value of f(theta)')
plt.show()

這也就證明了,我們直觀的感受是對的。不是因為我們拿出來黑球的概率是70%箱子里黑球的比例就是70%,而是箱子里黑球比例是70%拿出來黑球占70%的概率最大


模型詳解


接下來就到了重頭戲,我們還是先看貝葉斯公式:

\[P(A|B)=\frac{P(A)P(B|A)}{P(B)} \]

我們接下來對公式進行一個變形,我們假設與B事件有關的所有事件的集合為C。顯然\(A \in C\),假設C集合中一個有m個事件,分別寫成: \(C_1, C_2, \cdots, C_m\)

那么

\(P(B)=\sum_{i=1}^mP(B|C_i)P(C_i)\)

我們在追尋事件B發生的原因的時候,會追尋出所有可能導致這個結果的參數集合C,然后從其中挑選出概率最大的那個作為結果。

我們用它來分類的原理也是一樣,對於一個樣本x,我們會計算出它分別屬於所有類別的概率,然后選擇其中概率最大的一個作為最終預測的類別。這個朴素的思想就是朴素貝葉斯模型的原理。

我們假設\(x=\{a_1, a_2, \cdots, a_n\}\),其中的每一個a表示樣本x的一個維度的特征。同樣,我們還會有一個類別的集合\(C=\{y_1, y_2, \cdots, y_m\}\),其中的每一個y表示一個特定的類別。我們要做的就是計算出x屬於各個類別y的概率,選擇其中概率最大的那個作為最終的分類結果。

我們根據貝葉斯公式寫出概率公式:

\[P(y_i|x)=\frac{P(x|y_i)P(y_i)}{P(x)} \]

其中\(P(x)\)是一個常量,對於所有的\(y_i\)保持不變,所以可以忽略,我們只需要關注分子的部分。

這里,我們做一個重要的假設:我們假設樣本x中各個維度的特征值彼此是獨立的。

這個假設非常朴素,但是也非常重要,如果沒有這個假設,那么這里的概率會復雜到我們幾乎無法計算。正是因為有了這個朴素的假設,所以才會稱作是朴素貝葉斯模型,這也是得名的原因。當然,英文是naive bayes,所以理論上來說稱作是乃衣服貝葉斯也是可以的。

有了這個假設之后就好辦了,我們把公式展開就行:

\(P(y_i|x)=P(y_i)P(a_1|y_i)P(a_2|y_i)\cdots P(a_n|y_i)=P(y_i)\prod_{j=1}^nP(a_j|y_i)\)

其中\(P(y_i)\)是先驗概率,我們可以通過實驗或者是其他方法得到,像是\(P(a_j|y_i)\)就不能直接得到了,就需要我們用統計的方法來計算。

如果\(a_j\)是離散值,很簡單,我們只需要統計\(y_i\)事件發生時,各個\(a_j\)的實現比例即可。假設我們實驗了若干次,\(y_i\)一共發生了M次,\(a_j\)發生了N次,那么顯然:

\[P(a_j|y_i)=\frac{N}{M} \]

為了防止M=0,我們可以在分子和分母上同時加上一個平滑參數,所以最終的結果寫成:

\[P(a_j|y_i)=\frac{N+\alpha}{M+\beta} \]

但如果\(a_j\)是連續值應該怎么辦?如果它是連續值,那么它的取值可能是無數多種。那么顯然,我們不可能針對它的每一個取值都去計算概率。也不可能搜集到這么多樣本。這種情況下我們應該怎么辦呢?

連續值也沒關系,我們可以假設變量的分布滿足正態分布。它的正態分布曲線其實就是這個變量的概率分布

用上圖舉個例子,我們觀察最下面的累積百分比這個值。它其實代表x的位置與負無窮之間隔成的區域的面積。這個面積的取值范圍是0-1,我們就可以用這個面積的值來代表f(x)的概率。實際上假設變量服從不同維度的正態分布,其實就是高斯混合模型(GMM)的思想了,這里點到為止,不做過多展開。

也就是說,如果是離散值,那么我們就通過計算比例的方式來代表概率,如果是連續值,那么就通過正態分布計算概率分布的方法來計算概率。通過這種方法,我們就可以通過n個\(P(a_j|y_i)\)連乘得到\(P(y_i|x)\)的概率,最后,我們比較所有y對應的概率,選擇其中最大的那個作為分類結果。

以上流程完全正確,但是還存在一個小小的問題。

\(P(a_j|y_i)\)是一個浮點數,而且很有可能非常小,而我們需要計算n個浮點數的乘積。由於存在精度誤差,所以當連乘的結果小於精度的時候,就無法比較兩個概率之間的大小了。

為了解決這個問題,我們需要對浮點數的連乘做一個變形:我們對等式的左右兩邊取log。將若干個浮點數相乘,轉化成相加:

\[\begin{eqnarray} P(y_i|x) &= P(y_i)P(a_1|y_i)P(a_2|y_i)\cdots P(a_n|y_i) &= P(y_i)\prod_{j=1}^nP(a_j|y_i) \\ \log(P(y_i|x)) &= \log(P(y_i))+ \log(P(a_1|y_i)) + \cdots + log(P(a_n|y_i)) &= \log(P(y_i|x)) + \sum_{i=1}^n \log(P(a_i|y_i)) \end{eqnarray} \]

由於對數函數是單調函數,所以我們可以直接用取完對數之后的結果來比大小,就可以避免精度帶來的影響了。

以上就是貝葉斯模型的原理,在之后的文章當中會給大家分享貝葉斯模型在文本分類當中的應用。

更文不易,如果有所收獲,求個**關注*


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM