5D Library › 概率判断、布莱尔分数校准与群体智慧的统计理论 · English
第六章 群体智慧的统计理论
称牛重
1906 年秋天,英国普利茅斯的一次家畜展览会上举行了一场猜重比赛:一头牛宰杀并处理之后有多重?参赛者买一张票,写下自己的估计。弗朗西斯·高尔顿事后拿到了这些票,并于 1907 年 3 月在《自然》上发表了一篇短文,题为「民意」(Vox populi)。
证据
高尔顿的数字及其更正。 去掉 13 张无法辨认的票后,高尔顿分析了 787 个估计。他报告的是中位数:1,207 磅,而实际重量为 1,198 磅,相差不到 1% (Galton 1907b)。在回应读者来信时,他又报告了所有估计的平均数为 1,197 磅 (Galton 1907a)。一个多世纪后,沃利斯重新核对了高尔顿留下的手稿,发现中位数应为 1,208 磅(手稿草稿中正是 1,208,发表时误为 1,207),而组织者来信中的实际重量换算为 1,197 磅,不是 1,198 磅。所以,正确的说法是:中位数偏差 11 磅(约 0.9%),平均数恰好等于实际重量 (Wallis 2014)。
苏罗维茨基的《群体的智慧》以这个故事开篇,并把群体判断准确的条件概括为四条:意见多样、彼此独立、分散(每个人依据自己的局部知识)、有适当的汇总方式 (Surowiecki 2004)。这四条中,统计学最能说清楚的是前两条。
多样性预测定理
政治学家斯科特·佩奇把一个简单的代数恒等式称为多样性预测定理 (Page 2007)。设 个人对真实值 的估计为 ,群体平均为 ,则
推导
推导。 把 写成 ,平方后求平均:。最后一项中 ,移项即得。这是一个对任何数字都成立的恒等式。
下面的程序生成 787 个模拟的估计(不是高尔顿的数据),每个估计等于真实重量 1,197 磅,加上一个所有人共有的误差,再加上一个各自的误差(标准差 75 磅);然后在 10,000 组随机数字上检验恒等式。
推导
# Diversity prediction theorem: crowd error = average individual error - diversity. 787
# simulated guesses (not Galton's data): truth 1,197 lb + shared error + private N(0,
# 75).
import random
rng = random.Random(1907)
def parts(s, theta):
n = len(s)
c = sum(s) / n
crowd = (c - theta) ** 2
avg = sum((x - theta) ** 2 for x in s) / n
div = sum((x - c) ** 2 for x in s) / n
return c, crowd, avg, div
if __name__ == "__main__":
theta = 1197
for shared in (0, 30):
s = [theta + shared + rng.gauss(0, 75) for _ in range(787)]
c, crowd, avg, div = parts(s, theta)
beat = sum((x - theta) ** 2 < crowd for x in s)
print(f"shared error {shared:+d} lb: crowd mean {c:.1f} lb;"
f" {beat} of 787 individuals closer than it")
print(f" crowd error {crowd:.2f} = average error {avg:.2f} - diversity {div:.2f}"
f" (difference {avg - div:.2f})")
worst = 0.0
for _ in range(10000):
n = rng.randint(2, 30)
s = [rng.uniform(-100, 100) for _ in range(n)]
_, crowd, avg, div = parts(s, rng.uniform(-50, 50))
worst = max(worst, abs(crowd - (avg - div)))
print(f"identity on 10,000 random sets of guesses: largest discrepancy {worst:.1e}")
# shared error +0 lb: crowd mean 1197.2 lb; 2 of 787 individuals closer than it
# crowd error 0.04 = average error 5706.59 - diversity 5706.54 (difference 0.04)
# shared error +30 lb: crowd mean 1230.4 lb; 244 of 787 individuals closer than it
# crowd error 1113.20 = average error 7159.50 - diversity 6046.30 (difference 1113.20)
# identity on 10,000 random sets of guesses: largest discrepancy 3.6e-12当共有误差为零时,群体平均为 1,197.2 磅,群体误差只有 0.04(磅的平方),787 个人中只有 2 个人比群体平均更接近真实值。当所有人都受到同一个 +30 磅的误导时,群体平均变成 1,230.4 磅,群体误差升到 1,113.20;有 244 个人比群体平均更准。两种情况下,恒等式都精确成立;在 10,000 组随机数字上,最大的差异只有 ,即舍入误差。
这个定理常被引用为「多样性胜过能力」的证据,需要谨慎:它是恒等式,不是经验发现,只保证群体误差永远不大于个人平均误差,却没有说明群体何时胜过最好的个人;「多样性」也只是估计的分散程度,可以来自不同的信息,也可以只是噪声。洪与佩奇的模拟报告,在某种问题求解模型中随机挑选的多样化团队胜过「最能干」的团队 (Hong and Page 2004);汤普森批评这一结论依赖模型的特定设定,不能支持关于现实群体的一般主张 (Thompson 2014)。本书只采用恒等式本身与下面在明确假设下的模拟。
相关误差:群体何时胜过专家
群体平均之所以准,是因为各人的误差在平均中相互抵消。但只有互不相关的那部分误差会被抵消;所有人共有的那部分误差,无论多少人平均都不会减少。
推导
设每个非专家的误差方差为 1,任意两人误差的相关系数为 ;专家的误差方差为 0.25(误差标准差是非专家的一半)。 人平均的均方误差为
当 趋于无穷时趋于 ,而不是 0。有效人数为 。程序比较理论值与模拟值,并计算群体要胜过专家至少需要多少人。数字是示意性的。
推导
# Crowd of n non-experts (error variance 1, pairwise correlation rho) against one expert
# (error variance 0.25): MSE(crowd) = rho + (1 - rho)/n. Illustrative numbers.
import math, random
rng = random.Random(2004)
V_EXPERT = 0.25
def mse_theory(n, rho):
return rho + (1 - rho) / n
def mse_sim(n, rho, reps=20000):
tot = 0.0
for _ in range(reps):
shared = rng.gauss(0, math.sqrt(rho))
m = sum(shared + rng.gauss(0, math.sqrt(1 - rho)) for _ in range(n)) / n
tot += m * m
return tot / reps
def n_needed(rho, v=V_EXPERT):
if rho >= v:
return None
return math.floor((1 - rho) / (v - rho) + 1e-9) + 1 # smallest n with MSE < v
if __name__ == "__main__":
print("rho | crowd MSE, theory: n = 5, 20, 100 | simulated, n = 20 | n to beat expert")
for rho in (0.0, 0.1, 0.2, 0.3, 0.5):
th = [mse_theory(n, rho) for n in (5, 20, 100)]
nn = n_needed(rho)
need = f"{nn}" if nn else "never"
print(f"{rho:.1f} | {th[0]:.3f} {th[1]:.3f} {th[2]:.3f} |"
f" {mse_sim(20, rho):.3f} | {need}")
for rho in (0.1, 0.3):
print(f"n_eff of 100 forecasters at rho = {rho}: {100 / (1 + 99 * rho):.1f}")
# rho | crowd MSE, theory: n = 5, 20, 100 | simulated, n = 20 | n to beat expert
# 0.0 | 0.200 0.050 0.010 | 0.050 | 5
# 0.1 | 0.280 0.145 0.109 | 0.145 | 7
# 0.2 | 0.360 0.240 0.208 | 0.244 | 17
# 0.3 | 0.440 0.335 0.307 | 0.330 | never
# 0.5 | 0.600 0.525 0.505 | 0.522 | never
# n_eff of 100 forecasters at rho = 0.1: 9.2
# n_eff of 100 forecasters at rho = 0.3: 3.3误差互不相关时,5 个非专家的平均就胜过专家;相关系数为 0.1 时需要 7 人,0.2 时需要 17 人;相关系数达到 0.3 时,100 人平均的均方误差仍为 0.307,永远胜不过误差方差 0.25 的专家。相关系数为 0.1 时,100 个人只相当于约 9.2 个独立的人;为 0.3 时只相当于约 3.3 个。所以「群体胜过专家」是有条件的:它要求误差的相关程度足够低,而专家又没有好到超过这一极限。
证据
社会影响削弱群体智慧。 洛伦茨等人让参与者回答数量估计题,并在多轮中分别给他们看或不看其他人的答案。看到他人答案后,估计的分散程度明显缩小,但群体平均并没有变得更准;同时,参与者的信心提高了 (Lorenz et al. 2011)。用本章的语言:社会影响提高了误差之间的相关,减少了多样性。按多样性预测定理,多样性减少而群体误差不变,意味着个人平均误差的下降恰好被多样性的减少抵消:大家彼此靠拢,却没有一起靠近真值,于是群体误差没有改善,人们却更加自信。「同温层」是同一问题的极端形式:读同样的信息源、频繁交换意见的人误差高度相关,人数再多也只相当于少数几个独立判断。
平均之后为什么要推向极端
第一章提到,预测锦标赛中效果最好的汇总算法会把平均概率「推向极端」。这似乎与第二章矛盾:难道不是应当避免过度自信吗?
证据
两个原因。 巴伦、梅勒斯、泰洛克、斯通与昂格尔指出,对许多人的概率取简单平均,所得的群体预报往往偏向 50%,把它推向 0 或 1 后与实际结果更吻合。原因有二。第一,概率在接近 0 与 1 的地方被「压缩」,随机误差会把平均值拉向中间;这一点不影响中位数,也可以说不影响对数几率的平均。第二,每个预报者都根据自己不完整的信息恰当地保留了不确定性,但群体合在一起掌握的信息比任何一个人都多;简单平均(包括中位数与对数几率平均)没有把这些分散的信息叠加起来 (Baron et al. 2014)。
推导
第二个原因的一个模型。事件的先验为 50%;每条线索在事件发生时服从 ,否则服从 ,因此每条线索给对数几率加上它本身的值。10 名预报者都看到同一条公开线索,每人另有一条私人线索;每人报出给定自己所见的正确贝叶斯概率,所以每个人单独看都校准良好。比较:单个预报者、概率平均、对数几率平均、把对数几率平均乘以系数 (在 20,000 个训练问题上拟合,在另外 20,000 个问题上检验),以及一个看到全部 11 条线索的理想贝叶斯者。
推导
# Shared information and extremising (Baron et al. 2014). Clues ~ N(+-0.5, 1); 10
# forecasters share one public clue and each has one private clue; each reports a
# correct Bayesian probability. Factor a fitted on 20,000 training questions, scored on
# 20,000 new ones.
import math, random
rng = random.Random(2014)
K, MU = 10, 0.5
def inv(z):
return 1 / (1 + math.exp(-z))
def questions(n):
out = []
for _ in range(n):
y = 1 if rng.random() < 0.5 else 0
m = MU if y else -MU
pub = rng.gauss(m, 1)
priv = [rng.gauss(m, 1) for _ in range(K)]
logits = [2 * MU * (pub + x) for x in priv] # each forecaster's posterior
ideal = 2 * MU * (pub + sum(priv))
out.append((y, logits, ideal))
return out
def brier(pairs):
return sum((p - y) ** 2 for p, y in pairs) / len(pairs)
def score(qs, a):
return brier([(inv(a * sum(l) / K), y) for y, l, _ in qs])
if __name__ == "__main__":
train, test = questions(20000), questions(20000)
a_best = min((i / 20 for i in range(20, 161)), key=lambda a: score(train, a))
print(f"extremising factor fitted on training questions: a = {a_best:.2f}")
rows = [("a single forecaster", brier([(inv(l[0]), y) for y, l, _ in test])),
("mean of probabilities",
brier([(sum(inv(z) for z in l) / K, y) for y, l, _ in test])),
("mean of log-odds", score(test, 1.0)),
(f"extremised, a = {a_best:.2f}", score(test, a_best)),
("ideal: all 11 clues pooled", brier([(inv(z), y) for y, _, z in test]))]
for name, b in rows:
print(f" {name:28s} Brier {b:.4f}")
print("mean log-odds = public + (1/10) x sum of private clues; ideal counts each once")
# extremising factor fitted on training questions: a = 1.75
# a single forecaster Brier 0.1617
# mean of probabilities Brier 0.1354
# mean of log-odds Brier 0.1290
# extremised, a = 1.75 Brier 0.1187
# ideal: all 11 clues pooled Brier 0.0366
# mean log-odds = public + (1/10) x sum of private clues; ideal counts each once单个预报者的布莱尔分数为 0.1617;概率平均为 0.1354,对数几率平均为 0.1290;拟合出的系数 ,推向极端后降到 0.1187。但理想贝叶斯者是 0.0366,远好于任何一种汇总。原因在最后一行:对数几率平均把公开线索算了一次,而把 10 条私人线索各只算了十分之一;理想的做法是每条线索都算一次。单一的推向极端系数无法把公开与私人信息分开,所以只能部分弥补。这也说明,推向极端的合适程度取决于预报者之间共享了多少信息:共享得越多,越不该推得太远。
本章小结
高尔顿 1907 年报告的群体中位数为 1,207 磅(应为 1,208 磅),平均数 1,197 磅是随后才给出的,恰好等于更正后的实际重量。多样性预测定理是一个恒等式:群体误差等于个人平均误差减去多样性;它保证群体不比个人平均差,却不保证群体胜过最好的个人。误差相关时,平均只能消除不相关的部分;相关系数一旦超过专家的相对误差,再多的人也胜不过专家。社会影响会降低多样性、提高信心而不提高准确性。对许多人的概率取平均后适度推向极端可以改善分数,因为每个人只掌握部分信息;推多远取决于信息共享的程度。下一章把这些现代研究与中国古代兵家的「庙算」并读。
参考文献
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).