阅读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