您当前的位置:首页 > 学习 > 阅览室

蒙提霍尔问题(The Monty Hall Problem)解析(贝叶斯分析、Python仿真)

时间:11-28来源:作者:点击数:

0. 前言

蒙提霍尔问题可能是概率论历史上最具争议的问题。问题的场景极其简单,而其结果却呈现出惊人的反直觉,以至于许多人都无法接受它,曾经引发了巨大的争论。并且有许多著名的人物都在此问题上闹了笑话。

本文介绍蒙提霍尔问题,并给出几种不同的分析和解题思路。

1. 什么是蒙提霍尔问题(Monty Hall problem)

蒙提霍尔问题出现于一档游戏节目“Let's Make a Deal”(蒙提霍尔是当时的主持人)的一个常规节目,假设你是游戏的参加者(你的目标当然是向赢得那辆车,但是你需要能够猜对后面放着车的那扇门),这个节目的进程如下所示:

  • 1.主持人向你展示三扇门,其中一扇门后是一辆车,另外两扇门则是相当微不足道的安慰奖品,比如说,山羊啊、花生油啊什么的。
  • 2.首先主持人让你选择一扇门
  • 3.然后主持人会从另外两扇门中“任”选一扇后面没有车的门打开
  • 4.这时,主持人问你说:“你是坚持你原来的选择还是换到另一扇没有打开的门?”

你应该改变自己的选择吗?

很多人根据直觉觉得应该是没必要交换。因为,除了主持人打开的那扇门,车子出现在另外两扇门后面的概率是相同的。换句话说,主持人打开第二扇门并没有提供什么额外信息,车子出现在第一扇门和最后一扇门的概率没有因为主持人的行为而发生什么改变。

然而,正确的答案是:你绝对应该换到另一扇没有打开的门。这样会让你赢得车子的概率从1/3上升到2/3!

2. Naive approach:分类讨论

最直观的想法应该是如下所示分类讨论法:

记三扇门分别为A、B、C。

考虑车在A后面、B后面和C后面三种情况,针对每一种情况,第一次选择的门又有A、B、C三种情况。对所有情况进行穷举讨论可以得到下表:

所以,确实是换门与不换门赢得车子的情况是6比6,各50%的概率。因此,换不换门无所谓!

但是,且慢。。。有兴趣的小伙伴这里可以停下来思考一下,以上分类讨论和结论正确吗?不正确的话问题出在哪儿呢?

*********************************************分割线*******************************************************

熟悉概率论小伙伴应该知道按照分类计数的方式进行概率计算的前提条件是这些基本事件是等概率的。但是以上表中所列的各基本事件是等概率的吗?其实并不是。

以第1行和第2行为例,车子在门A后面的概率为1/3,第一次选择门A的概率也是1/3,则联合概率为P(car(A), open(A)) = \frac{1}{3}\times \frac{1}{3}=\frac{1}{9}。在这个前提条件下,主持人打开B或者C的概率各为50%,因此有:

P(car(A), open(A), host\_open(B)) =\frac{1}{3}\times \frac{1}{3}\times \frac{1}{2}=\frac{1}{18}
P(car(A), open(A), host\_open(C)) = \frac{1}{3}\times \frac{1}{3}\times \frac{1}{2}=\frac{1}{18}

然后看第3行,由于第一次选择门B后,主持人没有选择只能打开门C,可知:

P(car(A), open(B), host\_open(C)) =\frac{1}{3}\times \frac{1}{3}=\frac{1}{9}

同理看第4行,

P(car(A), open(C), host\_open(B)) =\frac{1}{3}\times \frac{1}{3}=\frac{1}{9}

显而易见,上表所列的12种情况的概率并不相等。把这个概率权重考虑进去后,就可以得到,换门能够赢得车子的概率上升为2/3,而不换车能赢得车子的概率则将为1/3,显然应该毫不犹豫地换车!

3. Python蒙特卡洛仿真

一个简易的基于python的蒙特卡洛仿真如下所示:

# -*- coding: utf-8 -*-
"""
Created on Sat Oct 22 13:35:36 2022

@author: chenxy
"""

import random
 
