Naive Bayes(樸素貝葉斯)

Naive Bayes

Bayes’ theorem(貝葉斯法則)

在概率論和統計學中,Bayes’ theorem(貝葉斯法則)根據事件的先驗知識描述事件的概率。貝葉斯法則表達式如下所示:

(1)P(A|B)=P(B|A)P(A)P(B)
  • P(A|B) – 在事件B下事件A發生的條件概率
  • P(B|A) – 在事件A下事件B發生的條件概率
  • P(A), P(B) – 獨立事件A和獨立事件B的邊緣概率

Bayesian inferenc(貝葉斯推斷)

貝葉斯定理的許多應用之一就是貝葉斯推斷,一種特殊的統計推斷方法,隨着信息增加,貝葉斯定理可以用於更新假設的概率。在決策理論中,貝葉斯推斷與主觀概率密切相關,通常被稱爲“Bayesian probability(貝葉斯概率)”。

貝葉斯推斷根據 prior probability(先驗概率) 和統計模型導出的“likelihood function(似然函數)”的結果,再由貝葉斯定理計算 posterior probability(後驗概率):

(2)P(H|E)=P(E|H)P(H)P(E)
  • P(H) – 已知的先驗概率
  • P(H|E) – 我們想求的後驗概率,即在B事件發生後對於事件A概率的評估
  • P(E|H) – 在事件H下觀測到E的概率
  • P(E) – marginal likelihood(邊際似然),對於所有的假設都是相同的,因此不參與決定不同假設的相對概率
  • P(E|H)/P(E) – likelihood function(可能性函數),這是一個調整因子,通過不斷的獲取信息,可以使得預估概率更接近真實概率

貝葉斯推斷例子

假設我們有兩個裝滿了餅乾的碗,第一個碗裏有10個巧克力餅乾和30個普通餅乾,第二個碗裏兩種餅乾都有20個。我們隨機挑一個碗,再在碗裏隨機挑餅乾。那麼我們挑到的普通餅乾來自一號碗的概率有多少?

我們用 H1 代表一號碗,H2 代表二號碗,而且 P(H1) = P(H2) = 0.5。事件 E 代表普通餅乾。由上面可以得到 P(E|H1) = 30 / 40 = 0.75,P(E|H2) = 20 / 40 = 0.5。由貝葉斯定理我們可以得到:

(3)P(H1|E)=P(E|H1)P(H1)P(E|H1)P(H1)+P(E|H2)P(H2)(4)=0.75×0.50.75×0.5+0.5×0.5(5)=0.6
  • P(E|H1)P(H1), P(E|H2)P(H2) – 分別表示拿到來自一號碗的普通餅乾、來自二號碗的普通餅乾的概率
  • P(E|H1)P(H1) + P(E|H2)P(H2) – 表示拿到普通餅乾的概率

在我們拿到餅乾前,我們會選到一號碗的概率是先驗概率 P(H1),在拿到了餅乾後,我們要得到是後驗概率 P(H1|E)

Naive Bayes Classifiers(樸素貝葉斯分類器)

在機器學習中,樸素貝葉斯分類器是一個基於貝葉斯定理的比較簡單的概率分類器,其中 naive(樸素)是指的對於模型中各個 feature(特徵) 有強獨立性的假設,並未將 feature 間的相關性納入考慮中。

樸素貝葉斯分類器一個比較著名的應用是用於對垃圾郵件分類,通常用文字特徵來識別垃圾郵件,是文本分類中比較常用的一種方法。樸素貝葉斯分類通過選擇 token(通常是郵件中的單詞)來得到垃圾郵件和非垃圾郵件間的關聯,再通過貝葉斯定理來計算概率從而對郵件進行分類。

由單個單詞分類郵件

假設可疑消息中含有“sex”這個單詞,平時大部分收到郵件的人都會知道,這封郵件可能是垃圾郵件。然而分類器並不知道這些,它只能計算出相應的概率。假設在用戶收到的郵件中,“sex”出現在在垃圾郵件中的頻率是5%,在正常郵件中出現的概率是0.5%。

