算法与数据结构 / 条件概率与贝叶斯定理的方阵表示 待审核
条件概率 · 贝叶斯定理

条件概率与贝叶斯定理的方阵表示

概率里最反直觉、也最实用的一块,是「知道了某件事之后,另一件事的概率怎么变」。本页用方阵——一个点代表一个人——把抽象的条件概率摊成能数的格子:先建立条件概率的换分母直觉,再用它推出贝叶斯定理,并复现容易误判的假阳性悖论。用可数的点来讲概率并非只是教学花招:Gigerenzer 与 Hoffrage 的实验表明,把同一道贝叶斯题从概率表述换成自然频次表述,正确率从约 16% 升到约 46% [3]。

1 · 条件概率的分母

条件概率 P(AB)P(A \mid B) 是「已知 B 发生了,这时 A 发生的概率」。它和无条件的 P(A)P(A) 区别只在分母:不再除以全体,而是只在 B 这群里数 A,即 P(AB)=P(AB)/P(B)P(A \mid B) = P(A \cap B) / P(B),其中要求 P(B)>0P(B) > 0

图 1-1 · 100 点方阵上的条件概率,一点一人,按是否属于 A 与 B 分四类。可拖动 P(B)P(B)P(AB)P(A \mid B)P(A¬B)P(A \mid \lnot B) 改变构成,切换「条件于 B」与「条件于 A」对比两个方向的条件概率;条件于 B 时不在 B 的点会变暗。

1.1 · 三者的换算关系

把方阵按是否属于 A、是否属于 B 分成四类,三个概率都是从同一张四格表里读出来的:

属于 B 不属于 B 行合计
属于 A nABn_{A \cap B} nA¬Bn_{A \cap \lnot B} nAn_A
不属于 A n¬ABn_{\lnot A \cap B} n¬A¬Bn_{\lnot A \cap \lnot B} n¬An_{\lnot A}
列合计 nBn_B n¬Bn_{\lnot B} 100

联合概率 P(AB)=nAB/100P(A \cap B) = n_{A \cap B} / 100,边缘概率 P(B)=nB/100P(B) = n_B / 100,而条件概率 P(AB)=nAB/nBP(A \mid B) = n_{A \cap B} / n_B——分母换成了 B 那一列的合计,不再是 100。恒等式 P(AB)=P(AB)P(B)P(A \cap B) = P(A \mid B) \cdot P(B) 不过是「先圈出 B,再在 B 里取 A」的两步连乘。

注 · 方阵的点数是整数,与滑块上的概率对不齐。condCounts 先取 nB=round(100P(B))n_B = \operatorname{round}(100 \cdot P(B)),再取 nAB=round(nBP(AB))n_{A \cap B} = \operatorname{round}(n_B \cdot P(A \mid B)),两次取整叠加。实测把滑块设成 P(B)=0.03P(B) = 0.03P(AB)=0.80P(A \mid B) = 0.80 时,nB=3n_B = 3nAB=round(2.4)=2n_{A \cap B} = \operatorname{round}(2.4) = 2,图 1-1 显示的 P(AB)P(A \mid B) 是 0.67 而非 0.80;P(B)=0.07P(B) = 0.07P(AB)=0.50P(A \mid B) = 0.50 时显示 0.57。B 越小误差越大,这是用 100 个可数对象表示概率的代价。

1.2 · 两个方向的条件概率

