閱讀157 返回首頁    go 技術社區[雲棲]


《貝葉斯思維:統計建模的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

  上一篇:go  感知生態變化-選視角
  下一篇:go  The Most Essential Cloud Computing Services