兩種參數估計的統計學方法
今天主要複習一下兩種參數估計的統計學方法,分別是極大似然估計(MLE)和最大後驗概率估計(MAP)。
- 問題背景
- MLE
- MAP
- MLE 與 MAP各自的優缺點
- MLE與MAP之間的區別與聯繫
問題背景
以擲硬幣爲例。現在我們一共拋擲了10次硬幣,其結果爲{H,T,T,T,H,H,H,H,H,H}。我們假設硬幣朝上的概率爲,現在問題來了?如何從我們的觀測數據當中近似得到的估計值呢?
對於上述問題,我們可以從兩個角度出發進行思考,一是從頻率學派的角度,二是從貝葉斯學派的角度。
MLE
使用極大似然估計的方法得到的近似值主要分爲以下兩個步驟:
- 先根據數據集對數據分佈做出假設(或者構建模型)。以擲硬幣爲例,一種很自然的想法即爲:假設擲硬幣朝上的概率滿足二項分佈。對於參數爲的二項分佈,我們知道其分佈列爲具體到擲硬幣來說,我們可以得到
其中表示硬幣朝上的次數,表示硬幣朝下的次數,表示硬幣朝上的概率。 - 確定模型參數,使得我們所觀測到的數據儘可能具有代表性(make our data more likely to be observed in real world),也即:,上述問題的求解過程如下:
對於上述表達式求導:
這樣一來,我們就得到了關於參數的估計。
仔細一看的值,我們不難發現,其恰好爲我們平時說的頻率。也就是說,於擲硬幣這個例子而言,極大似然估計最終以頻率來估計硬幣朝上的概率。
MAP
以擲硬幣實驗中硬幣朝上事件發生的頻率來估計硬幣朝上的概率,這似乎是一種很自然的做法。下面我們來考慮另外一種極端情況:同樣是拋10次硬幣,結果爲{H,H,H,H,H,H,H,H,H,H}。此時我們使用MLE來估計參數的值,就會得到.這樣的結果你覺得可靠嗎?至少我覺得是不可靠的。因爲憑我的直覺,我認爲硬幣朝上的概率和硬幣朝下的概率是五五開的。於是,貝葉斯學派認爲,純粹使用頻率來估計概率是不行的。他們認爲參數是一個隨機變量,在估計硬幣朝上的概率的時候,還應當引入先驗知識,將也即本身服從的概率分佈也考慮進來。
所以MAP要解決的是一個什麼樣的問題呢?簡而言之,MAP就是要通過我們現有的觀測數據去尋找最有可能的,即:
回顧一下貝葉斯公式:
在上面表達式當中,各個參數代表的含義如下:
- :對於分母這一項,如果是一個連續性隨機變量的話,我們可以寫成,如果是一個離散型隨機變量我們可以寫成。不論是何種情況,的取值都不會影響我們求解最佳的參數。
- :這一項恰好就是我們先前在MLE中要最大化的量,也即在給定參數的前提下,我們所觀測到的數據在真實情況下出現的可能性。
- :參數的先驗概率。
- :基於觀測數據,我們對於參數所滿足的先驗概率的矯正。
下面我們就逐一分析分子中的各項:
-
通常情況下,對於擲硬幣這個例子而言,我們可以假設服從Beta分佈,即
在上面的表達式當中,分母。
爲什麼我們使用Beta分佈來模擬硬幣朝上的概率所滿足的分佈呢?原因主要有以下兩點:
- 其與二項分佈是共軛先驗的(Conjugate_prior)。所謂共軛先驗就是先驗分佈是beta分佈,而後驗分佈同樣是beta分佈。
- Beta分佈特指一組定義在(0,1) 區間的連續概率分佈,而參數的取值範圍恰好爲(0,1)。
-
這一項我們已經在MLE中分析過來,這裏就不再加以闡述。
尋找MAP的最優解
MLE與MAP的注意點
-
MLE
- 前面有提到MLE需要我們針對問題事先提出一個假設模型,因此模型的正確與否將很大程度上決定我們能否準確估計參數的值。
- MLE在很大程度上受樣本個數n的影響。當並且我們的模型假設也合理的時候,MLE能夠對參數作出較好的估計,相反當,也即樣本個數較少的時候,使用MLE對參數進行估計時,容易發生過擬合的情況,比如先前的情況。
-
MAP
- MAP的結果與我們的先驗知識有關。如果我們對於參數的先驗假設不合理的話,那麼使用MAP很可能會得到一個糟糕的結果。這一點我們可以通過接下來的實驗進行論述。
- MAP在的時候,相較於MLE而言,會取得更好的結果,當然前提是我們的先驗假設要正確,否則結果仍然會很糟糕。而當的時候,MLE和MAP都將收斂到參數的真實值附近。
爲了能夠更直觀地理解上述結論,我決定自己手動書寫代碼進行驗證:
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方法能夠較爲準確地估計參數的值。此外我們也可以很明顯地看到,採用MLE估計參數的值,在數據量較小的時候,很容易出現過擬合的情況,表現出較爲劇烈的抖動。但是從最終的變化趨勢來看,隨着實驗次數的不斷增加,MLE對應的曲線最只能怪還是收斂到了的真實值0.3附近。
- 在左下角的圖形當中,我特意將和的值變爲了左上角所對應圖像的兩倍,這樣做的目的相當於增加了我們對於先驗知識的置信度,由於我們對於的先驗符合真實情況,所以左上角和左下角的兩幅圖像並無本質區別。
那麼一旦我們的先驗出現了偏差,結果會如何呢?
下面我們把視角轉向右側的兩幅圖像。
- 先看右上角的圖像,我們設定和的值分別爲24、36,也即我們對於硬幣朝上概率的先驗假設爲0.4。此時我們發現MAP在實驗次數比較少的時候,並沒有得到關於參數的準確估計,而是隨着實驗次數的增加,慢慢從0.4收斂到0.3.
- 再看看右下角的圖像,我們進一步增大我們對於先驗的置信度,也即設定、。對比右側的上下兩個圖像,我們可以發現對於右上角的圖像而言,實驗次數約爲100次時,MAP對應的曲線收斂到0.3,;而對於右下角的圖像而言,實驗次數則在200次左右時才收斂至0.3.
- 這說明了什麼?這說明了,使用MAP方法得到的結果一定程度上依賴於我們的先驗知識。如果我們的先驗假設是正確的,那麼無論實驗次數是多是少,MAP都會得到一個可靠的結果。相反,若我們的先驗本身就是錯誤的,那麼MAP將會得到一個不可靠的結果,且隨我們對先驗知識的置信程度的增加,我們需要獲取更多的觀測數據,進行更多次的實驗,才能進一步校正我們的先驗知識,進而得到對參數的可靠估計。
MLE 與MAP的聯繫
在我來看,MLE是MAP的一種特殊情況。當我們認爲滿足均勻分佈的時候,MAP就轉化爲了MLE。換句話說,在頻率學派來看,參數在其各個取值上是等概率的,而貝葉斯學派則認爲,參數的分佈是由觀測者的先驗知識決定的,不能簡單認爲其就滿足均勻分佈。
補充
下面的代碼我自己對於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()
實驗結果如下圖: