《贝叶斯思维:统计建模的Python学习法》——2.3 贝叶斯框架

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)```

另一优点是,它提供了解决许多类似问题的框架。在下一节中,我们将解决蒙蒂大厅问题的计算,然后看看框架的哪些部分相同。

时间: 2024-12-19 21:07:40

《贝叶斯思维:统计建模的Python学习法》——2.3 贝叶斯框架的相关文章

《贝叶斯思维:统计建模的Python学习法》——导读

前言 贝叶斯思维:统计建模的Python学习法 学习之道 这本书以及Think系列其他书籍的一个前提是:只要懂得编程,你就能用这个技能去学习其他的内容 . 绝大多数贝叶斯统计的书使用数学符号并以数学概念的形式表示数学思想,比如微积分.但本书使用了Python代码而不是数学,离散近似而不是连续数学.结果就是原本需要积分的地方变成了求和,概率分布的大多数操作变成了简单的循环. 我认为这样的表述是易于理解的,至少对于有编程经验的人们来说是这样的.当作建模选择时也非常实用,因为我们可以选取最合适的模型而

《贝叶斯思维:统计建模的Python学习法》一第2章 统计计算2.1 分布

第2章 统计计算 贝叶斯思维:统计建模的Python学习法 2.1 分布 在统计上,分布是一组值及其对应的概率. 例如,如果滚动一个六面骰子,可能的值是数字1至6,与每个值关联的概率是1/6. 再举一个例子,你应该有兴趣了解在日常的英语使用中每个单词出现的次数.你可以建立一个包含每个字及它出现的次数的分布. 为了表示Python中的分布,可以使用一个字典映射某个值和它的概率.我编写了一个名为Pmf的类,利用Python字典实现了上述功能,而且提供了一些有用的方法.为了对应概率质量函数这种分布的数

《贝叶斯思维:统计建模的Python学习法》——第1章 贝叶斯定理 1.1 条件概率

第1章 贝叶斯定理 贝叶斯思维:统计建模的Python学习法 1.1 条件概率 所有贝叶斯统计的方法都基于贝叶斯定理,如果有条件概率的学习基础,意识到这一点很自然.因此我们会从概率.条件概率开始,然后到贝叶斯定理,最后讨论贝叶斯统计的内容. 概率表示为0和1之间的数字(包括0和1),含义是某一事件或者预测行为的可信程度,1值表示"事件为真"的情形肯定发生,或表述为预测成真:而0值则表示"事件为真"这一情形为假. 其他中间值表示确定性的程度.例如,0.5通常也会写成5

《贝叶斯思维:统计建模的Python学习法》——第2章 统计计算 2.1 分布

第2章 统计计算 贝叶斯思维:统计建模的Python学习法 2.1 分布 在统计上,分布是一组值及其对应的概率. 例如,如果滚动一个六面骰子,可能的值是数字1至6,与每个值关联的概率是1/6. 再举一个例子,你应该有兴趣了解在日常的英语使用中每个单词出现的次数.你可以建立一个包含每个字及它出现的次数的分布. 为了表示Python中的分布,可以使用一个字典映射某个值和它的概率.我编写了一个名为Pmf的类,利用Python字典实现了上述功能,而且提供了一些有用的方法.为了对应概率质量函数这种分布的数

《贝叶斯思维:统计建模的Python学习法》一第1章 贝叶斯定理1.1 条件概率

第1章 贝叶斯定理 贝叶斯思维:统计建模的Python学习法 1.1 条件概率 所有贝叶斯统计的方法都基于贝叶斯定理,如果有条件概率的学习基础,意识到这一点很自然.因此我们会从概率.条件概率开始,然后到贝叶斯定理,最后讨论贝叶斯统计的内容. 概率表示为0和1之间的数字(包括0和1),含义是某一事件或者预测行为的可信程度,1值表示"事件为真"的情形肯定发生,或表述为预测成真:而0值则表示"事件为真"这一情形为假. 其他中间值表示确定性的程度.例如,0.5通常也会写成5

《贝叶斯思维:统计建模的Python学习法》一2.8 练习

2.8 练习 练习2-1. 在第11页的"贝叶斯框架"里面,我提到了曲奇饼问题的解法是简化的,是曲奇饼有补充的取多个饼的情况(有放回的情况). 但更可能的情况是,我们吃掉了取出的曲奇饼,那么似然度就依赖于之前的取曲奇饼行为(曲奇饼少了). 修改本章中的解法以处理没有曲奇饼补充的情况.提示:添加Cookie的实例变量来表示碗的假设状态,并据此修改似然度.你可能要定义一个Bowl对象.

《贝叶斯思维:统计建模的Python学习法》——1.4 贝叶斯定理

1.4 贝叶斯定理 现在,我们准备好进行贝叶斯定理推导需要的所有条件了.首先,我们注意到,联合概率是乘积可交换(乘法交换律)的,即: p(A and B) = p(B and A) 对于任何A,B表示的事件都成立. 然后,我们写出一个联合概率的表达式: p(A and B) = p(A)p(B|A) 由于我们并没有明确定义A和B的含义,因而可以对A.B进行互换操作. 交换它们的位置: p(B and A) = p(B)p(A|B) 把这些表达式连接起来,我们得到下面的表达式: p(B)p(A|B

《贝叶斯思维:统计建模的Python学习法》一2.4 Monty Hall难题

2.4 Monty Hall难题 为了解决蒙蒂大厅(Monty Hall)问题,我将定义一个新的类: class monty(Pmf): def __init__(self,hypos): Pmf.__init__(self) for hypo in hypos: self.Set(hypo,1) self.Normalize() 到目前为止,蒙蒂大厅和曲奇饼是完全一样的.创建Pmf的代码也一样,除了假设的名称: hypos='ABC' pmf =Monty(hypos) 对Update的调用几

《贝叶斯思维:统计建模的Python学习法》——1.5 历时诠释

1.5 历时诠释 还有另外一种理解贝叶斯定理的思路:它给我们提供的是一种根据数据集D的内容变化更新假设概率H的方法. 这种对贝叶斯定理的理解被称为"历时诠释". "历时"意味着某些事情随着时间而发生:在本例,即是假设的概率随着看到的新数据而变化. 在考虑H和D的情况下,贝叶斯定理的表达式可以改写成: 在这种解释里,每项意义如下: p(H)称为先验概率,即在得到新数据前某一假设的概率.p(H |D)称为后验概率,即在看到新数据后,我们要计算的该假设的概率.p(D|H)