極大似然估計與後驗概率估計

兩種參數估計的統計學方法


今天主要複習一下兩種參數估計的統計學方法,分別是極大似然估計(MLE)和最大後驗概率估計(MAP)。

  • 問題背景
  • MLE
  • MAP
  • MLE 與 MAP各自的優缺點
  • MLE與MAP之間的區別與聯繫

問題背景

以擲硬幣爲例。現在我們一共拋擲了10次硬幣,其結果爲{H,T,T,T,H,H,H,H,H,H}。我們假設硬幣朝上的概率爲P(θ)P(\theta),現在問題來了?如何從我們的觀測數據當中近似得到P(θ)P(\theta)的估計值呢?
對於上述問題,我們可以從兩個角度出發進行思考,一是從頻率學派的角度,二是從貝葉斯學派的角度。

MLE

使用極大似然估計的方法得到P(θ)P(\theta)的近似值主要分爲以下兩個步驟:

  • 先根據數據集對數據分佈做出假設(或者構建模型)。以擲硬幣爲例,一種很自然的想法即爲:假設擲硬幣朝上的概率P(H)P(H)滿足二項分佈。對於參數爲(n,p)(n,p)的二項分佈,我們知道其分佈列爲p(k)=(nk)pk(1p)nkp(k)= \binom{n}{k}p^k (1-p)^{n-k}具體到擲硬幣來說,我們可以得到P(Dθ)=(nH+nTnH)θnH(1θ)nT,P(D\mid \theta) = \begin{pmatrix} n_H + n_T \\ n_H \end{pmatrix} \theta^{n_H} (1 - \theta)^{n_T},
    其中nHn_H表示硬幣朝上的次數,nTn_T表示硬幣朝下的次數,θ\theta表示硬幣朝上的概率。
  • 確定模型參數,使得我們所觀測到的數據儘可能具有代表性(make our data more likely to be observed in real world),也即:θ^MLE=argmaxθ P(D;θ)\hat{\theta}_{MLE} = \operatorname {argmax}_{\theta} \,P(D ; \theta) ,上述問題的求解過程如下:
    θ^MLE=argmaxθ P(D;θ)=argmaxθ(nH+nTnH)θnH(1θ)nT=argmaxθ log(nH+nTnH)+nHlog(θ)+nTlog(1θ)=argmaxθ nHlog(θ)+nTlog(1θ) \hat{\theta}_{MLE} = \operatorname{argmax}_{\theta} \,P(D; \theta) \\ = \operatorname{argmax}_{\theta} \begin{pmatrix} n_H + n_T \\ n_H \end{pmatrix} \theta^{n_H} (1 - \theta)^{n_T} \\ = \operatorname{argmax}_{\theta} \,\log\begin{pmatrix} n_H + n_T \\ n_H \end{pmatrix} + n_H \cdot \log(\theta) + n_T \cdot \log(1 - \theta) \\ = \operatorname{argmax}_{\theta} \, n_H \cdot \log(\theta) + n_T \cdot \log(1 - \theta)
    對於上述表達式求導:
    nHθ=nT1θnHnHθ=nTθθ=nHnH+nT \frac{n_H}{\theta} = \frac{n_T}{1 - \theta} \Longrightarrow n_H - n_H\theta = n_T\theta \Longrightarrow \theta = \frac{n_H}{n_H + n_T} 這樣一來,我們就得到了關於參數θ\theta的估計。
    仔細一看θ^\hat \theta的值,我們不難發現,其恰好爲我們平時說的頻率。也就是說,於擲硬幣這個例子而言,極大似然估計最終以頻率來估計硬幣朝上的概率。

MAP

