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

1.7 Monty Hall难题

蒙蒂大厅(Monty Hall problem)难题可能是历史上最有争议的概率问题。问题看似简单,但正确答案如此有悖常理以致很多人不能接受,很多聪明人都难堪于自己搞错了反而据理力争,而且是公开的。

蒙蒂大厅是游戏节目“来做个交易”(Let’s Make a Deal)的主场。蒙蒂大厅难题也是这一节目的常规游戏之一。如果你参加节目,规则是这样的:

蒙蒂向你示意三个关闭的大门,然后告诉你每个门后都有一个奖品:一个奖品是一辆车,另外两个是像花生酱和假指甲这样不值钱的奖品。奖品随机配置。
游戏的目的是要猜哪个门后有车。如果你猜对了就可以拿走汽车。
你先挑选一扇门,我们姑且称之为门A,其他两个称为门B和门C。
在打开你选中的门前,为了增加悬念,蒙蒂会先打开B或C中一个没有车的门来增加悬念(如果汽车实际上就是在A门背后,那么蒙蒂打开门B或门C都是安全的,所以他可以随意选择一个)。
然后蒙蒂给你一个选择。坚持最初的选择还是换到剩下的未打开的门上。
问题是,你应该“坚持”还是“换”?有没有区别?

大多数人都有强烈的直觉,认为这没有区别。剩下两个门没有打开,车在门A背后的机会是50%。

但是,这是错的。事实上,如果你坚持选择门A,中奖概率只有1/3;而如果换到另外一个门,你的机会将是2/3。

运用贝叶斯定理,我们可以将这个问题分解成几个简单部分,也许这样可以说服自身,“正确”的答案实际上的的确确是对的。

首先,我们应该对数据进行仔细描述。在本例中为D包括两个部分:蒙蒂打开了门B,而且没有车在后面。

接下来,我们定义了三个假设:A,B和C,表示假设车在门A,门B,或门C后面。同样,采用表格法:

填写先验很容易,因为我们被告知奖品是随机配置的,这表明该车可能在任何门后面。

定义似然度需要一些思考,在充分合理的考虑后,我们确信正确的似然度如下:

考虑假设A:如果汽车实际上是在门A后,蒙蒂可以安全地打开门B或门C。所以他选择门B的概率为1/2。因为车实际上是在门A后,也就是说车不在门B后的概率是1。
考虑假设B:如果汽车实际上是在门B后,蒙蒂不得不打开门C,这样他打开门B的概率就是0(译注:也就是这个假设的似然度为0,不可能发生)。
最后考虑假设C:如果车是在门C后,蒙蒂打开门B的概率为1,发现车不在那儿的概率为1(译注:因为在选手已经选了A门这个情况下,可供蒙蒂增加悬念开门的选择只有B和C,而假设C有车,蒙蒂肯定不会选,因此蒙蒂会打开B门的概率为1,也就是在这个假设下,数据D的似然度为1)。
现在我们已经完成有难度的部分了,剩下无非就是算术。第三列的总和为1/2,除以后得到p(A|D) = 1/3,p(C|D) = 2/3,所以你最好是换个选择。

该问题有许多变形。贝叶斯方法的优势之一就是可以推广到这些变形问题的处理上。

例如,设想蒙蒂总是尽可能选择门B,且只有在迫不得已的时候才选门C(比如车在门B后)。在这种情况下,修正后的表如下:

唯一的变化是p(D|A)。如果车在门A后,蒙蒂可以选择打开B或C。但在这个变形问题里面,他总是选择B,因此p(D|A) = 1。

因此,对A和C,似然度是相同的,后验也是相同的:p(A|D) = p(C|D) = 1/2,在这种情况下,蒙特选择B 门显示不了车位置的任何信息,所以无论选手选择坚持不变还是改变都无关紧要。

反过来的情况下,如果蒙蒂打开门C,我们就知道p(B|D) = 1(译注:因为蒙蒂总是优先选择门B,而门D是他打开了门C,因此在假设车在门B后的前提下,他必然会打开门C,概率为1,即p(B|D)=1)。

本章中我介绍了蒙蒂问题,因为我觉得这里有它的趣味性,也因为贝叶斯定理使问题的复杂性更易控制。但这并不算是一个典型的贝叶斯定理应用,所以如果你觉得它令人困惑,没什么好担心的!

时间: 2024-10-25 10:38:25

《贝叶斯思维:统计建模的Python学习法》——1.7 Monty Hall难题的相关文章

《贝叶斯思维:统计建模的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.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学习法》——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)``` 对Upda

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

1.7 Monty Hall难题 蒙蒂大厅(Monty Hall problem)难题可能是历史上最有争议的概率问题.问题看似简单,但正确答案如此有悖常理以致很多人不能接受,很多聪明人都难堪于自己搞错了反而据理力争,而且是公开的. 蒙蒂大厅是游戏节目"来做个交易"(Let's Make a Deal)的主场.蒙蒂大厅难题也是这一节目的常规游戏之一.如果你参加节目,规则是这样的: 蒙蒂向你示意三个关闭的大门,然后告诉你每个门后都有一个奖品:一个奖品是一辆车,另外两个是像花生酱和假指甲这样

《贝叶斯思维:统计建模的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__方法给每个假设赋予相同的先验概率.如上一节中就有两种假设: hy