跳转至

3.5   全概率公式

周末,小率帮家里整理水果摊。桌上有三类水果:西瓜 50 个,香蕉 30 个,橙子 20 个。顾客闭眼随机拿走一个水果,小率想知道:“拿到坏果的概率是多少?”

摊主告诉他们:西瓜里大约有 10 个坏果,香蕉里有 3 个,橙子里有 4 个。

小率下意识想把坏果直接加起来。均哥提醒他:“可以加,但要先看清楚每个坏果来自哪里。全概率公式做的事,就是按来源拆开,再把每条路加回去。”

用水果摊理解全概率公式

这一节只围绕水果摊。我们会反复问同一个问题:一个结果可能从多个来源出现时,怎样把总概率算清楚?


3.5.1   先把来源分成不重叠的几类

把水果来源记成三个事件:

  • \(A_1\):拿到西瓜。
  • \(A_2\):拿到香蕉。
  • \(A_3\):拿到橙子。

它们有两个特点:

  1. 互不重叠:一个水果不可能既是西瓜又是香蕉。
  2. 合起来完整:桌上所有水果都被这三类覆盖。
来源 数量 来源概率
西瓜 \(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.2 联合概率、来源概率和条件概率的关系


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} \]

图 3.5.1 全概率公式把坏果按来源拆开再加总

所以随机拿一个水果,拿到坏果的概率是 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}")

这段代码和手算表格完全对应。每个来源先算“来源概率”和“来源内坏果率”,再把路径贡献加起来。

小率的笔记本

  • 全概率公式用来求一个结果事件的总体概率。
  • 先把样本空间拆成互不重叠、合起来完整的来源。
  • 每条路径贡献 = 来源概率 × 来源内部的条件概率。
  • 各组大小不同,不能简单平均各组比例,要做加权平均。
  • 全概率公式常常是贝叶斯定理的分母。