📈 第6章 贝叶斯统计
📄 一句话概括

把三个输入(基础率、灵敏度、特异度)写成一个函数,输出一个数(阳性者真得病的概率)。 用整数思考复杂概率:一万人里有多少个病人、多少个假阳性,比套公式清楚得多,也讲得出口。 贝叶斯规则最实用的性质是能反复用:上一次的后验,就是下一次的先验。

📝 本章和前面几章的关系

前一篇把术语和算法补齐了。这一篇把它变成一个能反复调用的工具。 书里到这一步开始讲「反复使用」。这里的两次阳性、一次阴性都是真算的,数可以自己复现。

一、写成一行函数

输入三个数,输出一个数。函数体只有三行:算真阳性、算假阳性、相除。 写成函数的好处不是省打字,是思路被固定下来了:以后不管换成什么检测、什么病,动作完全一样。 这也是一种检验:如果你说不清这三个输入是什么,说明你还没搞清这道题。

二、用整数思考复杂概率

一万个人:100 个病人、9900 个健康人。病人里 99 个真阳性,健康人里 495 个假阳性。 阳性合计 594 个,真病人 99 个,比例 16.7%——和一千人那次数出来的一样。 为什么用一万人?因为 100 个病人比 10 个病人好想象,99 和 495 也是整数,不用带小数。

换成大一点的整数,不是为了更准,是为了更好讲。给人讲概率时,这一招特别管用。

三、后验变先验:规则可以反复用

第一次阳性之后,你的基础率从 1% 变成 16.7%。这个 16.7% 就是你的新起点。 第二次试验时,把 16.7% 代进同一个函数,别的一个字都不用改。 算出来 79.8%。两次阳性之后,概率从 1% 涨到 79.8%,这时候确实该认真了。

注意「反复用」的前提:两次试验要相互独立。同一台机器连测两次、同一个样本分两管,都不算独立。

四、为什么第二次的信息量更大

第一次阳性:分母里 990 个健康人贡献了 49.5 个假阳性,把答案压得很低。 第二次阳性:这时候「健康人」只剩 83.3%,假阳性的绝对量少了,真阳性占比就上来了。 两次阳性 79.8%,比一次阳性的 16.7% 高 4.8 倍。这就是复查的价值。

反过来说,如果两次试验用的是同一台仪器、同一个批次试剂, 那第二次几乎不提供新信息——它只是把第一次的错误又犯了一遍。

五、这套规则的边界

第一,先验是主观的。1% 这个数来自人群统计,落到你身上未必对——你有家族史,就该用更高的先验。 第二,独立性是假设。现实里的两次检测经常相关,这时候「乘两次」会高估证据的分量。 第三,它只处理「一个假设、一条证据」的简单情形。 多个假设并存时,要像 5.5 那样把每条都算一遍再归一化。

这三条边界不削弱方法,只提醒你别把它当万能公式。

六、动手 Demo:把贝叶斯规则用起来

把规则写成函数,先算一次阳性,再把结果当代入算第二次。 顺便对比「一次阳性」和「两次阳性」的差距。

def bayes(base, sens, spec):
    hit = base * sens
    fa = (1.0 - base) * (1.0 - spec)
    return hit / (hit + fa)

SENS, SPEC = 0.99, 0.95
p1 = bayes(0.01, SENS, SPEC)
p2 = bayes(p1, SENS, SPEC)
print("一次阳性:%.1f%%" % (p1 * 100))
print("两次阳性:%.1f%%" % (p2 * 100))
print("相对起点放大:%.1f 倍 -> %.1f 倍" % (p1 / 0.01, p2 / 0.01))

print()
print("一万人的整数版:")
N = 10000
sick = N * 0.01
well = N - sick
print("病人 %.0f,真阳性 %.0f,假阳性 %.0f,阳性合计 %.0f"
      % (sick, sick * SENS, well * (1 - SPEC),
         sick * SENS + well * (1 - SPEC)))
print("真病人占阳性者 %.1f%%"
      % (sick * SENS / (sick * SENS + well * (1 - SPEC)) * 100))

实跑输出:

--------------------------------------------------------------------
把贝叶斯规则用起来
--------------------------------------------------------------------

  ① 写成一行函数
  --------------------------------------------------------------------
  输入三个数(基础率、灵敏度、特异度),输出一个数(阳性者真得病的概率)。
  写成函数的好处是:以后遇到任何「检测 + 稀有事件」的问题,换参数就能用。

  ② 反复用:后验变先验
  --------------------------------------------------------------------
  第一次阳性之后,你的「基础率」不再是 1%,而是 16.7%。
  第二次试验时,把这个数代进同一个函数就行——规则本身一个字都不用改。
  这就是贝叶斯规则最实用的性质:算完的结果能当下一轮的起点。

  ③ 第二次也是阳性
  --------------------------------------------------------------------
  把 16.7% 当基础率,再算一次阳性:79.8%。
  两次阳性之后,概率从 1% 涨到 79.8%,这时候确实该认真了。

  ④ 一次阳性和两次阳性,差多少
  --------------------------------------------------------------------

| 情形 | 患病概率 | 相对起点 |
|---|---:|---:|
| 一开始 | 1.00% | — |
| 阳性一次 | 16.7% | ×16.7 |
| 阳性两次 | 79.8% | ×79.8 |

  一次阳性只把你从 1.0% 抬到 16.7%,两次才到 79.8%。
  第二次阳性的信息量比第一次大:因为分母里的健康人少了,假阳性的灌水也少了。
  ! 所以医生才说「建议复查」——单次结果不足以定论,两次才勉强够。

  ⑤ 这套规则不只用于医学
  --------------------------------------------------------------------
  垃圾邮件过滤、故障诊断、推荐系统冷启动,都是「先给一个基础率,再看证据」的同一套动作。
  判断一件事能不能用贝叶斯,只问一句:我有没有一个能更新的事前判断?有就能用。

一万人的版本和一千人的版本算出同一个 16.7%,但一万那个版本更适合讲给人听:99 和 495 都是整数。 两次阳性的 79.8% 有个前提:两次试验独立。同一台机器连测两次,第二次基本不提供新信息。

30 秒实验

  1. 如果先验不是 1% 而是 5%(你有家族史),两次阳性之后是多少?
  2. 如果两次试验不独立(第二次只是重复第一次的错误),结果会偏高还是偏低?为什么?
  3. 想一想:这套规则能不能用来判断「这封邮件是不是垃圾」?它的三个输入分别是什么?

常见误区

  1. 忘了独立性假设:相关证据不能简单相乘,否则会高估。
  2. 先验随手填:先验错了,后面全错。宁可给一个区间,也别给一个拍脑袋的数。
  3. 只算一次就停:规则的价值在反复用,用一次等于浪费。
  4. 把它当万能公式:多假设并存时要做归一化,不是套一次函数就完事。
自测三问(点开对答案) 1. 为什么后验能当先验用? —— 因为「当前掌握的信息」就是下一次判断的起点。贝叶斯规则不关心这个起点是怎么来的。 2. 两次阳性的前提是什么? —— 两次试验相互独立。相关性强的两次检测,等于把同一条证据算了两遍。 3. 为什么用一万人而不是一千人来讲? —— 因为大整数更好想象、更好讲:99 个真阳性、495 个假阳性,都不用带小数。

规则能反复用了。下一篇看它最有用的一次应用:第二次结果是阴性,你的答案该怎么改。

相关笔记