5D Library › 概率判断、布莱尔分数校准与群体智慧的统计理论 · English

第四章 信号检测论:看得清与门槛放在哪里

两种不同的能力

雷达操作员盯着屏幕上的光点:这是一架飞机,还是一团噪声?医生看一张影像:这是病灶,还是正常的变异?投资者看到一条消息:这是机会,还是噪声?在每一种情境里,判断都包含两件事。第一,看得清不清:信号与噪声在证据上分得有多开。第二,门槛放在哪里:证据达到什么程度才说「是」。一个判断者可以眼力很好但门槛太低,也可以眼力一般但门槛合适。

信号检测论把这两件事分开 (Green and Swets 1966; Macmillan and Creelman 2005)。它在第二次世界大战后的雷达与心理物理学研究中发展起来,后来被用于医学诊断、天气预报、测谎、记忆研究等许多领域 (Swets, Dawes, and Monahan 2000)。

模型与指标

最简单的形式是等方差高斯模型:在没有信号的「噪声」试次中,判断者感受到的证据 xx 服从 N(0,1)N(0, 1);在有信号的试次中,服从 N(d′,1)N(d', 1)。判断者在 xx 超过某个标准 kk 时说「有信号」。于是有四种结果:击中(有信号且说有)、漏报、虚报(无信号却说有)与正确拒绝。设击中率为 HH,虚报率为 FAFA,z(⋅)z(\cdot) 为标准正态分布函数的反函数,则

d′=z(H)−z(FA),c=−z(H)+z(FA)2,β=ecd′.d' = z(H) – z(FA), \qquad c = -\frac{z(H) + z(FA)}{2}, \qquad \beta = e^{c\,d'}.

d′d' 是辨别力,即两个分布的均值相距几个标准差;cc 是判断标准的位置,c=0c = 0 表示门槛在两个分布的正中间,c<0c < 0 表示偏向说「是」(宽松),c>0c > 0 表示偏向说「否」(严格);β\beta 是门槛处的似然比 P(x∣S)/P(x∣N)P(x \mid S)/P(x \mid N)。

推导

