貝葉斯思維(例項2) 估計

2021-08-07 04:50:48 字數 3824 閱讀 3926

鐵路上以1到n命名火車頭。有一天你看到乙個標號60的火車頭,請估計鐵路上有多少火車頭?

應用貝葉斯進行推理,可以將這個問題分成兩步:

1. 在得到資料之前,我們對n的認識是什麼?

2. 已知乙個n的任意值後,得到資料(「標誌為60號的火車頭」)的似然度?

第乙個問題的答案就是問題的前置概率,第二個問題是似然度。

在選擇前置概率上,我們還沒有太多的基本資訊,先假設n可以是從1到1000等概率的任何值。

hypos =xrange(1, 1001)
接著需要的是似然函式。先假設存在乙個有n個火車頭的車隊,我們看到60號火車頭的概率是多少?假設只有乙個列車運營公司,看到任乙個火車頭有同等可能,那麼看到任何特定火車頭的機會為1/n。似然度函式如下:

import logging

#定義字典物件

class

(object):

#具體**見《貝葉斯思維(例項1)》

definitsequence

(self, values):

for value in values:

self.set(value, 1)

def__len__

(self):

return len(self.d)

#概率質量函式物件

class

pmf#具體**見《貝葉斯思維(例項1)》

defprobability

(o):

return o / (o + 1)

class

suite

(pmf):

defupdate

(self, data):

for hypo in self.values():

like = self.likelihood(data, hypo)

self.mult(hypo, like)

return self.normalize()

class

train

(suite):

deflikelihood

(self, data, hypo):

if hyporeturn

0else:

return

1.0/hypo

update如下:

suite =train(hypos)

suite.update(60)

結果為0.003。

如果非要猜,最優可能的值是60。不過,這不是我們的目標。另乙個可選的方法是計算後驗概率的平均分布:

def

mean

(suite):

total = 0

for hypo, prob in suite.items():

total += hypo*prob

return total

print mean(suite)

後驗的平均值是333,所以如果想最大限度地減少錯誤,這也許是個好的猜測結果。

為了進一步解決火車頭問題,我們必須進行一些假設

但僅僅依賴一次觀察的小量資料,情況可能如此敏感。回憶一下,從1到1000的均勻分布的先驗概率,後驗概率的平均值是333。同樣上界為500,得到的後驗平均值為207,乙個2000的上界後驗平均值為552。

for

data in[60, 30, 90]:

suite.update (data)

取樣這些資料時,後驗概率的均值時:

上限後驗均值

500152

1000

1642000

171

這樣差異就較小了。

如果沒有更多的資料,另乙個方法是通過收集背景資料優化先驗。

即使沒有深入了解鐵路產業的一些具體情況,我們也可以猜測,在大多數領域,有大量小公司,一些中型公司,乙個到兩個非常大型的公司。事實上,公司規模的分布往往遵循冪律。這規律表明,如果少於10個火車頭的公司有1000家,100個火車頭的公司可能有100家,1000個火車頭的公司有10家,10000個火車頭的公司可能僅有1家。

在數學上,冪律表示公司的數量與公司規模成反比,或pm

f(x)

∝(1x

)α其中pmf(x)是x的概率質量函式,α是乙個通常接近於1的引數。

我們可以構造乙個服從冪律分布的先驗如下:

class

dice

(suite):

deflikelihood

(self, data, hypo):

if hypo < data:

return

0else:

return

1.0/hypo

class

train

(dice):

def__init__

(self, hypos, alpha = 1.0):

pmf.__init__ (self)

for hypo in hypos:

self.set (hypo, hypos** (-alpha))

self.normalize()

而下面是生成前置概率的**:

hypos = range(1, 1001)

suite = train(hypos)

如果基於這種先驗概率,在觀察到列車30、60和90時,後驗概率分別是:

上限後驗均值

500131

1000

1332000

134

事實上,考慮乙個任意大的上界,平均值都收斂於134。所以基於冪律分布的先驗概率是比較現實的,因為它基於公司規模的一般情況,並且在實際中表現的更好。

置信區間

對於點估計,通常使用平均數、中位數或最大似然值。

對於區間,通常給出兩個計算值,使得未知量有90%的可能落入這兩個值之間。這些值定義了乙個置信區間。

計算置信區間的乙個簡單方法是在後驗概率分布中累積其中的概率,並記錄對應於概率5%和95%的值。thinkbayes提供了乙個函式計算百分位數:

def

percentile

(pmf, percentage):

p = percentage / 100.0

total = 0

for val, prob in pmf.items():

total += prob

if total >= p:

return val

下面是乙個其應用**:

interval =percentile(suite, 5), percentile(suite, 95)

print interval

在前面的示例(看到了三個火車,且呈冪律分布的先驗概率的火車頭問題)中90%置信區間為(91, 243)。如此大的範圍其實確切的表明,我們仍然相當不確定究竟有多少火車頭存在。

貝葉斯當中,有兩種途徑選擇先驗分布。一些人建議選擇最能代表問題相關背景資料的先驗概率,這種情況下,先驗被認為是「資訊」。另一種方法是所謂的「無資訊參考的先驗」,其目的是為了讓資料來說話,越沒約束越好。

貝葉斯估計

其實這是我之前最想第一篇來寫的隨筆了,今天就先把這一部分寫一寫吧。1.問題 乙個醫療診斷問題有兩個可選的假設 病人有癌症 病人無癌症可用資料來自化驗結果 陰性和陽性。有先驗知識 在所有人口中,患病率是0.008,對確實有病的患者的化驗準確率為98 對確實無病的患者的化驗準確率為97 問題 假定有乙個...

貝葉斯估計詳解

貝葉斯估計 貝葉斯估計 從引數的先驗知識和樣本出發。不同於ml估計,不再把引數 看成乙個未知的確定變數,而是看成未知的隨機變數,通過對第i類樣本di的觀察,使概率密度分布p di 轉化為後驗概率p di 再求貝葉斯估計。假設 將待估計的引數看作符合某種先驗概率分布的隨機變數。基本原理 我們期望 貝葉...

貝葉斯引數估計

學習這部分內容約需要1.9小時 在貝葉斯框架中,我們將統計模型的引數視為隨機變數.模型由變數值的先驗分布以及決定引數如何影響觀測資料的證據模型來指定.當我們對觀測資料進行條件化時,我們得到引數的後驗分布.術語 貝葉斯引數估計 會讓我們誤以為對引數進行了估計,實際上我們通常可以完全跳過引數估計步驟.我...