「下雨时我多半带伞」和「我带伞时多半在下雨」是两回事:前者是 P()P(\text{伞} \mid \text{雨}),后者是 P()P(\text{雨} \mid \text{伞}),分母一个是下雨的日子、一个是带伞的日子,数值可以差很远。同一批人、同一个方阵,两个方向的比例一般不相等——在 P(A),P(B)>0P(A), P(B) > 0 时,P(AB)=P(BA)P(A \mid B) = P(B \mid A) 当且仅当 P(A)=P(B)P(A) = P(B)。把这两者混为一谈,就是检察官谬误 (prosecutor's fallacy) [4] 与误读检测结果的根源。如何从一个换算到另一个,正是 §2 的贝叶斯定理要回答的。

1.3 · 独立与互斥

AABB 独立的定义式是 P(AB)=P(A)P(B)P(A \cap B) = P(A) P(B)。在 P(B)>0P(B) > 0 时它等价于 P(AB)=P(A)P(A \mid B) = P(A),即知道 B 对 A 没有任何信息;但 P(B)=0P(B) = 0P(AB)P(A \mid B) 无定义,而独立性仍然成立,所以定义要落在乘积式上。图 1-1 的 P(B)P(B) 滑块下界就是 0,拖到底即可看到这一格:读数打印一个破折号。

警示 · 独立与互斥是两回事,且方向相反。互斥是 P(AB)=0P(A \cap B) = 0——四格表里「既 A 又 B」那格清零;在 P(A),P(B)>0P(A), P(B) > 0 时它意味着 P(AB)=0<P(A)P(A \mid B) = 0 < P(A),即强负相关,绝不可能独立。两个词都表达「无关」的日常语感,但一个说的是「同时发生的概率等于各自概率之积」,另一个说的是「不可能同时发生」。

1.4 · 条件概率的落点

朴素贝叶斯分类器(垃圾邮件的 P(垃圾出现「中奖」)P(\text{垃圾} \mid \text{出现「中奖」}))、推荐与广告的点击率 P(点击看到)P(\text{点击} \mid \text{看到})、医学与风控里「出现某症状或某特征后的风险」,以及一切带条件的统计,用的都是这一个分母替换。

2 · 从似然到后验

§1 表明两个方向的条件概率一般不相等,但两者之间有一座桥,这就是贝叶斯定理。最典型的场景:有一种病,检测结果呈阳性,检测本身很准(有病几乎必中),那么真有病的概率是多少?直觉常以为接近检测的准确度,正确答案往往低得多。

检测的准确度给出的是 P(+有病)P(+ \mid \text{有病}),即有病的人里测出阳性的比例;而真正要问的是 P(有病+)P(\text{有病} \mid +),即测出阳性的人里真有病的比例。分母完全不同,贝叶斯定理负责把前者换算成后者,关键变量是那个最容易被忽略的患病率,即先验概率 (prior)

图 2-1 · 1000 人的检测结果方阵,真阳、漏检、假阳、真阴各成一类。可拖动患病率、灵敏度、假阳率,切换「只看阳性」清点阳性人群中真有病的比例。

2.1 · 方阵到公式的翻译

后验等于真阳除以所有阳性,也就是真阳除以真阳加假阳。写成概率即贝叶斯定理:

P(D+)=P(+D)P(D)P(+D)P(D)+P(+¬D)P(¬D)P(D \mid +) = \frac{P(+ \mid D)\, P(D)}{P(+ \mid D)\, P(D) + P(+ \mid \lnot D)\, P(\lnot D)}

分子是「有病且测出阳性」,分母是「所有测出阳性的」,即有病的真阳加没病的假阳。先验 P(D)P(D) 同时出现在分子里:病越罕见,分子越小,后验被假阳性稀释得越严重。

2.2 · 基础比率与假阳性悖论

保持灵敏度 99%、假阳率 5%,把患病率拖到 1%:1000 人里约有 10 个真病人,其中期望 9.9 人被测出(方阵取整后显示 10 个真阳);而 990 个健康人里有约 50 个被误报。于是阳性共 60 人,真有病的只有 10 个,P(D+)10/6017%P(D \mid +) \approx 10/60 \approx 17\%。检测明明很准,阳性里却约八成是误报。

根源在于健康人基数太大:哪怕每人只有 5% 的误报概率,绝对数量也能淹没真正的病人。忽略这个基础比率 (base rate)、直接把检测准确度当成患病概率,就是基础比率谬误 [2]。1978 年的一项调查里,60 名哈佛医学院师生面对同类题目只有 11 人答对,多数人答 95% [1]。

注 · 灵敏度从 99% 拨到 100%,方阵一个点都不变。实测 bayesModel(0.01, 0.99, 0.05)bayesModel(0.01, 1, 0.05) 的真阳都是 10——前者的期望值 9.9 被 Math.round 进位,漏检的那 0.1 人在 1000 点的粒度上根本看不见。原以为会少掉一个绿点,实际没有。

2.3 · 0.1% 患病率下的后验

把参数推到更极端:患病率 P(D)=0.1%P(D) = 0.1\%(每 1000 人一例)、检测无假阴(灵敏度 P(+D)=1P(+ \mid D) = 1)、假阳率 P(+¬D)=5%P(+ \mid \lnot D) = 5\%

例 2.1 先用全概率公式算出分母,即任何人测出阳性的总概率,它由「有病且阳性」与「没病但阳性」两条路径合成:

P(+)=P(+D)P(D)+P(+¬D)P(¬D)=1×0.001+0.05×0.999=0.05095P(+) = P(+ \mid D)\, P(D) + P(+ \mid \lnot D)\, P(\lnot D) = 1 \times 0.001 + 0.05 \times 0.999 = 0.05095

再代入贝叶斯定理,分子是「有病且阳性」这一条路径:

P(D+)=P(+D)P(D)P(+)=0.0010.050950.0196P(D \mid +) = \frac{P(+ \mid D)\, P(D)}{P(+)} = \frac{0.001}{0.05095} \approx 0.0196

所以阳性者真有病的概率只有约 1.96%。把图 2-1 的三个滑块拨到患病率 0.1%、灵敏度 100%、假阳率 5%,真阳占全部阳性的比例(1/511/51)会还原出同一个数。

关键仍是基数差:1000 人里只有 1 个病人(灵敏度 100% 时必被测出),而 999 个健康人中有约 999×5%50999 \times 5\% \approx 50 人被误报。阳性共约 51 人,真有病的只有 1 个。患病率从前一节的 1% 再降一个数量级到 0.1%,后验也随之从约 17% 跌到约 2%。先验越低,同一份「准」检测给出的阳性结果越不可信。

警示 ·「第一次的后验成为第二次的先验」这句话有前提:两次检测在给定患病状态下条件独立。同一套试剂、同一个体身上的系统性干扰(交叉反应物质、样本本身的性质)会让误报高度相关,对这类人复检往往还是阳性,第二次的似然比远小于 P(+D)/P(+¬D)P(+ \mid D) / P(+ \mid \lnot D)。这正是临床上复检要换一种原理的检测,而不是把同一支试纸再跑一遍的原因。

2.4 · 后验更新的落点

医学筛查(癌症与罕见病的复检策略)、垃圾邮件与风控(贝叶斯过滤、反欺诈打分)、机器学习(朴素贝叶斯、贝叶斯推断与 MAP 估计)、A/B 与在线学习(用数据不断把先验更新成后验)。凡是「拿到新证据,理性地修正原有判断」,底层都是这一个式子。

P(AB)=P(AB)/P(B)P(A \mid B) = P(A \cap B) / P(B) 是定义。把它对 P(AB)P(A \mid B)P(BA)P(B \mid A) 各写一遍,两式的分子同是 P(AB)P(A \cap B),消去它再除以 P(B)P(B),即得 P(AB)=P(BA)P(A)/P(B)P(A \mid B) = P(B \mid A) P(A) / P(B)(需 P(A),P(B)>0P(A), P(B) > 0)。左边是看到证据后的置信,右边的 P(A)P(A) 是看到证据前的置信。本页做的事,就是把这一个式子变成方阵上能数出来的东西。

3 · 参考文献

  1. Casscells, W., Schoenberger, A., & Graboys, T. B. (1978). Interpretation by physicians of clinical laboratory results. New England Journal of Medicine, 299(18), 999–1001.
  2. Bar-Hillel, M. (1980). The base-rate fallacy in probability judgments. Acta Psychologica, 44(3), 211–233.
  3. Gigerenzer, G., & Hoffrage, U. (1995). How to improve Bayesian reasoning without instruction: Frequency formats. Psychological Review, 102(4), 684–704.
  4. Thompson, W. C., & Schumann, E. L. (1987). Interpretation of statistical evidence in criminal trials: The prosecutor's fallacy and the defense attorney's fallacy. Law and Human Behavior, 11(3), 167–187.

相关链接

  • Conditional probability Wikipedia 条件概率的定义、与独立性和联合分布的关系, 以及常见谬误 (检察官谬误等)。
  • Bayes' theorem Wikipedia 贝叶斯定理的推导、医学检测假阳性例子, 以及在统计推断里的角色。
  • Base rate fallacy Wikipedia 忽略基础比率 (患病率) 导致严重高估后验的经典认知偏差——本讲 §2 的主角。
  • Seeing Theory Brown University 把概率论做成可视化交互的经典网站, 贝叶斯一章与本讲思路相通。