以擲硬幣實驗中硬幣朝上事件發生的頻率來估計硬幣朝上的概率,這似乎是一種很自然的做法。下面我們來考慮另外一種極端情況:同樣是拋10次硬幣,結果爲{H,H,H,H,H,H,H,H,H,H}。此時我們使用MLE來估計參數θ\theta的值,就會得到P(H)θ^=1P(H) \approx \hat \theta = 1.這樣的結果你覺得可靠嗎?至少我覺得是不可靠的。因爲憑我的直覺,我認爲硬幣朝上的概率和硬幣朝下的概率是五五開的。於是,貝葉斯學派認爲,純粹使用頻率來估計概率是不行的。他們認爲參數θ\theta是一個隨機變量,在估計硬幣朝上的概率P(H)P(H)的時候,還應當引入先驗知識,將P(H)P(H)也即θ\theta本身服從的概率分佈也考慮進來。
所以MAP要解決的是一個什麼樣的問題呢?簡而言之,MAP就是要通過我們現有的觀測數據去尋找最有可能的θ\theta,即:θ^MAP=argmaxθ P(θD) \hat{\theta}_{MAP} = {argmax}_{\theta} \,P(\theta \mid D)
回顧一下貝葉斯公式:P(θD)=P(Dθ)P(θ)P(D)=P(Dθ)P(θ)P(D)P(\theta \mid D) = \frac {P(D \mid \theta) * P(\theta)}{P(D)} = \frac {P(D \mid \theta) * P(\theta)}{P(D)}
在上面表達式當中,各個參數代表的含義如下:

  • P(D)P(D):對於分母這一項,如果是一個連續性隨機變量的話,我們可以寫成θP(Dθ) dθ\int_\theta {P(D \mid \theta)} \,{\rm d}\theta,如果是一個離散型隨機變量我們可以寫成θP(Dθ)\sum_{\theta}{P(D \mid \theta)}。不論是何種情況,P(D)P(D)的取值都不會影響我們求解最佳的參數θ\theta
  • P(Dθ)P(D \mid \theta):這一項恰好就是我們先前在MLE中要最大化的量,也即在給定參數θ\theta的前提下,我們所觀測到的數據在真實情況下出現的可能性。
  • P(θ)P(\theta):參數θ\theta的先驗概率。
  • P(θD)P(\theta \mid D):基於觀測數據,我們對於參數θ\theta所滿足的先驗概率的矯正。

下面我們就逐一分析分子中的各項:

- P(θ)P(\theta)

通常情況下,對於擲硬幣這個例子而言,我們可以假設P(H)P(H)服從Beta分佈,即P(θ)=θα1(1θ)β1B(α,β)P(\theta) = \frac{\theta^{\alpha - 1}(1 - \theta)^{\beta - 1}}{B(\alpha, \beta)}
在上面的表達式當中,分母B(α,β)=Γ(α)Γ(β)Γ(α+β)B(\alpha, \beta) = \frac{\Gamma(\alpha) \Gamma(\beta)}{\Gamma(\alpha+\beta)}
爲什麼我們使用Beta分佈來模擬硬幣朝上的概率P(H)P(H)所滿足的分佈呢?原因主要有以下兩點:

  • 其與二項分佈是共軛先驗的(Conjugate_prior)。所謂共軛先驗就是先驗分佈是beta分佈,而後驗分佈同樣是beta分佈。P(θD)P(Dθ)P(θ)θnH+α1(1θ)nT+β1P(\theta \mid D) \propto P(D \mid \theta) P(\theta) \propto \theta^{n_H + \alpha -1} (1 - \theta)^{n_T + \beta -1}
  • Beta分佈特指一組定義在(0,1) 區間的連續概率分佈,而參數θ\theta的取值範圍恰好爲(0,1)。
- P(Dθ)P(D \mid \theta)

這一項我們已經在MLE中分析過來,這裏就不再加以闡述。

尋找MAP的最優解

θ^MAP=argmaxθ  P(θData)=argmaxθ  P(Dataθ)P(θ)P(Data)(By Bayes rule)=argmaxθ  log(P(Dataθ))+log(P(θ))=argmaxθ  nHlog(θ)+nTlog(1θ)+(α1)log(θ)+(β1)log(1θ)=argmaxθ  (nH+α1)log(θ)+(nT+β1)log(1θ)θ^MAP=nH+α1nH+nT+β+α2 \hat{\theta}_{MAP} = \operatorname{argmax}_{\theta} \;P(\theta | Data) \\ = \operatorname{argmax}_{\theta} \; \frac{P(Data | \theta)P(\theta)}{P(Data)} \text{(By Bayes rule)} \\ = \operatorname{argmax}_{\theta} \;\log(P(Data | \theta)) + \log(P(\theta)) \\ = \operatorname{argmax}_{\theta} \;n_H \cdot \log(\theta) + n_T \cdot \log(1 - \theta) + (\alpha - 1)\cdot \log(\theta) + (\beta - 1) \cdot \log(1 - \theta) \\ = \operatorname{argmax}_{\theta} \;(n_H + \alpha - 1) \cdot \log(\theta) + (n_T + \beta - 1) \cdot \log(1 - \theta) \\ \Longrightarrow \hat{\theta}_{MAP} = \frac{n_H + \alpha - 1}{n_H + n_T + \beta + \alpha - 2}

