5D Library › 社会网络拓扑、结构洞与复杂传染的数学模型 · English
第三章 简单传染与复杂传染
阈值
一条消息、一个笑话,只要听到一次就可能传下去。但很多行为不是这样:要不要开始跑步、加入一个新的协会、在团队里采用一种费时的新做法,人们往往要看到不止一个熟人这样做才会跟进。格兰诺维特在 1978 年用阈值模型描述这类集体行为:每个人有一个阈值,周围已经采纳的人数(或比例)超过阈值时才采纳。他用一个著名的例子说明,群体的结果对阈值分布极其敏感:如果一百个人的阈值恰好是 0、1、2、……、99,第一个人行动后会引发一连串的跟随,最后所有人都行动;只要把阈值为 1 的那个人换成阈值为 2,连锁就在第一个人之后停住,尽管两个群体的「平均倾向」几乎相同 (Granovetter 1978)。5D Library 第 6 本《注意力的经济学》已经用程序演示过这种相变,本书不再重复。
森托拉与梅西把需要多个来源强化才会采纳的传播称为复杂传染,把一个来源就够的称为简单传染。他们指出,对简单传染最有利的长距离弱连带,对复杂传染反而不利:一条长连带只能把一个采纳者带到远处,而远处的人需要两个或更多的采纳者才会跟进;要跨越两个群体,需要足够宽的桥,即多条彼此靠近的连带 (Centola and Macy 2007)。
证据
在线实验。 森托拉招募了 1,528 名来自健康类网站的参与者,把他们随机放进人为设计的网络中,每人有 6 或 8 位匿名的「健康伙伴」。共进行六次独立的试验,每次都同时设置一个聚簇格子网络和一个联系人数相同的随机网络。要传播的行为是注册一个健康论坛。平均而言,这一行为在聚簇网络中覆盖了 53.77% 的人,在随机网络中覆盖了 38.26%;在聚簇网络中的传播速度是随机网络的四倍以上。收到第二个信号的参与者比只收到一个信号的人更可能注册,第三个信号的作用较小,第四个及以上没有显著作用 (Centola 2010)。
证据
结构多样性。 乌甘德等人分析了脸书的邀请注册数据,发现一个人是否接受邀请加入,主要不取决于已经加入的好友人数,而取决于这些好友分属多少个彼此不相连的圈子(「结构多样性」):来自几个不同圈子的邀请,比来自同一个圈子的同样数量的邀请更有效 (Ugander et al. 2012)。
这两项研究指向不同的方向:森托拉的实验显示,来自同一个紧密圈子的多次强化有助于采纳;乌甘德等人的数据显示,来自不同圈子的接触更有效。两者并不矛盾:前者控制了网络结构,比较的是同一种行为在不同网络中的传播;后者是观察性数据,衡量的是一个人周围的局部结构。真实的传播多半同时需要两者:足够的强化,以及来自不同来源的「社会证明」。
从第 13 本出发:桥要多宽,放在哪里
5D Library 第 13 本《行动的经典与统计力学》第五章用 400 人、每人 8 位联系人的环形网络比较了阈值为 1、2、3 的传播:简单传染在随机网络中最快;阈值为 2 时,随机网络平均只覆盖约 71%;阈值为 3 时,20 个随机网络没有一个传开,而环形网络一圈一圈地覆盖了所有人。本章在此基础上问三个更具体的问题:要跨越两个群体,桥需要多宽;同样多的连带,怎样放置才有用;以及如果人们的阈值并不相同,结果会怎样变。
推导
群体 A 已经全部采纳了一种费力的新做法。群体 B 是 200 人的环,每人与左右各两位邻居相连(4 位联系人)。从 A 到 B 有 条连带,按两种方式放置:「宽桥」,两条一组落在 B 中相邻的人身上;「分散」,每条连带落在 B 中随机的一个人身上。B 中的人在至少 2 位联系人采纳后才采纳。最后再看 B 中有一部分人的阈值只有 1 的情形。
# Bridge width and threshold heterogeneity (extending volume 13, Chapter 5).
# Community A has fully adopted a costly behaviour. Community B is a ring of
# 200 people, each tied to 2 neighbours on each side (4 contacts). w bridge
# ties run from A to B. A person in B adopts once at least THETA of his or her
# contacts have adopted (Centola & Macy 2007). Bridges are either
# "wide": the w ties land two per person on adjacent people in B, or
# "scattered": each tie lands on a person in B chosen at random.
# Optionally a share f of people in B has threshold 1 instead of 2.
import random
rng = random.Random(6)
NB, REPS = 200, 2000
def spread_in_b(bridge_count, theta):
# bridge_count[i] = number of A-adopters tied to person i of B
adopted = [False] * NB
changed = True
while changed:
changed = False
for i in range(NB):
if adopted[i]:
continue
ring = sum(adopted[(i + d) % NB] for d in (-2, -1, 1, 2))
if ring + bridge_count[i] >= theta[i]:
adopted[i] = changed = True
return sum(adopted) / NB
def trial(w, kind, f=0.0):
count = [0] * NB
if kind == "wide":
start = rng.randrange(NB)
for t in range(w):
count[(start + t // 2) % NB] += 1
else:
for _ in range(w):
count[rng.randrange(NB)] += 1
theta = [1 if rng.random() < f else 2 for _ in range(NB)]
return spread_in_b(count, theta)
def p_cross(w, kind, f=0.0, reps=REPS):
return sum(trial(w, kind, f) > 0.9 for _ in range(reps)) / reps
print("threshold 2 for everyone in B: chance that B is taken over (> 90 % adopt)")
print(" bridge width w wide bridge scattered ties")
for w in (1, 2, 3, 4, 8, 16, 32):
wide, scat = p_cross(w, "wide", reps=50), p_cross(w, "scattered")
print(f" {w:5d} {wide:8.2f} {scat:10.3f}")
print("scattered ties, w = 4, with a share f of B at threshold 1:")
for f in (0.0, 0.02, 0.05, 0.1, 0.2):
print(f" f = {f:4.2f}: chance of take-over {p_cross(4, 'scattered', f):.3f}")
# threshold 2 for everyone in B: chance that B is taken over (> 90 % adopt)
# bridge width w wide bridge scattered ties
# 1 0.00 0.000
# 2 0.00 0.000
# 3 1.00 0.000
# 4 1.00 0.002
# 8 1.00 0.018
# 16 1.00 0.136
# 32 1.00 0.698
# scattered ties, w = 4, with a share f of B at threshold 1:
# f = 0.00: chance of take-over 0.002
# f = 0.02: chance of take-over 0.011
# f = 0.05: chance of take-over 0.043
# f = 0.10: chance of take-over 0.152
# f = 0.20: chance of take-over 0.412结果显示,位置比数量更重要。三条放在一起的连带(一人两条、旁边的人一条)就足以让整个群体 B 采纳:第一个人有两位采纳者联系人,他采纳后,旁边的人有一条来自 A 的连带加上一位采纳的邻居,也达到阈值,传播便沿着环展开。同样的三条连带分散放置,在 2,000 次随机放置中从未成功;16 条分散的连带只有 14% 的机会成功,32 条也只有约 70%。阈值的异质性会改变这个图景:只要 B 中有 10% 的人阈值为 1,4 条分散的连带成功的机会就从 0.2% 升到约 15%;有 20% 的人阈值为 1 时升到约 41%。换言之,「复杂传染需要宽桥」在阈值整齐划一时最为严格;群体中一小部分容易被打动的人,会让窄桥也能起作用。
噪声阈值:长连带的反转
森托拉与梅西的结论建立在确定的阈值上:联系人中采纳者不到 2 人,就绝不采纳。现实中的人并不这样精确。埃克尔斯、莫塞尔、拉希米安与森在 2024 年证明,只要在低于阈值时仍有很小的概率采纳,结论就会反转:在环形网络上随机改接连带(使它们变「长」),会加速带噪声的阈值传染。他们的理论分析用的是环形格子网络,并用数百个真实社会网络上的模拟检验了这一结论;他们还报告,在部分但较多的改接、可逆但不频繁的采纳以及高维格子中,结论依然成立;他们据此认为,希望加速传播的人应当促成长连带,而不是促成闭合三角形的连带 (Eckles et al. 2024)。
推导
仿照他们的设定。400 人围成一圈,每人与 1 步和 2 步之外的人相连(共 4 位联系人)。把一部分「2 步」连带改接到随机的人,成为长连带。阈值为 2;噪声:只有 1 位联系人采纳的人,每一轮仍以概率 采纳。从两个相邻的采纳者开始,记录 90% 的人采纳所需的轮数(11 次运行的中位数,3,000 轮内未达到记为「never」)。
# Noisy threshold contagion (after Eckles, Mossel, Rahimian & Sen 2024).
# Ring of N people; everyone is tied to the neighbours 1 step away (the
# "cycle") and 2 steps away (the "short ties"). A share r of the short ties is
# rewired to random people (long ties). Threshold 2: adopt once 2 contacts have
# adopted. Noise: someone with exactly 1 adopting contact still adopts with
# probability q in each round. Start: two adjacent adopters. We count rounds
# until 90 % have adopted (cap 3000). Parameters are illustrative.
import random
N, CAP, RUNS = 400, 3000, 11
def network(r, rng):
nb = [set() for _ in range(N)]
for i in range(N):
for d in (1, 2):
j = (i + d) % N
if d == 2 and rng.random() < r:
j = rng.randrange(N)
while j == i or j in nb[i]:
j = rng.randrange(N)
nb[i].add(j); nb[j].add(i)
return nb
def rounds_to_90(r, q, rng, theta=2):
nb = network(r, rng)
adopted = {0, 1}
for t in range(1, CAP + 1):
new = []
for i in {j for a in adopted for j in nb[a]} - adopted:
k = len(nb[i] & adopted)
if k >= theta or (k >= 1 and rng.random() < q):
new.append(i)
adopted.update(new)
if len(adopted) >= 0.9 * N:
return t
return None
def median_rounds(r, q, theta=2, seed=7):
rng = random.Random(seed)
res = sorted((rounds_to_90(r, q, rng, theta) or CAP + 1) for _ in range(RUNS))
m = res[RUNS // 2]
return "never" if m > CAP else str(m)
if __name__ == "__main__":
print(f"median rounds to 90 % adoption ({RUNS} runs, N = {N};"
f" 'never' = not within {CAP})")
print(" share of short ties rewired r: 0 0.05 0.2 1.0")
print(" simple contagion (threshold 1) " + "".join(
f"{median_rounds(r, 0, theta=1):>8s}" for r in (0, 0.05, 0.2, 1.0)))
for q in (0, 0.005, 0.02, 0.1):
print(f" threshold 2, noise q = {q:<6} " + "".join(
f"{median_rounds(r, q):>8s}" for r in (0, 0.05, 0.2, 1.0)))
# median rounds to 90 % adoption (11 runs, N = 400; 'never' = not within 3000)
# share of short ties rewired r: 0 0.05 0.2 1.0
# simple contagion (threshold 1) 90 20 9 6
# threshold 2, noise q = 0 179 never never never
# threshold 2, noise q = 0.005 178 282 327 286
# threshold 2, noise q = 0.02 175 123 101 82
# threshold 2, noise q = 0.1 163 58 34 23没有噪声时,结果与森托拉—梅西一致:环形网络 179 轮就能让 90% 的人采纳,而只要改接 5% 的短连带,传播就在某个缺口处停住,再也到不了 90%。加入噪声后情况改变: 时,环形网络需要 175 轮,改接 20% 的短连带只需 101 轮,全部改接只需 82 轮; 时,全部改接只需 23 轮,比环形网络快七倍。但噪声很小时(),改接反而使传播变慢(282–327 轮对 178 轮)。这与理论的方向一致:对阈值为 2 的情形,他们的定理要求噪声相对于 足够大(;这里 ),长连带才会加速传播;网络越大,所需的噪声越小。这是一个渐近的量级条件,不是精确的门槛:在这个 400 人的模拟中, 已经显出长连带的好处, 则还没有。
因此,「复杂传染需要聚簇、长连带有害」与「长连带加速传播」都不是绝对的结论。哪一个更接近现实,取决于人们在只有一个来源时是否完全不会采纳。对于真正高成本、高风险的行为(例如加入一场有风险的抗议),这一概率可能确实接近零;对于大多数日常行为,一点「试试看」的可能总是存在的。
证据
复杂路径长度。 吉尔博与森托拉指出,传统的最短路径长度假定传播是简单传染,它不能正确刻画复杂传染所需的连通性与中心性;他们提出「复杂路径长度」与「复杂中心性」,并用印度 43 个村庄中一项小额信贷项目的传播数据检验了这些指标 (Guilbeault and Centola 2021)。
注
观察性数据中的「传染」。 在观察性数据中,朋友之间行为相似,可能是因为彼此影响,也可能只是因为相似的人更容易成为朋友(同质性),或者共同处在同一个环境中。沙利齐与托马斯证明,在一般条件下,仅凭观察性的网络数据,同质性与传染在原理上无法区分 (Shalizi and Thomas 2011)。这正是森托拉的实验与领英的随机实验之所以重要的原因:只有当网络结构或连带被随机分配时,才能比较可信地估计「传染」的效应。
本章小结
阈值模型说明群体结果对阈值分布极为敏感。需要多个来源强化的复杂传染,在聚簇网络中传得更好,跨越群体需要宽桥;在线实验支持这一点,观察性数据则显示来自不同圈子的接触更有效。程序显示,桥的位置比数量更重要:三条放在一起的连带比十六条分散的连带更可靠;但一小部分低阈值的人会让窄桥也起作用。2024 年的理论结果表明,只要低于阈值时仍有一点采纳的可能,长连带又会加速传播。下一章从传播转向网络本身的结构:度的分布、无标度的争议,以及网络在失效与攻击下的表现。
参考文献
Fan, Y. (2026). Social Network Topology, Structural Holes and Complex Contagion: From the Strength of Weak Ties and Preferential Attachment to Information Cascades, Read Beside Classical Chinese Diplomacy [社会网络拓扑、结构洞与复杂传染的数学模型] (Version 1.0.0). 5D Library. https://doi.org/10.5281/zenodo.23764990 · Licensed under Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0).