157
技術社區[雲棲]
《貝葉斯思維:統計建模的Python學習法》一2.3 貝葉斯框架
本節書摘來自異步社區《貝葉斯思維:統計建模的Python學習法》一書中的第2章,第2.3節,作者【美】Allen B. Downey,更多章節內容可以訪問雲棲社區“異步社區”公眾號查看
2.3 貝葉斯框架
在繼續討論其他的問題前,我想在上一節的基礎上重寫代碼以使其更通用。首先我將定義一個類來封裝與此相關的代碼 :
class Cookie(Pmf):
def __init__(self,hypos):
Pmf.__init__(self)
for hypo in hypos:
self.Set(hypo,1)
self.Normalize()
Cookie對象是一個映射假設到概率的Pmf對象。__init__方法給每個假設賦予相同的先驗概率。如上一節中就有兩種假設:
hypos= ['Bowl1','Bowl2']
pmf =Cookie(hypos)
Cookie類提供了Update方法,它以data為參數並修正相應的概率:
def Update (self,data):
for hypo in self.Values():
like= self.Likelihood(data,hypo)
self.Mult(hypo,like)
self.Normalize()
Update遍曆suite中的每個假設,並將其概率乘以數據在某一假設下的似然度,似然度由Likelihood計算:
mixes = {
'Bowl 1':dict(vanilla=0.75, chocolate=0.25),
'Bowl 2':dict(vanilla=0.5, chocolate=0.5),
}
def Likelihood(self, data, hypo):
mix = self.mixes[hypo]
like = mix[data]
return like
Likelihood使用mixes,它使用Python的字典結構來映射碗名和在碗中曲奇餅的混合比例。
如下麵這樣進行更新:
pmf.Update('vanilla')
然後我們就可以打印輸出每個假設的後驗概率:
for hypo , prob in pmf.Items():
print hypo,prob
其結果是
Bowl 1 0.6
Bowl 2 0.4
結果和我們之前得到的結論一樣。比起我們在前麵章節看到的,這段代碼更複雜。
一個優點是,它可以推廣到從同一個碗取不隻一個曲奇餅(帶替換)的情形:
dateset= ['vanilla', 'chocolate', 'vanilla']
for data in dataset:
pmf.Update(data)
另一優點是,它提供了解決許多類似問題的框架。在下一節中,我們將解決蒙蒂大廳問題的計算,然後看看框架的哪些部分相同。
本節中的代碼可以從https://thinkbayes.com/cookie2.py獲得。欲了解更多信息,請參見前言的“代碼指南”。
最後更新:2017-06-13 09:31:38