MLE與MAP的注意點

  • MLE

    • 前面有提到MLE需要我們針對問題事先提出一個假設模型,因此模型的正確與否將很大程度上決定我們能否準確估計參數θ\theta的值。
    • MLE在很大程度上受樣本個數n的影響。當nn \longrightarrow \infty並且我們的模型假設也合理的時候,MLE能夠對參數θ\theta作出較好的估計,相反當n0n \longrightarrow 0,也即樣本個數較少的時候,使用MLE對參數θ\theta進行估計時,容易發生過擬合的情況,比如先前θ^=1\hat \theta =1的情況。
  • MAP

    • MAP的結果與我們的先驗知識有關。如果我們對於參數的先驗假設不合理的話,那麼使用MAP很可能會得到一個糟糕的結果。這一點我們可以通過接下來的實驗進行論述。
    • MAP在n0n \longrightarrow 0的時候,相較於MLE而言,會取得更好的結果,當然前提是我們的先驗假設要正確,否則結果仍然會很糟糕。而當nn \longrightarrow \infty的時候,MLE和MAP都將收斂到參數θ\theta的真實值附近。

爲了能夠更直觀地理解上述結論,我決定自己手動書寫代碼進行驗證:

import numpy as np
import matplotlib.pyplot as plt
def compute_mle_and_map(thets, gama0, gama1,size = 500):
    MLE_es = []
    MAP_es = []
    for i in range(size):
        m = np.random.binomial(i+1, theta)
        prob1 = (m * 1.0)/ (i + 1)
        prob2 = (m + gama1) * 1.0 / (i + gama0 + gama1)
        MLE_es.append(prob1)
        MAP_es.append(prob2)
    MLE_es = np.array(MLE_es)
    MAP_es = np.array(MAP_es)
    return MLE_es,MAP_es

在上面這段代碼中,我假定擲硬幣朝上的真實概率爲0.3,然後通過二項分佈來模擬擲硬幣的過程,其中prob1是採用MLE得到的結果,prob2是採用MAP得到的結果,而循環變量i主要控制投擲硬幣的次數。

size = 250
theta = 0.3
x = np.arange(size) + 1
y1, y2 = compute_mle_and_map(0.3, 42, 18, size)
plt.figure() #創建圖形
plt.subplot(2,2,1)
plt.plot(x,y1, color='blue', label= 'MLE')
plt.plot(x,y2, color='red', label='MAP')
plt.hlines(theta, 0, size, colors='green', label='True theta')
plt.legend()
plt.xlabel("Number of coin flips")
plt.ylabel("Low Confident Priors")
plt.title("true theta=0.3,gama0=42,gama2=18")
plt.subplot(2,2,3)
y1, y2 = compute_mle_and_map(0.3, 84, 36, size)
plt.plot(x,y1, color='blue', label= 'MLE')
plt.plot(x,y2, color='red', label='MAP')
plt.hlines(theta, 0, size, colors='green', label='True theta')
plt.legend()
plt.xlabel("Number of coin flips")
plt.ylabel("High Confident Priors")
plt.title("true theta=0.3,gama0=84,gama2=36")
plt.subplot(2,2,2)
y1, y2 = compute_mle_and_map(0.3, 36, 24, size)
plt.plot(x,y1, color='blue', label= 'MLE')
plt.plot(x,y2, color='red', label='MAP')
plt.hlines(theta, 0, size, colors='green', label='True theta')
plt.legend()
plt.xlabel("Number of coin flips")
plt.ylabel("Low Confident Priors")
plt.title("true theta=0.3,gama0=36,gama2=24")
plt.subplot(2,2,4)
y1, y2 = compute_mle_and_map(0.3, 72, 48, size)
plt.plot(x,y1, color='blue', label= 'MLE')
plt.plot(x,y2, color='red', label='MAP')
plt.hlines(theta, 0, size, colors='green', label='True theta')
plt.legend()
plt.xlabel("Number of coin flips")
plt.ylabel("Low Confident Priors")
plt.title("true theta=0.3,gama0=72,gama2=48")
plt.show() 

