跳转至

3.4   条件概率

桌游结束后,小率把一副扑克牌摊在咖啡桌上。他抽出四张 K,又抽出所有红色牌,问均哥:“从整副牌里抽到 K 的概率是 \(4/52\),这个我会。可如果已经知道这张牌是红色呢?”

均哥把牌分成两堆:一堆红牌,一堆黑牌。

“你刚刚说的‘已经知道’,就是条件概率的开关。”他说,“它会把我们看的范围缩小。不是在 52 张牌里看,而是在条件指定的那一堆里看。”

用扑克牌理解条件概率

这一节全程用这副扑克牌。我们会看到:条件概率的核心不是公式多复杂,而是分母变了。


3.4.1   已知条件会缩小分母

设:

  • \(A\):抽到 K。
  • \(B\):抽到红色牌。

如果没有任何条件,整副牌有 52 张,K 有 4 张:

\[ P(A)=\frac{4}{52}=\frac{1}{13} \]

但如果已经知道这张牌是红色,能看的范围就从 52 张缩到 26 张红牌。红牌里的 K 只有红桃 K 和方块 K 两张:

\[ P(A\mid B)=\frac{2}{26}=\frac{1}{13} \]

这个例子里数值刚好没变,但原因不是条件无效,而是 K 在红牌和黑牌里分布得很均匀。

竖线右边的 B,不是“除以 B”,而是“只在 B 的世界里看”?
正是。条件概率最核心的动作,就是换分母。

图 3.4.1 条件概率是条件区域里的比例


3.4.2   公式从“只在条件里看”长出来

如果 \(P(B)>0\)条件概率(Conditional Probability) 定义为:

\[ P(A\mid B)=\frac{P(A\cap B)}{P(B)} \]

用中文读就是:

\[ \text{B 里面 A 的比例} = \frac{\text{A 和 B 同时发生的概率}}{\text{B 发生的概率}} \]

在扑克牌例子里:

  • \(A\cap B\):既是 K,又是红牌,共 2 张。
  • \(B\):红牌,共 26 张。

所以:

\[ P(A\mid B)=\frac{2/52}{26/52}=\frac{2}{26} \]

把公式移项,就得到乘法公式:

\[ P(A\cap B)=P(B)P(A\mid B) \]

它很适合读“先缩小范围,再在范围里挑”的问题:先走到红牌这堆,再在红牌里找 K。


3.4.3   条件方向一换,问题就换了

小率又问:“那‘红牌里是 K’和‘K 里面是红牌’,是不是一个意思?”

均哥把两张红色 K 和两张黑色 K 放到桌面中央:“这正是条件概率最容易错的地方。竖线右边换了,分母就换了。”

比较两句话:

问法 符号 分母是谁 结果
已知是红牌,问是不是 K \(P(K\mid 红牌)\) 26 张红牌 \(2/26=1/13\)
已知是 K,问是不是红牌 \(P(红牌\mid K)\) 4 张 K \(2/4=1/2\)

两个问题都在看“红色 K”这 2 张牌,但分母不同,所以答案不同。

原来分子一样,也不代表概率一样。关键是我在哪堆牌里看。
对。条件概率先定观察范围,再数目标。

这也是条件概率最容易出错的地方:句子里换了“已知谁”,问题就已经变了。做题时不要先看两个事件是不是一样,而要先看竖线右边是谁。


3.4.4   条件可以让概率变大、变小或不变

已知“红牌”没有改变抽到 K 的概率,因为 K 在红黑两堆里各有 2 张。但条件并不总是这么温和。

换一个条件:

  • \(C\):抽到人头牌,也就是 J、Q、K。

整副牌里 K 的概率是:

\[ P(K)=\frac{4}{52}=\frac{1}{13} \]

但如果已经知道这张牌是人头牌,范围缩小到 J、Q、K 共 12 张,其中 K 有 4 张:

\[ P(K\mid C)=\frac{4}{12}=\frac{1}{3} \]

这个条件让“抽到 K”的概率明显变大,因为它排除了 2 到 10 和 A 这些不可能是 K 的牌。

三步读条件概率

先圈出条件指定的范围;再在这个范围里圈出目标事件;最后用“目标格子数 / 条件格子数”计算。不要一上来就套公式。


3.4.5   用 Python 检查条件方向

suits = ["红桃", "方块", "黑桃", "梅花"]
ranks = ["A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"]
cards = [(suit, rank) for suit in suits for rank in ranks]

is_red = {card for card in cards if card[0] in ["红桃", "方块"]}
is_king = {card for card in cards if card[1] == "K"}
is_face = {card for card in cards if card[1] in ["J", "Q", "K"]}

p_king_given_red = len(is_king & is_red) / len(is_red)
p_red_given_king = len(is_king & is_red) / len(is_king)
p_king_given_face = len(is_king & is_face) / len(is_face)

print(f"P(K | 红牌) = {p_king_given_red:.3f}")
print(f"P(红牌 | K) = {p_red_given_king:.3f}")
print(f"P(K | 人头牌) = {p_king_given_face:.3f}")

代码做的事情和手算完全一样:先生成 52 张牌,再用集合筛选条件和目标。你可以试着把条件换成“黑牌”“红桃”“A 或 K”,观察分母如何改变。

需要注意

看到“已知”“在……中”“如果已经发生”“已经筛出来”这类词,就要先停一下:分母可能已经变了。很多概率题错,不是错在计算,而是错在分母没换。

小率的笔记本

  • \(P(A\mid B)\) 表示“已知 B 发生后,A 发生的概率”。
  • 条件概率的分母是 \(P(B)\),不是整个样本空间。
  • \(P(A\mid B)\)\(P(B\mid A)\) 通常不是一回事。
  • 分子相同不代表概率相同,因为分母可能不同。
  • 乘法公式 \(P(A\cap B)=P(B)P(A\mid B)\) 是条件概率的变形。