我們用 S 表示垃圾郵件(spam),H 表示正常郵件(healthy)。兩者的先驗概率都是50%,即:

(6)P(S)=P(H)=50%

我們用 W 表示這個詞,那麼問題就變成了計算 P(S|W) 的值,根據貝葉斯定理我們可以得到:

(7)P(S|W)=P(W|S)P(S)P(W|S)P(S)+P(W|H)P(H)

P(W|S)和P(W|H)的含義是,這個詞語在垃圾郵件和正常郵件中,分別出現的概率。通過計算可以得到 P(S|W) = 99.0%,說明“sex”的判斷能力很強,將50%的先驗概率提高到了99%的後驗概率。

結合獨立概率

大多數貝葉斯垃圾郵件分類器基於這樣的假設:郵件中的單詞是獨立的事件,實際上這種條件一般不被滿足,這也是爲什麼被稱作樸素貝葉斯。這是對於應用情景的理想化,在此基礎上,我們可以通過貝葉斯定理得到以下公式:

(8)p=p1p2...pNp1p2...pN+(1p1)(1p2)...(1pN)
  • p 是可疑郵件是垃圾郵件的概率
  • pN 當郵件中包含第 Nth 個單詞時郵件是垃圾郵件的概率 p(S|WN)

對於輸出的概率,我們將它和一個 threshold(閾值)相比較,小於閾值的是正常郵件,否則認爲它是垃圾郵件。

Parameter estimation and event model(參數估計和事件模型)

每一個分類的先驗概率可以通過假設它們等概率(即先驗概率 = 1 /(類別樹)),或者通過從訓練集中計算類別概率的估計得到(即先驗概率 = 該分類的樣本數 / 總樣本數)。爲了估計特徵分佈的參數,必須爲訓練集中的特徵假設特徵分佈或者生成非參數模型。

特徵分佈的假設被稱爲樸素貝葉斯分類器的 event model(事件模型)。對於文檔分類中遇到的離散事件,多項分佈和伯努利分佈比較適合。這些對於特徵分佈的不同的假設會導致最後結果並不完全相同,這些概念也經常被混淆。

Gaussian naive Bayes(高斯樸素貝葉斯)

