概率计算总是令人沮丧地违反直觉。
我们的大脑太急于走捷径并得出错误的答案,而不是仔细思考问题并正确计算概率。
为了让这个问题显而易见并帮助培养直觉,通过一些应用概率论中的经典问题进行练习会很有用。这些问题,如生日问题、男孩女孩问题和蒙提霍尔问题,会用错误的直觉答案来迷惑我们,需要仔细应用边际、条件和联合概率的规则才能得出正确答案。
在这篇文章中,您将通过解决一些经典且发人深省的问题,来学习如何培养对概率的直觉。
阅读本文后,你将了解:
- 如何通过概率相乘来解决生日问题。
- 如何使用条件概率解决男孩女孩问题。
- 如何使用联合概率解决蒙提霍尔问题。
用我的新书《机器学习概率》来启动您的项目,其中包括分步教程和所有示例的Python 源代码文件。
让我们开始吧。
- 2020年12月更新:重写了男孩女孩悖论的条件概率示例,使其更加清晰。

如何通过实例建立概率直觉
照片由 Bernal Saborio 拍摄,保留部分权利。
概述
本教程分为三个部分;它们是:
- 生日问题
- 男孩或女孩问题
- 蒙提霍尔问题
生日问题
应用概率的一个经典例子是计算两个人同一天生日的概率。
这是一个经典的例子,因为结果与我们的直觉不符。因此,它有时被称为生日悖论。
这个问题通常可以表述为:
问题:需要多少人,才能使群体中任意两人同一天生日的概率至少为50%?
这个问题没有陷阱;它只涉及计算边际概率。
我们假设一个随机选择的人在一年中任何一天生日的概率(不包括闰年)在一年中的每一天都均匀分布,例如 1/365 或大约 0.273%。
我们的直觉可能会迅速得出一个答案,认为我们可能需要至少和一年中的天数一样多的人,例如 365 人。我们的直觉之所以会失效,可能是因为我们考虑的是自己和别人与我们自己生日相同的情况。也就是说,我们思考的是需要多少人才能找到另一个和自己同一天出生的人。这是一个不同的问题。
相反,为了计算解决方案,我们可以考虑比较一个群体中的成对的人,以及某一对在同一天出生的概率。这就揭示了所需的计算方法。
一个群体内两两比较的次数(不包括每个人与自己的比较)计算如下:
- 比较次数 = n * (n – 1) / 2
例如,如果我们有一个五人小组,我们将在小组内进行10次两两比较来检查他们是否有相同的生日,这比我们可能预期的“命中”机会要多。重要的是,小组内的比较次数随着小组规模的增加而呈指数级增长。
还需要一步。计算这个问题的逆问题会更容易。也就是说,一个群体中两个人没有相同生日的概率。然后我们可以将最终结果取反,得到所需的概率,例如:
- p(n人中有2人同生日) = 1 – p(n人中没有2人同生日)
通过一个小组(比如三个人)的例子,我们可以看到计算生日不匹配的概率是多么容易。
可以一个接一个地向小组中添加人员。每次向小组中添加一个人,都会使一年中没有人生日的可用天数减少,即减少一天。例如,365 天,364 天,等等。
此外,新加入的某个人生日不匹配的概率必须与之前计算的概率相结合。例如,P(n=2) * P(n=3) 等。
由此,我们计算一个三人小组中没有生日匹配的概率如下:
- P(n=3) = 365/365 * 364/365 * 363/365
- P(n=3) = 99.18%
将其取反,得到一个三人小组中生日匹配的概率约为 0.820%。
我们来逐步分析一下,第一个人生日,这使得群体其余成员的候选天数从365天减少到364个未使用的天数(即没有人生日的日子)。对于第二个人,我们计算生日冲突的概率为一年365天中有364个安全天数,即 (364/365),约有99.72%的概率生日不同。现在我们从可用天数中减去第二个人的生日,得到363天。第三个人生日不匹配的概率则为363/365乘以之前的概率,约为99.18%。
对于大群体来说,这种计算可能变得乏味,因此我们可能希望将其自动化。
下面的例子计算了从2人到30人不同规模群体的概率。
1 2 3 4 5 6 7 8 9 10 11 |
# 生日问题的例子 # 定义群体大小 n = 30 # 一年中的天数 days = 365 # 计算不同群体大小的概率 p = 1.0 for i in range(1, n): av = days - i p *= av / days print('n=%d, %d/%d, p=%.3f 1-p=%.3f' % (i+1, av, days, p*100, (1-p)*100)) |
运行该示例首先打印出群体大小,然后是可用天数除以一年总天数,接着是群体中没有生日匹配的概率,最后是其补集,即群体中有两个人同生日的概率。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
n=2, 364/365, p=99.726 1-p=0.274 n=3, 363/365, p=99.180 1-p=0.820 n=4, 362/365, p=98.364 1-p=1.636 n=5, 361/365, p=97.286 1-p=2.714 n=6, 360/365, p=95.954 1-p=4.046 n=7, 359/365, p=94.376 1-p=5.624 n=8, 358/365, p=92.566 1-p=7.434 n=9, 357/365, p=90.538 1-p=9.462 n=10, 356/365, p=88.305 1-p=11.695 n=11, 355/365, p=85.886 1-p=14.114 n=12, 354/365, p=83.298 1-p=16.702 n=13, 353/365, p=80.559 1-p=19.441 n=14, 352/365, p=77.690 1-p=22.310 n=15, 351/365, p=74.710 1-p=25.290 n=16, 350/365, p=71.640 1-p=28.360 n=17, 349/365, p=68.499 1-p=31.501 n=18, 348/365, p=65.309 1-p=34.691 n=19, 347/365, p=62.088 1-p=37.912 n=20, 346/365, p=58.856 1-p=41.144 n=21, 345/365, p=55.631 1-p=44.369 n=22, 344/365, p=52.430 1-p=47.570 n=23, 343/365, p=49.270 1-p=50.730 n=24, 342/365, p=46.166 1-p=53.834 n=25, 341/365, p=43.130 1-p=56.870 n=26, 340/365, p=40.176 1-p=59.824 n=27, 339/365, p=37.314 1-p=62.686 n=28, 338/365, p=34.554 1-p=65.446 n=29, 337/365, p=31.903 1-p=68.097 n=30, 336/365, p=29.368 1-p=70.632 |
结果令人惊讶,显示只需要23人,两人同生日的概率就超过了50%。
更令人惊讶的是,当人数达到30人时,这个概率增加到70%。这很令人惊讶,因为20到30人大约是学校里一个班级的平均人数,这是我们(如果上过学的话)都有直觉的人数。
如果群体规模增加到大约60人,那么群体中两人同生日的概率将超过99%!
想学习机器学习概率吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
男孩或女孩问题
应用概率的另一个经典例子是计算一个婴儿是男孩还是女孩的概率。
在没有额外信息的情况下,一个婴儿是男孩还是女孩的概率是50%。这在现实中可能不完全正确,但为了这个有用的概率说明,我们姑且这么假设。
一旦包含更多信息,概率计算就会改变,这甚至会让精通数学和概率的人都感到困惑。
一个流行的例子叫做“两孩问题”,它涉及到一个有两个孩子的家庭信息,并估计其中一个孩子的性别。如果问题陈述得不够精确,可能会导致误解,进而产生两种不同的概率计算方式。这是使用自然语言而非符号的挑战,在这种情况下,这被称为“男孩或女孩悖论”。
让我们来看两个陈述精确的例子。
情况 1:一位女士有两个孩子,大的是男孩。这位女士有两个儿子的概率是多少?
考虑一个无条件概率的表格。
1 2 3 4 5 |
小孩子 | 大孩子 | 无条件概率 女孩 男孩 1/4 男孩 男孩 1/4 女孩 女孩 1/4 男孩 女孩 1/4 |
我们的直觉告诉我们,另一个孩子是男孩的概率是0.5或50%。
或者,我们的直觉可能认为一个有两个男孩的家庭的概率是1/4(例如概率为0.25),这是双孩家庭男孩女孩四种可能组合中的一种。
我们可以通过列举所有包含给定信息的可能组合来探究这个问题。
1 2 3 4 5 |
小孩子 | 大孩子 | 条件概率 女孩 男孩 1/2 男孩 男孩 1/2 (*) 女孩 女孩 0 (不可能) 男孩 女孩 0 (不可能) |
直觉是,额外的信息使得某些情况变得不可能。
原本会有四种结果,但给定的信息将可能结果的范围缩小到了两种(大孩子是男孩)。
确实,两种结果中只有一种是“男-男”,因此概率是1/2或(0.5) 50%。
让我们看第二个非常相似的案例。
情况2:一个女人有两个孩子,其中一个是男孩。这个女人有两个儿子的概率是多少?
我们的直觉会得出同样的结论。至少我是这么想的。
而这将是错误的。
例如,第二个孩子是男孩的概率为1/2。另一个直觉可能是1/4,即在所有两个孩子的可能情况中,“男-男”这种情况的概率。
要找出原因,我们再次列举所有可能的组合。
1 2 3 4 5 |
小孩子 | 大孩子 | 条件概率 女孩 男孩 1/3 男孩 男孩 1/3 (*) 男孩 女孩 1/3 女孩 女孩 0 (不可能) |
同样,直觉是额外的信息使得某些情况变得不可能。
原本会有四种结果,但给定的信息将可能结果的范围缩小到了三种(其中一个孩子是男孩)。在这三种情况中,有一种是“男-男”,因此概率是1/3或约33.33%。
在情况1中,我们有更多的信息,这使我们能够缩小可能结果的范围,并得出一个与我们直觉相符的结果。
情况2看起来非常相似,但实际上,它包含的信息更少。我们不知道是大的孩子还是小的孩子是男孩,因此可能结果的范围更大,导致了一个非直觉的答案。
我们也可以用条件概率的计算方法来解决这个问题。
在情况1中,我们可以将问题表述为:已知大孩子是男孩的情况下,一个随机家庭有两个男孩(例如,男孩-男孩的序列)的概率是多少?
一个事件在另一个事件发生的前提下的概率称为条件概率,它可以用以下公式计算:
- P(A | B) = P(A and B) / P(B)
这里,我们可以将事件A设为“2个男孩”,事件B设为“老大是男孩”。
- A = “2个男孩”
- B = “老大是男孩”
然后我们可以用我们的术语重新表述条件概率的计算:
- P(“2个男孩” | “老大是男孩”) = P(“2个男孩” 且 “老大是男孩”) / P(“老大是男孩”)
从家庭中出生的孩子序列的角度来看待这些事件会很有帮助。
例如,事件可以根据男孩和女孩的序列定义如下:
- “2个男孩” 包括 {男孩-男孩}
- “老大是男孩” 包括 {男孩-男孩, 女孩-男孩}
鉴于给定的信息,即大孩子是男孩,事件{女孩-女孩}和{男孩-女孩}是不可能的。
通过这种方式定义我们的事件,我们可以看到条件概率计算的分子P(“2个男孩” 且 “老大是男孩”)中存在一些冗余。具体来说,事件“2个男孩”是事件“老大是男孩”的一个子集。
这是条件概率中的一个特例,例如,当事件A是事件B的子集时的P(A and B)。
在这种特殊情况下,P(A and B)可以简化为P(A)。
- P(A and B) = P(A),如果事件A是事件B的一个子集。
这可能会让初学者感到困惑,但我们通常说如果A是B的子集,那么A的发生就意味着B的发生。也就是说,如果A发生了,B就是确定的,或者说概率为1.0。
- P(A and B) = (A * B) = (A * 1.0)
因此,我们可以将分子简化为“2个男孩”的概率:
- P(“2个男孩” 且 “老大是男孩”) = P(“2个男孩”)
现在,我们可以利用这个简化重新表述条件概率的计算:
- P(“2个男孩” | “老大是男孩”) = P(“2个男孩”) / P(“老大是男孩”)
我们可以利用上面无条件概率表中的信息来代入这些项。
例如,“2个男孩”(即“男-男”)的概率是1/4。“老大是男孩”的概率是“男-男”的概率1/4加上“女-男”的概率1/4,总共是2/4。
- P(“2个男孩”) = 1/4
- P(“老大是男孩”) = (1/4 + 1/4) = 2/4 = 1/2
因此
- P(“2个男孩” | “老大是男孩”) = P(“2个男孩”) / P(“老大是男孩”)
- P(“2个男孩” | “老大是男孩”) = (1/4) / (1/2)
- P(“2个男孩” | “老大是男孩”) = 1/2
或者用数值代替分数:
- P(“2个男孩” | “老大是男孩”) = P(“2个男孩”) / P(“老大是男孩”)
- P(“2个男孩” | “老大是男孩”) = 0.25 / 0.5
- P(“2个男孩” | “老大是男孩”) = 0.5
在情况2中,我们可以将问题表述为:已知其中一个孩子是男孩的情况下,一个随机家庭有两个男孩的概率是多少。
条件概率的计算再次是:
- P(A | B) = P(A and B) / P(B)
在这里,我们可以将事件 A 定义为“2个男孩”,事件 B 定义为“至少1个男孩”。
- A = “2个男孩”
- B = “至少1个男孩”
然后我们可以用我们的术语重新表述条件概率的计算:
- P(“2个男孩” | “至少1个男孩”) = P(“2个男孩” 且 “至少1个男孩”) / P(“至少1个男孩”)
我们可以看到这个计算中存在一些冗余,特别是在分子 P(“2个男孩” 且 “至少1个男孩”) 中。
事件“至少1个男孩”比“2个男孩”更普遍,或者换句话说,“2个男孩”是事件“至少1个男孩”的一个子集。
- “2个男孩” 包括 {男孩-男孩}
- “至少1个男孩” 包括 {男孩-男孩, 男孩-女孩, 女孩-男孩}
根据条件概率的规则
- P(A and B) = P(A),如果事件A是事件B的一个子集。
我们可以将分子简化为“2个男孩”。
- P(“2个男孩” 且 “至少1个男孩”) = P(“2个男孩”)
现在,我们可以重新表述这个计算。
- P(“2个男孩” | “至少1个男孩”) = P(“2个男孩”) / P(“至少1个男孩”)
然后,上面的无条件概率表可以用来将具体数值代入计算。
例如,“2个男孩”(即男-男)的概率是1/4。“至少1个男孩”的概率是“男-男”的概率加上“男-女”的概率再加上“女-男”的概率。
- P(“2个男孩”) = 1/4
- P(“至少1个男孩”) = (1/4 + 1/4 + 1/4) = 3/4
因此
- P(“2个男孩” | “至少1个男孩”) = P(“2个男孩”) / P(“至少1个男孩”)
- P(“2个男孩” | “至少1个男孩”) = (1/4) / (3/4)
- P(“2个男孩” | “至少1个男孩”) = 1 /3
或者用数值代替分数:
- P(“2个男孩” | “至少1个男孩”) = P(“2个男孩”) / P(“至少1个男孩”)
- P(“2个男孩” | “至少1个男孩”) = 0.25 / 0.75
- P(“2个男孩” | “至少1个男孩”) = 0.333
注意,这个计算的一个版本可以在《概率:写给热情的初学者》的第96页找到。
这是一个有用的例子,说明了我们如何通过列举可能的情况来克服我们错误的直觉并得出正确答案,以及如何通过计算条件概率达到同样的目的。
蒙提霍尔问题
应用概率论中最后一个经典问题被称为游戏节目问题,或蒙提霍尔问题。
它基于一个名为“Let’s Make a Deal”的真实游戏节目,并以该节目主持人的名字命名。
这个问题通常可以描述如下:
问题:参赛者可以选择三扇门中的一扇。其中一扇门后是一辆汽车,另外两扇门后是山羊。一旦参赛者选择了一扇门,知道汽车在哪里的主持人会打开另一扇有山羊的门,并询问参赛者是否愿意坚持自己的选择,还是换到另一扇未打开的门。
这是另一个经典问题,因为它的解决方案不符合直觉,并且在过去曾引起巨大的困惑和争论。
对这个问题的直觉认为,最初选中有车的概率是1/3或33%,一旦主持人打开一扇门露出山羊,这个概率就变成了1/2或50%。
这是不正确的。
我们可以从列举所有组合并列出无条件概率开始。假设有三扇门,用户随机选择一扇门,例如门1。
1 2 3 4 |
门1 | 门2 | 门3 | 无条件概率 山羊 山羊 汽车 1/3 山羊 汽车 山羊 1/3 汽车 山羊 山羊 1/3 |
在这个阶段,有1/3的概率得到汽车,这与我们目前的直觉相符。
然后,主持人打开另一扇有山羊的门,在这种情况下是门2。
被打开的门不是随机选择的;相反,它是根据汽车不在哪里的信息来选择的。
我们的直觉告诉我们,从表格中移除第二种情况,并将剩下每种情况的概率更新为1/2。
这是不正确的,也是错误的根源。
我们可以将我们对这种情况的直觉条件概率总结如下:
1 2 3 4 |
门1 | 门2 | 门3 | 无条件 | 条件 山羊 山羊 汽车 1/3 1/2 山羊 汽车 山羊 1/3 0 汽车 山羊 山羊 1/3 1/2 |
如果参赛者在主持人开门之前没有做出选择,这会是正确的,例如,如果主持人开门是独立的事件。
诀窍在于,参赛者在主持人开门前做出了选择,这是一个有用的信息。这意味着主持人不能打开被选中的门(门1),也不能打开后面有车的门。主持人的选择依赖于参赛者的第一次选择,并且受到了限制。
相反,我们必须计算换门或不换门的概率,而不管主持人打开哪扇门。
让我们来看一张在选择门1的情况下,坚持或更换选择的结果表。
1 2 3 4 |
门1 | 门2 | 门3 | 坚持 | 更换 山羊 山羊 汽车 山羊 汽车 山羊 汽车 山羊 山羊 汽车 汽车 山羊 山羊 汽车 山羊 |
我们可以看到,2/3的情况下换门会赢得汽车(前两行),而1/3的情况下如果我们坚持选择会赢得汽车(最后一行)。
如果参赛者换门,他们赢得汽车的概率是2/3或66.66%。
他们应该总是换门。
我们通过列举和计数解决了这个问题。
解决这个问题的另一种方法是,计算主持人在两种情况下(坚持或更换)打开门的联合概率,以最大化期望结果的概率。
例如,假设参赛者选择了门1,我们可以计算如果门1后面是汽车,主持人打开门3的概率如下:
- P(门1=汽车 且 门3=打开) = 1/3 * 1/2
- = 0.333 * 0.5
- = 0.166
然后我们可以计算门2有车且主持人打开门3的联合概率。这有所不同,因为如果车在门2后面,主持人只能打开门3;这是一个概率为1.0的确定事件。
- P(门2=汽车 且 门3=打开) = 1/3 * 1
- = 0.333 * 1.0
- = 0.333
在选择了门1且主持人打开了门3的情况下,汽车在门2后面的概率(约33%)比在门1后面的概率(约16%)要高。我们应该换门。
在这种情况下,我们应该换到门2。
或者,我们可以模拟主持人打开门2的选择,其概率结构相同。
- P(门1=汽车 且 门2=打开) = 0.166
- P(门3=汽车 且 门2=打开) = 0.333
同样,在选择了门1且主持人打开了门2的情况下,汽车在门3后面的概率(约33%)比在门1后面的概率(约16%)要高。我们应该换门。
如果我们寻求最大化这些概率,那么最好的策略就是换门。
同样,在这个例子中,我们看到了如何通过列举情况和使用条件概率来克服我们错误的直觉并解决问题。
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
书籍
- 《概率:写给热情的初学者》, 2016.
- 《概率论:科学的逻辑》, 2003.
文章
总结
在这篇文章中,您通过解决一些经典且发人深省的问题,学习了如何培养对概率的直觉。
具体来说,你学到了:
- 如何通过概率相乘来解决生日问题。
- 如何使用条件概率解决男孩女孩问题。
- 如何使用联合概率解决蒙提霍尔问题。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
嗨,Jason,
好文——又一篇。
我只是想知道你那里是不是有个笔误
在情况1中,我们知道最大的孩子,也就是结果的第二部分,是个男孩,因此我们可以将问题陈述如下
P(男-男 | {男-男 或 女-男})
我们可以如下计算条件概率
= P(男-男 且 {男-男 或 女-男}) / P({男-男 或 女-男}) (<- 这一行)
= P(男-男) / P({男-男 或 女-男})
= 1/4 / 2/4
= 0.25 / 0.5
= 0.5
这个“且 {男-男 或 女-男}”是不是多余了?因为这意味着
P(A|B)
= (P(A,B) 且 P(B)) / P(B)
= P(A,B) / P(B)
还是我错了?
可以更清楚些,谢谢你的提醒。
我们正在解决
– P (A | B) = P(A and B) / P(B)
其中
A = 男-男
B = {男-男 或 女-男}
是的,我想我有点被搞糊涂了,因为我没有把额外的信息也考虑到数学计算中。因此,A = {男-男} 而不是 = {男-男, 男-女} 是因为上下文给出的额外信息…
是的,我应该用 BB/GG 符号来更清楚地表达!
在这种情况下,
P (A | B) = P(A and B) / P(B)
我们正在解决
– P (A | B) = P(A and B) / P(B)
其中
A = 男-男
B = {男-男 或 女-男}
为什么下一步只出现了P(A)?
“and B”去哪儿了?
好问题,这是条件概率的一个规则:
– P(A and B) = P(A),如果事件A是事件B的子集。
我已经更新了例子来更好地解释这一点。
嘿 Jason,干得漂亮!不过有个问题,那个比较次数的计算在解决第一个问题时是怎么用的?除非我漏掉了什么,否则它似乎没有用在最终的计算中…
好问题。
它没有被使用,只是为了让你对正在发生的事情有个概念。
很抱歉造成困惑。
在计算 P(男-男 | {男-男 或 女-男 或 男-女}) 时
因为
P(男-男) = 1/4
P({男-男 或 女-男 或 男-女}) = 1/4 + 1/4 + 1/4 = 3/4
那么,答案不应该是这个吗?
P(男-男 | {男-男 或 女-男 或 男-女}) / P({男-男 或 女-男 或 男-女})
= (1/4 * 3/4)/ (3/4)
= 1/4
=0.25
我不确定最后怎么会得出0.333
好问题,我已经更新了例子,使其更清晰。
我可能会再审视一下,我想我能让它更清楚。
更新:好的,我已经大幅更新了它,并添加了关于条件概率中子集事件的重要细节。
告诉我是否有帮助。