num_trial = 100000
exchange_win1 = 0
exchange_win2 = 0
for k in range(num_trial):
    
    #1. 随机将车子放在3个门后面,分别记为门1,门2,门3
    car = random.randint(1, 3)
    #print(car)
    
    #2. 随机打开其中任何一扇门
    open1 = random.randint(1, 3)
    
    #3. 主持打开其中一扇门
    # 如果open1打开的是有车的门,则主持人在剩下两扇门中任选一扇打开
    # 如果open1打开的是无车的门,则主持人必须打开另一扇无车的门
    while 1:
        open2 = random.randint(1, 3)
        if open2 != open1 and open2 != car:
            break

    #4.1 总是切换选择最后那扇没有打开的门。如果该门后有车的话则计数1次
    final = set([1,2,3]) - set([open1,open2]) #用集合差运算求最后那扇门作为最终选择
    exchange_win1 += (car in final)

    #4.2 直接根据第一次选择与有车的门是否一致进行判决        
    if open1 != car:
        exchange_win2 += 1
 
print('The win prob of exchanging the door is {0}'.format(exchange_win1/num_trial))
print('The win prob of exchanging the door is {0}'.format(exchange_win2/num_trial))

运行以上程序,当num_trial设置足够大的话,可以得到换门赢车的概率接近2/3。

4. 直观的理解

玩家第一次打开任意一扇门,毫无疑问的是,他恰好打开有车的那扇门的概率是(1/3),车在剩下的两扇门中的概率之和为2/3。不管主持人接下来打开哪扇门,都并没有改变玩家打开的第一扇门中有车的概率(否则就破坏了因果律)。而主持人打开的一定是无车的门,等于是排除了其中一扇门,因此剩下的(2/3)的概率就全部落在未打开的那扇门上。

所以。。。就这么简单。。。坚持之前的选择就坚持了(1/3)的赢得车子的概率,而换门的话自然就有(2/3)的概率赢得车子了。

事实上,从以上仿真程序中用两种方式统计换门的胜率。exchange_win1的统计是实际模拟换门的动作然后判断换的最后那扇门(final)与有车的门(car)是否一致;而exchange_win2就简单粗暴地直接判断最初打开的那扇门(open1)有车的门(car)是否一致。两种方式的结果理所当然地完全一致。由此也可以看出,坚持最初的开的门的胜率就是(1/3)与后面蒙提霍尔的骚操作无关;反过来就说明换门是更明智的选择,这时就跟蒙提霍尔的骚操作有关了,因此如果不是蒙提霍尔的骚操作,你就不知道该换哪个门,所以也就谈不上要换门的事情。

5. 贝叶斯方法

虽然有点杀鸡用牛刀之嫌,本问题也可以用贝叶斯定理来考察解决。

5.1 贝叶斯定理

令A和B为概率空间的两个任意事件,贝叶斯定理可以用以下公式表示:

P(A|B) = \frac{P(A)P(B|A)}{P(B)}

5.2 历时解释(The diachronic interpretation)

对贝叶斯定理的历时解释给我们提供了基于新的数据,更新现有假设的概率的一个系统性的方式。分别用H(Hypothesis)和D(Data)代替以上公式中的A和B,得到:

P(H|D) = \frac{P(H)P(D|H)}{P(D)}

在历时解释中,以上公式中每一项都有它的名字和物理含义:

P(H):在我们观测到新的数据D之前假设H成立的概率,这个称为先验概率(prior)

P(D):数据D出现的概率(under any hypothesis,或者说不以任何假设为先决条件的基本概率),在以上公式中它扮演归一化常数(normalizing constant)的角色,通常称为证据(evidence)

P(H|D):观察到数据D后对H的概率的更新值,称为后验概率(posterior)

P(D|H):在H成立的条件下数据D出现的概率,这个称为似然函数(likelihood)

因此,以上公式也可以写成(物理含义看上去更加明确):

posterior = \frac{prior \cdot likelihood}{evidence}

以上历时解释版本的贝叶斯定理可以通俗地理解,接收到新的数据(证据)时,相应地更新关于假设H的信念的更新。

打个比方说,两支联赛球队甲和乙,实力相当,但是由于甲是主场,所以你在赛前认为甲队有60%的胜率。即你的假设H是:甲队将获胜,其概率P(H)=60%。这个是比赛开始前的信息,是先验概率。

上半场40分钟,甲队攻入一球。这个就是一个数据D,一个新的evidence。基于这个新的数据,你立即将甲队获胜的概率提高到(比如说)75%了。。。贝叶斯定理给我们提供了一个非常好的反应数据与信念更新的数学框架。

5.3 应用于蒙提霍尔问题

换个看问题的角度,对问题进行简化,如下所示:

不失一般性,记游戏者第一次选择的为门A,随后MontyHall打开的后面没有车的门,记为门B。剩下的一扇门自然就记作门C。游戏者面临的问题是:应该继续坚持A,还是应该改选门C呢?换句话说,理性的游戏者应该根据以上信息判断出奖品在哪扇门(A or C)后的概率最高呢?

有三种可能的假设(车子在门A后面、或在门B后面、或在门C后面),我们将以表格的方式针对每一种假设计算其后验概率(即车子出现在哪扇门后的概率),比较后验概率大小即可知道是否应该换门。

很显然,三种假设先验概率都为1/3。

在这个问题中数据是什么呢?数据D是:蒙提霍尔打开了门B且门B后面没有车子。考虑以下表格中第二行,即假定车子在门A后面(玩家很幸运第一把就打开了正确的门),在这个假设中,蒙提霍尔打开门B的概率是多大呢?很显然,蒙提霍尔打开除A以外的两扇门中的任意一扇的概率是相同的,因此恰好打开当前被打开的这个门B的概率是1/2,也就是说likelihood为P(D=B|H_A)=1/2。同理,可以计算其余两个假设条件下的likelihood:如果车子在门B后面,则蒙提霍尔不可能打开门B,因此有P(D=B|H_B)=0;如果车子在门C后面,则蒙提霍尔只能打开门B,因此有P(D=B|H_C)=1。结果如下表所示。

 

Prior

P(H)

Likelihood

P(D|H)

P(H)P(D|H)

Posterior

P(H|D)

A

1/3

1/2 1/6 1/3
B 1/3 0 0 0
C 1/3 1 1/3 2/3

这样,基于prior和likelihood即可得到P(H)P(D|H),并进而得到最后一列的Posterior。

有些小伙伴可能会感到有点疑惑,咦,怎么没有看到P(D)呢?

前面介绍时我们已经提到过P(D)在贝叶斯定理历时解释中所起的作用是作为归一化因子。一般我们都不必关心其绝对值,其实实际应用中也很难实现得到其绝对值。为什么不比关心它的绝对值呢,因为:

一方面,在假设检验问题通常我们只需要关心各种假设的相对的后验概率大小

另一方面,由于存在概率之和必须为1的约束,所以它其实是可以根据其它数据计算出来的。只不过通常我们不必显式地计算出它们来而已。

比如说,以上第4列我们已经得到

P(H_A)P(D|H_A)=1/3, P(H_B)P(D|H_B)=0, P(H_C)P(D|H_C)=1/2

由后验概率之和为1,可以计算得出:

P(D) = P(H_A)P(D|H_A) + P(H_B)P(D|H_B) + P(H_C)P(D|H_C)\\=\frac{1}{6}+\frac{1}{3}=\frac{1}{2}

由此即可得:

P(H_A|D)=\frac{P(H_A)P(D|H_A)}{P(D)}=\frac{1/6}{1/2}=\frac{1}{3}

同理可以计算出:

P(H_B|D) = 0
P(H_C|D)=\frac{2}{3}

5.4 贝叶斯定理的威力:泛化与推广

如果贝叶斯定理能做的仅限于此,那也没有什么了不起,因为如第4节所示,甚至不用计算就可以通过直观的思考就可以直接得到答案。

贝叶斯定理的真正的威力在于在这相同的数学框架下,可以很方便地以相同的方式解决一大类相同的问题。比如说,对蒙提霍尔问题进行一个简单的条件变化:假设三扇门按从左到右排列,分别记为左、中、右门,蒙提霍尔在玩家打开了第一扇门(可以是左、中、右中任意扇)后,在有选择的前提下总是开剩下的门中靠右的那扇。在这种条件下,蒙提霍尔打开了第二扇门后,游戏玩家是否应该或者有必要换门吗?

注:在【1】中对这个蒙提霍尔问题变体的描述我认为有问题。【1】中的描述是:蒙提霍尔如果可能的话总是选择打开门B,仅在没有选择的时候才选择打开门C(比如说车子在门B后面)。这一描述的问题在于与前面对A、B、C的定义相矛盾。前面的定义是,总是记第一扇被打开的门为A,第二扇被打开的门为B,最后一扇门为C(并不是实现对三扇门分别标记为A、B、C),蒙提霍尔打开了哪扇门,那扇门就叫门B。。。因此“如果可能的话总是选择打开门B”的说法不成立。

【参考文献】

【1】Allen Downey,Thinking Bayes

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门