上面這段代碼主要根據硬幣的投擲結果做出圖像以方便分析:
在這裏插入圖片描述

  • 在左上角的第一幅圖像當中,我們的先驗知識認爲硬幣朝上的概率是0.3,這與真實情況相符合,因此在數據量比較小的時候,採用MAP方法能夠較爲準確地估計參數θ\theta的值。此外我們也可以很明顯地看到,採用MLE估計參數θ\theta的值,在數據量較小的時候,很容易出現過擬合的情況,表現出較爲劇烈的抖動。但是從最終的變化趨勢來看,隨着實驗次數的不斷增加,MLE對應的曲線最只能怪還是收斂到了θ\theta的真實值0.3附近。
  • 在左下角的圖形當中,我特意將α\alphaβ\beta的值變爲了左上角所對應圖像的兩倍,這樣做的目的相當於增加了我們對於先驗知識的置信度,由於我們對於θ\theta的先驗符合真實情況,所以左上角和左下角的兩幅圖像並無本質區別。
    那麼一旦我們的先驗出現了偏差,結果會如何呢?

下面我們把視角轉向右側的兩幅圖像。

  • 先看右上角的圖像,我們設定α\alphaβ\beta的值分別爲24、36,也即我們對於硬幣朝上概率的先驗假設爲0.4。此時我們發現MAP在實驗次數比較少的時候,並沒有得到關於參數θ\theta的準確估計,而是隨着實驗次數的增加,慢慢從0.4收斂到0.3.
  • 再看看右下角的圖像,我們進一步增大我們對於先驗的置信度,也即設定α=48\alpha=48β=72\beta=72。對比右側的上下兩個圖像,我們可以發現對於右上角的圖像而言,實驗次數約爲100次時,MAP對應的曲線收斂到0.3,;而對於右下角的圖像而言,實驗次數則在200次左右時才收斂至0.3.
  • 這說明了什麼?這說明了,使用MAP方法得到的結果一定程度上依賴於我們的先驗知識。如果我們的先驗假設是正確的,那麼無論實驗次數是多是少,MAP都會得到一個可靠的結果。相反,若我們的先驗本身就是錯誤的,那麼MAP將會得到一個不可靠的結果,且隨我們對先驗知識的置信程度的增加,我們需要獲取更多的觀測數據,進行更多次的實驗,才能進一步校正我們的先驗知識,進而得到對參數θ\theta的可靠估計。

MLE 與MAP的聯繫

在我來看,MLE是MAP的一種特殊情況。當我們認爲P(θ)P(\theta)滿足均勻分佈的時候,MAP就轉化爲了MLE。換句話說,在頻率學派來看,參數θ\theta在其各個取值上是等概率的,而貝葉斯學派則認爲,參數θ\theta的分佈是由觀測者的先驗知識決定的,不能簡單認爲其就滿足均勻分佈。

補充

下面的代碼我自己對於Tom Mitchell « Machine Learning » ch2 « Estimating Probabilities» 課後的習題解答,解答未必正確,僅供參考。

from scipy import stats
p = np.linspace(0, 1, 1000)
beta0 = 43 
beta1 = 19
pbeta = stats.beta.pdf(p, beta0, beta1)
plt.plot(p, pbeta, label='prior probability distribution')
plt.legend()
plt.show()
pbeta = stats.beta.pdf(p, beta0+6, beta1+9)
plt.grid()
plt.plot(p, pbeta, label='MAP distribution(prior gama0=42,gama1=18)')
plt.show()

實驗結果如下圖:
在這裏插入圖片描述

beta0 = 420
beta1 = 180
pbeta = stats.beta.pdf(p, beta0+6+1, beta1+9+1)
plt.grid()
plt.plot(p, pbeta, label='MAP distribution(prior gama0=420,gama1=180)')
plt.legend()
plt.show()
beta0 = 32
beta1 = 28
pbeta = stats.beta.pdf(p, beta0+6+1, beta1+9+1)
plt.grid()
plt.plot(p, pbeta, label='MAP distribution(prior gama0=32,gama1=28)')
plt.legend()
plt.show()

實驗結果如下圖:

在這裏插入圖片描述

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