3.5 全概率公式¶
周末,小率帮家里整理水果摊。桌上有三类水果:西瓜 50 个,香蕉 30 个,橙子 20 个。顾客闭眼随机拿走一个水果,小率想知道:“拿到坏果的概率是多少?”
摊主告诉他们:西瓜里大约有 10 个坏果,香蕉里有 3 个,橙子里有 4 个。
小率下意识想把坏果直接加起来。均哥提醒他:“可以加,但要先看清楚每个坏果来自哪里。全概率公式做的事,就是按来源拆开,再把每条路加回去。”
这一节只围绕水果摊。我们会反复问同一个问题:一个结果可能从多个来源出现时,怎样把总概率算清楚?
3.5.1 先把来源分成不重叠的几类¶
把水果来源记成三个事件:
- \(A_1\):拿到西瓜。
- \(A_2\):拿到香蕉。
- \(A_3\):拿到橙子。
它们有两个特点:
- 互不重叠:一个水果不可能既是西瓜又是香蕉。
- 合起来完整:桌上所有水果都被这三类覆盖。
| 来源 | 数量 | 来源概率 |
|---|---|---|
| 西瓜 \(A_1\) | 50 | \(P(A_1)=0.5\) |
| 香蕉 \(A_2\) | 30 | \(P(A_2)=0.3\) |
| 橙子 \(A_3\) | 20 | \(P(A_3)=0.2\) |
全概率的第一步不是算坏果,而是先把“来自哪里”分清楚?
对。来源分组必须互不重叠,而且合起来不能漏。
先问分组是否完整
全概率公式最怕“漏掉一类”。如果桌上还有苹果,却没有把苹果放进来源分组,那么算出来的就不是整个水果摊的坏果概率。
3.5.2 每条路径都有两步¶
设 \(B\) 表示“拿到坏果”。顾客拿到坏果可以沿三条路径发生:
- 先拿到西瓜,再在西瓜里拿到坏果。
- 先拿到香蕉,再在香蕉里拿到坏果。
- 先拿到橙子,再在橙子里拿到坏果。
每条路径的贡献都是:
\[
\text{来源概率}\times\text{该来源下坏果概率}
\]
比如西瓜路径:
\[
P(A_1\cap B)=P(A_1)P(B\mid A_1)=0.5\times0.2=0.10
\]
这里 \(0.2\) 来自西瓜内部:50 个西瓜里有 10 个坏果。
| 路径 | 来源概率 | 来源内坏果概率 | 路径贡献 |
|---|---|---|---|
| 西瓜 \(\rightarrow\) 坏果 | \(0.5\) | \(10/50=0.2\) | \(0.10\) |
| 香蕉 \(\rightarrow\) 坏果 | \(0.3\) | \(3/30=0.1\) | \(0.03\) |
| 橙子 \(\rightarrow\) 坏果 | \(0.2\) | \(4/20=0.2\) | \(0.04\) |
3.5.3 全概率公式就是把所有路径贡献相加¶
三条坏果路径互不重叠,所以可以相加:
\[
\begin{aligned}
P(B)
&=P(A_1)P(B\mid A_1)+P(A_2)P(B\mid A_2)+P(A_3)P(B\mid A_3)\\
&=0.5\times0.2+0.3\times0.1+0.2\times0.2\\
&=0.17
\end{aligned}
\]
所以随机拿一个水果,拿到坏果的概率是 17%。
一般形式是:
\[
P(B)=\sum_{i=1}^{n}P(A_i)P(B\mid A_i)
\]
这就是 全概率公式(Law of Total Probability)。
它像是在说:总坏果率 = 各来源坏果贡献的总和。
很准确。每条路先乘,所有路再加。
3.5.4 为什么不能直接平均三个坏果率¶
小率看到三个来源内坏果率分别是 20%、10%、20%,差点直接算:
\[
\frac{20\%+10\%+20\%}{3}=16.7\%
\]
这个数字看起来和 17% 很接近,但只是巧合。它的问题在于:西瓜、香蕉、橙子的数量并不一样。
西瓜有 50 个,香蕉只有 30 个,橙子有 20 个。数量多的来源,对总坏果率影响更大。全概率公式本质上就是 加权平均:
\[
0.5\times20\%+0.3\times10\%+0.2\times20\%=17\%
\]
需要注意
只要各组大小不同,就不能简单平均各组比例。要用来源占比作为权重。这个思想在后面学习分层抽样、模型评估和混合分布时还会反复出现。
3.5.5 用 Python 复现水果摊计算¶
fruit_count = {"西瓜": 50, "香蕉": 30, "橙子": 20}
bad_count = {"西瓜": 10, "香蕉": 3, "橙子": 4}
total = sum(fruit_count.values())
path_rows = []
for name in fruit_count:
source_prob = fruit_count[name] / total
bad_given_source = bad_count[name] / fruit_count[name]
contribution = source_prob * bad_given_source
path_rows.append((name, source_prob, bad_given_source, contribution))
p_bad = sum(row[3] for row in path_rows)
for name, source_prob, bad_given_source, contribution in path_rows:
print(
f"{name}: 来源概率={source_prob:.2f}, "
f"来源内坏果率={bad_given_source:.2f}, 路径贡献={contribution:.2f}"
)
print(f"随机拿到坏果的总概率:{p_bad:.2f}")
这段代码和手算表格完全对应。每个来源先算“来源概率”和“来源内坏果率”,再把路径贡献加起来。
小率的笔记本
- 全概率公式用来求一个结果事件的总体概率。
- 先把样本空间拆成互不重叠、合起来完整的来源。
- 每条路径贡献 = 来源概率 × 来源内部的条件概率。
- 各组大小不同,不能简单平均各组比例,要做加权平均。
- 全概率公式常常是贝叶斯定理的分母。