處理連續數據的時候,一個比較典型的假設是與每個分類相關的連續值是按照高斯分佈分佈的。假設訓練集中包含連續值 x,我們按照類別將數據分類,並計算每個分類的均值和偏差。μk是對應類別 Ck 下 x 值的均值,σk2是方差。假設我們已經收集到一些觀測值 v。在給定分類 Ck 下 v 的概率分佈 p(x = v | Ck 可以通過將 v 帶入到由 μk 和 σk2 決定的高斯分佈公式中得到。

高斯樸素貝葉斯

Multinomial naive Bayes(多項式樸素貝葉斯)

對於一個多項分佈事件模型,樣本表示了一個特定事件出現的頻率,由多項分佈(p1, p2, …, pn)產生,其中,pi 表示事件 i 發生的頻率。特徵向量 X = (x1, …, xn)可以用直方圖來表示,其中 xi 表示事件 i 在特定特定情境下被觀察到的次數。這是個典型的用於文檔分類的事件模型,其中事件表示在單個文檔中某個單詞的出現。觀察到特徵向量的可能性爲:

多項式樸素貝葉斯

在對數空間中,多項樸素貝葉斯分類器變成了線性分類器:

對數空間的多項式樸素貝葉斯

其中 b = log p(Ck),wki = log pki

如果給定的類別和特徵在訓練集沒有一起出現,那麼基於頻率的概率估計就爲0。當它們相乘時,將消除其他概率中的所有信息。因此我們通常希望在所有概率估計中包含被稱爲 pseudocount(僞計數)的小樣本校正,防止由估計概率被設置爲0.這種規則化樸素貝葉斯的方法被稱爲 Laplace smoothing(拉普拉斯平滑),當僞計數爲1時,一般情況下使用 Lidstone smoothing(萊德斯通平滑)。

Bernoulli naive Bayes(伯努利樸素貝葉斯)

在多元伯努利事件模型中,特徵是描述輸入的二元變量。和多項式模型一樣,這個模型通常用於文本分類,其中使用的是二項出現特徵而不是詞頻。如果 xi 是用於描述詞表中第 i 個單詞是否出現的二元變量, 文檔中給定分類 Ck 的可能性爲:

伯努利樸素貝葉斯

其中 pki 表示分類 Ck 產生單詞 xi 的可能性。這個事件模型特別適合用於短文本分類。

Python 用法

numpy.meshgrid

Return coordinate matrices from coordinate vectors.
Make N-D coordinate arrays for vectorized evaluations of N-D scalar/vector fields over N-D grids, given one-dimensional coordinate arrays x1, x2,…, xn.

>>> import numpy as np
>>> x, y = np.meshgrid(np.arange(0, 3), np.arange(0, 2))
>>> x
array([[0, 1, 2],
       [0, 1, 2]])
>>> y
array([[0, 0, 0],
       [1, 1, 1]])

根據給定的座標向量創建座標矩陣。在上面的例子中,所得到的是 X 軸上 [0, 1, 2] 和 Y 軸上 [0, 1] 構成的一個 3x2 的網格,共有 6 個點。返回的兩個值中的 x 是這 6 個點 在 X 軸上的投影, y 則是這 6 個點在 y 軸的投影。

通常我們將 meshgrid 用於繪製圖形:

import numpy as np
import matplotlib.pyplot as plt
plt.style.use('ggplot')

x, y = np.meshgrid(np.arange(-1, 1, 0.01), np.arange(-1, 1, 0.01))

contor = np.sqrt(x ** 2 + y ** 2)

plt.figure()
plt.imshow(contor)
plt.colorbar()
plt.grid(False)
plt.show()

meshgrid

numpy.c_ (CClass object)

Translates slice objects to concatenation along the second axis.

>>> np.c_[np.array([1,2,3]), np.array([4,5,6])]
array([[1, 4],
       [2, 5],
       [3, 6]])
>>> np.c_[np.array([[1,2,3]]), 0, 0, np.array([[4,5,6]])]
array([[1, 2, 3, 0, 0, 4, 5, 6]])

將切片對象沿第二個軸(按列)轉換爲連接。

numpy.ravel

Return a contiguous flattened array.
A 1-D array, containing the elements of the input, is returned. A copy is made only if needed.

>>> import numpy as np
>>> x = np.array([[1, 2], [3, 4]])
>>> y = np.array([[1, 2], [3, 4]])
>>> x.flatten()[1]  = 100
>>> x
array([[1, 2],
       [3, 4]])
>>> y.ravel()[1]  = 100
>>> y
array([[  1, 100],
       [  3,   4]])

numpy.quiver 將多維數組降低爲一位數組,和 numpy.flatten 實現的功能一樣。兩者的區別在於返回 copy 還是返回視圖 view,numpy.flatten 返回一份拷貝,對拷貝所做的修改不會影響原始矩陣,而 numpy.ravel() 返回的是視圖 view,會影響原始矩陣。

matplotlib.pyplot.pcolormesh

Create a pseudocolor plot of a 2-D array.

pyplot.pcolormesh 用於創建一個 2D 數組的僞彩色圖。pcolormesh 類似於 pcolor,pcolor 返回的是 PolyCollection,但 pcolormesh 返回的是 QuadMesh。pcolormesh要快得多,所以對於大型數組來說,pcolormesh是首選。

import numpy as np
import matplotlib.pyplot as plt
plt.style.use('ggplot')

x_min = 0.0
x_max = 1.0
y_min = 0.0
y_max = 1.0

# create data grid
h = .01
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))

# create classification
grid = np.c_[xx.flatten(), yy.flatten()]

pred = np.zeros((grid.shape[0], 1))

for i in xrange(0, len(grid)):
    if i >= (grid.shape[0] / 2):
        pred[i] = 1

pred = pred.reshape(xx.shape, order='F')

# plot figure
plt.figure()
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.pcolormesh(xx, yy, pred)
plt.show()

pcolormesh

Reference

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章