把三个输入(基础率、灵敏度、特异度)写成一个函数,输出一个数(阳性者真得病的概率)。 用整数思考复杂概率:一万人里有多少个病人、多少个假阳性,比套公式清楚得多,也讲得出口。 贝叶斯规则最实用的性质是能反复用:上一次的后验,就是下一次的先验。
前一篇把术语和算法补齐了。这一篇把它变成一个能反复调用的工具。 书里到这一步开始讲「反复使用」。这里的两次阳性、一次阴性都是真算的,数可以自己复现。
一、写成一行函数
输入三个数,输出一个数。函数体只有三行:算真阳性、算假阳性、相除。 写成函数的好处不是省打字,是思路被固定下来了:以后不管换成什么检测、什么病,动作完全一样。 这也是一种检验:如果你说不清这三个输入是什么,说明你还没搞清这道题。
二、用整数思考复杂概率
一万个人: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% 而是 5%(你有家族史),两次阳性之后是多少?
- 如果两次试验不独立(第二次只是重复第一次的错误),结果会偏高还是偏低?为什么?
- 想一想:这套规则能不能用来判断「这封邮件是不是垃圾」?它的三个输入分别是什么?
常见误区
- 忘了独立性假设:相关证据不能简单相乘,否则会高估。
- 先验随手填:先验错了,后面全错。宁可给一个区间,也别给一个拍脑袋的数。
- 只算一次就停:规则的价值在反复用,用一次等于浪费。
- 把它当万能公式:多假设并存时要做归一化,不是套一次函数就完事。
自测三问(点开对答案)
1. 为什么后验能当先验用? —— 因为「当前掌握的信息」就是下一次判断的起点。贝叶斯规则不关心这个起点是怎么来的。 2. 两次阳性的前提是什么? —— 两次试验相互独立。相关性强的两次检测,等于把同一条证据算了两遍。 3. 为什么用一万人而不是一千人来讲? —— 因为大整数更好想象、更好讲:99 个真阳性、495 个假阳性,都不用带小数。规则能反复用了。下一篇看它最有用的一次应用:第二次结果是阴性,你的答案该怎么改。
- ☐ (本篇完,下一篇 6.5 第二次试验与新的基础概率)