四位虚构的判断者,以及不同辨别力下的接受者操作特征曲线(ROC 曲线)上的几个点。对等方差高斯模型,ROC 曲线下的面积为 AUC=Φ(d′/2)\text{AUC} = \Phi(d'/\sqrt{2})。

推导

# Equal-variance Gaussian signal detection: noise N(0, 1), signal N(d', 1).
# d' = z(H) - z(FA), c = -(z(H) + z(FA)) / 2, beta = exp(c d'), AUC = Phi(d' / sqrt 2).
import math
from statistics import NormalDist

N = NormalDist()

def sdt(h, fa):
    zh, zf = N.inv_cdf(h), N.inv_cdf(fa)
    d = zh - zf
    c = -(zh + zf) / 2 + 0.0
    return d, c, math.exp(c * d)

def roc(d, crits):
    return [(1 - N.cdf(k), 1 - N.cdf(k - d)) for k in crits]

if __name__ == "__main__":
    print("observer                 |   H     FA  |   d'      c    beta")
    for name, h, fa in (("neutral", 0.84, 0.16), ("liberal (says yes a lot)", 0.95, 0.40),
                        ("conservative", 0.50, 0.023), ("weak but liberal", 0.90, 0.69)):
        d, c, b = sdt(h, fa)
        print(f"{name:24s} | {h:.3f} {fa:.3f} | {d:5.2f} {c:+6.2f} {b:6.2f}")
    for d in (0.5, 1.0, 2.0):
        pts = roc(d, (-1.0, 0.0, 1.0, 2.0))
        auc = N.cdf(d / math.sqrt(2))
        print(f"ROC d' = {d}: AUC = {auc:.3f}; (FA, H) at criteria -1, 0, 1, 2:")
        print("    " + "  ".join(f"({f:.2f}, {h:.2f})" for f, h in pts))
# observer                 |   H     FA  |   d'      c    beta
# neutral                  | 0.840 0.160 |  1.99  +0.00   1.00
# liberal (says yes a lot) | 0.950 0.400 |  1.90  -0.70   0.27
# conservative             | 0.500 0.023 |  2.00  +1.00   7.32
# weak but liberal         | 0.900 0.690 |  0.79  -0.89   0.50
# ROC d' = 0.5: AUC = 0.638; (FA, H) at criteria -1, 0, 1, 2:
#     (0.84, 0.93)  (0.50, 0.69)  (0.16, 0.31)  (0.02, 0.07)
# ROC d' = 1.0: AUC = 0.760; (FA, H) at criteria -1, 0, 1, 2:
#     (0.84, 0.98)  (0.50, 0.84)  (0.16, 0.50)  (0.02, 0.16)
# ROC d' = 2.0: AUC = 0.921; (FA, H) at criteria -1, 0, 1, 2:
#     (0.84, 1.00)  (0.50, 0.98)  (0.16, 0.84)  (0.02, 0.50)

前三位判断者的辨别力几乎相同(d′d' 约为 2),差别全在门槛:中性者 c=0c = 0,β=1\beta = 1;宽松者 c=−0.70c = -0.70,击中率高达 95%,代价是 40% 的虚报;严格者 c=+1.00c = +1.00,几乎从不虚报(2.3%),却漏掉一半的信号。如果只看击中率,宽松者「最厉害」;如果只看虚报率,严格者「最厉害」;其实三人看得一样清楚。第四位判断者击中率 90%,看起来不错,但虚报率高达 69%,d′d' 只有 0.79:他主要是在什么都说「是」。

等方差高斯模型的 ROC 曲线。每条曲线对应一个辨别力 d',曲线上的每个点对应一个门槛位置;曲线越靠近左上角,看得越清。在 d' = 1.5 的曲线上标出了三个点:中性门槛(\beta = 1)、「抓机会」情境下的最优门槛(\beta^* = 6.0)与「筛查」情境下的最优门槛(\beta^* = 0.45)。同样的眼力,最优的门槛可以相差很远。

最优门槛

门槛应当放在哪里?这取决于两件事:信号本来有多常见,以及四种结果各有多大的得失。

推导

推导。 设信号出现的先验概率为 P(S)P(S),噪声为 P(N)=1−P(S)P(N) = 1 – P(S);击中的收益为 VHV_H,正确拒绝的收益为 VCRV_{CR},虚报的代价为 CFAC_{FA},漏报的代价为 CMC_M(都记为正数)。在证据为 xx 时说「是」比说「否」的期望收益多出

P(S∣x)(VH+CM)−P(N∣x)(VCR+CFA),P(S \mid x)(V_H + C_M) – P(N \mid x)(V_{CR} + C_{FA}),

当它大于零时应当说「是」。由贝叶斯定理,P(S∣x)/P(N∣x)=ℓ(x)P(S)/P(N)P(S \mid x)/P(N \mid x) = \ell(x)\,P(S)/P(N),其中 ℓ(x)\ell(x) 为似然比,于是最优规则是 ℓ(x)>β*\ell(x) > \beta^*,

β*=P(N)P(S)⋅VCR+CFAVH+CM.\beta^* = \frac{P(N)}{P(S)} \cdot \frac{V_{CR} + C_{FA}}{V_H + C_M}.

这就是格林与斯韦茨给出的最优似然比标准 (Green and Swets 1966)。在等方差高斯模型中 ℓ(x)=ed′x−d′2/2\ell(x) = e^{d'x – d'^2/2},所以 xx 上的门槛为 x*=lnβ*/d′+d′/2x^* = \ln\beta^*/d' + d'/2。

两个示意情境,辨别力都是 d′=1.5d' = 1.5,信号都只占十分之一。「抓机会」:把假机会当真代价为 4,抓住真机会收益为 5,错过真机会代价为 1。「筛查」:漏掉一个真病例代价为 20,虚报只需再做一次检查,代价为 1。程序同时用网格搜索验证解析解。

推导

# Optimal criterion (Green & Swets 1966): beta* = [P(N)/P(S)] [(V_CR + C_FA)/(V_H +
# C_M)]; on the evidence axis x* = ln(beta*)/d' + d'/2. d' = 1.5, P(S) = 0.10;
# illustrative payoffs.
import math
from statistics import NormalDist

N = NormalDist()

def expected_value(x, d, ps, vh, cm, vcr, cfa):
    h, fa = 1 - N.cdf(x - d), 1 - N.cdf(x)
    return ps * (h * vh - (1 - h) * cm) + (1 - ps) * ((1 - fa) * vcr - fa * cfa), h, fa

def report(name, d, ps, vh, cm, vcr, cfa):
    beta = (1 - ps) / ps * (vcr + cfa) / (vh + cm)
    xs = math.log(beta) / d + d / 2
    grid = [i / 100 for i in range(-400, 601)]
    xg = max(grid, key=lambda x: expected_value(x, d, ps, vh, cm, vcr, cfa)[0])
    print(f"{name}: beta* = {beta:.2f}, criterion x* = {xs:+.2f} (grid search {xg:+.2f})")
    for lab, x in (("optimal x*", xs), ("neutral beta = 1", d / 2),
                   ("act on everything", -9.0), ("act on nothing", 9.0)):
        ev, h, fa = expected_value(x, d, ps, vh, cm, vcr, cfa)
        print(f"   {lab:18s} H = {h:.2f}  FA = {fa:.3f}  expected value {ev:+.3f}")

if __name__ == "__main__":
    report("opportunity", 1.5, 0.10, vh=5, cm=1, vcr=0, cfa=4)
    report("screening  ", 1.5, 0.10, vh=0, cm=20, vcr=0, cfa=1)
# opportunity: beta* = 6.00, criterion x* = +1.94 (grid search +1.94)
#    optimal x*         H = 0.33  FA = 0.026  expected value +0.004
#    neutral beta = 1   H = 0.77  FA = 0.227  expected value -0.452
#    act on everything  H = 1.00  FA = 1.000  expected value -3.100
#    act on nothing     H = 0.00  FA = 0.000  expected value -0.100
# screening  : beta* = 0.45, criterion x* = +0.22 (grid search +0.22)
#    optimal x*         H = 0.90  FA = 0.414  expected value -0.572
#    neutral beta = 1   H = 0.77  FA = 0.227  expected value -0.657
#    act on everything  H = 1.00  FA = 1.000  expected value -0.900
#    act on nothing     H = 0.00  FA = 0.000  expected value -2.000

在「抓机会」的情境里,β*=9×4/6=6.0\beta^* = 9 \times 4/6 = 6.0,门槛要放得很高:最优策略只抓住三分之一的真机会,虚报率压到 2.6%,期望收益每次约为 +0.004,勉强为正。如果用「中性」门槛(β=1\beta = 1),能抓住 77% 的真机会,却会在 22.7% 的假机会上出手,期望收益为每次 −0.452;见什么抓什么,期望收益为 −3.100,比什么都不做(−0.100)还差得多。也就是说,当真正的机会很少、假机会的代价又不小时,绝大多数看起来像机会的东西都应当放过,哪怕你的眼力不错。

「筛查」情境正好相反:β*=9×1/20=0.45\beta^* = 9 \times 1/20 = 0.45,门槛要放低,击中率达到 90%,代价是 41.4% 的虚报。这在筛查中是合理的,因为虚报只意味着多做一次检查。同样的辨别力,两种情境的最优击中率一个是 33%,一个是 90%:门槛没有绝对的「对」,只有相对于基础率与代价的「对」。

一个类比:「总觉得抓到了机会」与「总觉得被针对」

注

这是类比,不是临床判断。 下面用信号检测论描述两种常见的日常倾向,只为说明门槛与基础率的关系,不用于评估任何人的心理状态。如果你长期感到别人在暗中伤害、监视或针对你,并因此痛苦、失眠或影响工作与人际关系,请联系医生或心理健康专业人员。 这类体验有许多可能的原因,需要专业人员面对面评估,不能靠自我测试或本书的模型判断。

有人总觉得自己抓到了机会:每条消息都像信号,每个项目都像风口。用本章的语言,这可能是门槛太低(cc 远小于 0),也可能是高估了机会的基础率 P(S)P(S),或者低估了虚报的代价 CFAC_{FA}。上面的程序显示,在信号稀少的环境里,这样的门槛会带来大量虚报,即使击中率很高,总的结果也可能很差。

也有人总觉得别人在针对自己:同事的一句话、朋友的一次迟回消息,都被读成敌意的信号。在模型中,这同样表现为对「敌意」这一信号的门槛很低。但这里必须格外小心。第一,模型假设存在一个客观的「信号」与「噪声」,而人际处境中,对方的意图往往本来就模糊,旁观者也不一定能判断。第二,有些人确实处在被针对的环境里,此时低门槛是合理的警觉,而不是偏差。第三,模型不能区分一般的多疑与需要专业帮助的状况。所以,这个类比最多能提示一个问题——「在我的处境里,这类事件本来有多常见?虚报与漏报各有什么代价?」——而不能给出答案。

本章小结

信号检测论把判断拆成辨别力 d′d' 与门槛 cc(或似然比 β\beta)两部分:同样的眼力,可以因门槛不同而表现出完全不同的击中率与虚报率。最优门槛 β*=[P(N)/P(S)]⋅[(VCR+CFA)/(VH+CM)]\beta^* = [P(N)/P(S)] \cdot [(V_{CR} + C_{FA})/(V_H + C_M)] 由信号的基础率与得失共同决定。信号稀少、虚报代价大时应当把门槛放高,漏报代价大时应当放低。把这一框架用于「总觉得抓到机会」或「总觉得被针对」只是类比;后者如果持续并带来痛苦,应寻求专业帮助。下一章讨论另一种基础率:同类项目的历史。

参考文献

Green, David M., and John A. Swets. 1966. Signal Detection Theory and Psychophysics. New York: Wiley.
Macmillan, Neil A., and C. Douglas Creelman. 2005. Detection Theory: A User’s Guide. 2nd ed. Mahwah, NJ: Lawrence Erlbaum.
Swets, John A., Robyn M. Dawes, and John Monahan. 2000. “Psychological Science Can Improve Diagnostic Decisions.” Psychological Science in the Public Interest 1 (1): 1–26. https://doi.org/10.1111/1529-1006.001.

Fan, Y. (2026). Probabilistic Judgement, Brier-Score Calibration and the Statistics of Collective Intelligence: From Base-Rate Neglect and Signal Detection Theory to Superforecasting, Read Beside Classical Chinese Strategic Calculation [概率判断、布莱尔分数校准与群体智慧的统计理论] (Version 1.0.0). 5D Library. https://doi.org/10.5281/zenodo.23764998 · Licensed under Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0).