CSYS5030 Week 12 有效网络推断讲课总结

CSYS5030 Week 12 讲课总结:Effective Network Inference

课程:CSYS5030 — Information Theory and Self-Organisation 讲师:Associate Professor Joseph Lizier 对应模块:Module 12 - Effective network inference 来源:讲义 PDF Week 12/Lectures/Lec10-EffectiveNetworkInference.pdf + tutorial DirectedFunctionalNetworkInference_Solutions.ipynb。本周没有转录稿,不包含讲课现场内容。 本周覆盖:网络推断的三种类型 → TE 有向功能网络(阈值 / p 值)→ 注意事项 → 多变量有效网络(贪心算法、IDTxl)

版本说明:Week 8/Lec8-EffectiveNetworkInference.pdf 是旧版同名讲义(19 页)。对比两版:旧版把成对 TE 方法称为「effective network inference: basic / standard approach」,新版(本周)改称「directed functional network inference」并加了「better」字样;新版的注意事项中多了一条「需要正确设置 TE 参数,否则会有假阳性/假阴性」。本文以新版为准。


零、本周位置

信息动力学的最后一步:从单个目标的信息回归,推广到整个系统——给每个节点找出它的信息源(父节点)集合,就得到一张网络。

真正目标:推断父节点集合

学习目标(讲义):

  • 理解从时间序列做网络推断的不同选项,以及有效网络推断的复杂性与微妙之处;
  • 能用 JIDT 做简单的(成对)有效网络推断;
  • 理解更高级技术(如 IDTxl 工具箱)的优势。

主要参考:Bossomaier, Barnett, Harré & Lizier (2016) An Introduction to Transfer Entropy §7.2。


一、网络推断:三种类型

关键问题:只给定一组变量各自的时间序列,怎样构建一个能代表这些变量之间关系的网络模型?

类型 有向? 依据 能告诉我们什么 局限
功能网络(functional) ❌ 无向 通常用相关系数或 MI 哪些节点之间有统计关系 不解释关系是如何产生的
结构网络(structural) ✅ 物理的、有向的(因果)连接 真实的「接线图」 一般只能通过干预获得,不能直接从大规模观测时间序列中得到;不反映随时间或实验条件变化的交互方式
有效网络(effective) ✅ 介于两者之间的混合 能复现并解释节点时间序列的「最小神经电路模型」 不是结构(因果)网络

(Sporns 2011 Networks of the Brain;Friston 1994 关于功能连接与有效连接。)

为什么有效网络虽不是因果网络却值得做:

  1. 可能是仅凭数据能做到的最好结果(因果往往无法获得);
  2. 能反映系统动态状态(regime)的变化;
  3. 为系统中发生的计算建模,揭示涌现的计算结构。

应用:建模/推断系统的底层信息网络;考察网络随条件、随时间的变化。领域包括神经影像、金融市场数据、基因调控网络、社交媒体分析、体育分析(如 RoboCup 机器人足球)等。

TE 是天然的选择:它有方向、条件于目标过去(建模的是目标的计算),且能扩展为条件 TE 处理多源。


二、用 TE 做有向功能网络推断

2.1 基础版:TE + 阈值

  1. 对系统中所有变量对计算成对 TE;
  2. 对 TE 值设阈值,保留超过阈值的连接。

在 JIDT 中:TE AutoAnalyser 勾选 All pairs?,会生成「对所有目标、对所有源」的双重循环。

讲义提问:

  • 遇到的第一个问题是什么?——计算量: 个节点要算 个 TE;数据大时(如 10,000 个 CA 格子)根本跑不完(tutorial 里因此取消勾选 Compute result?,只取前 100 个格子)。
  • 阈值选多少?——没有原则性的答案;不同目标的 TE 量级可能不同,一个全局阈值很难处处合适(见 tutorial B)。

2.2 更好的版本:TE + p 值

  1. 计算所有变量对的成对 TE;
  2. 对每一对,求在零分布下得到观测 TE 的 p 值(见 Week 7 / Week 11);
  3. 对 p 值设阈值来选择连接。

优点:阈值是统计推导出来的,更有原则、更稳健,适合小数据集。

JIDT:勾选 All pairs? 和 Add stat. signif.?,生成的循环会给出每对的 p 值。

2.3 注意事项

1. 必须校正多重比较

  • 族错误率(family-wise error rate, FWER):例如 Bonferroni 校正——把显著性阈值 α 除以检验次数 M。对 个节点的网络,通常 ,阈值会非常小。
    • 例: ⟹ , 。
  • 错误发现率(false discovery rate, FDR):控制被选中连接中假阳性的比例,比 Bonferroni 宽松。

为什么必须校正:若零假设全部为真,在 α = 0.05 下做 9900 次检验,预期约 495 条假连接。

2. 必须正确设置 TE 参数,否则会有假阳性/假阴性:

  • 设置嵌入(目标嵌入不够 → 存储被误算成传递 → 假阳性);
  • 设置源-目标延迟,例如在一个范围内扫描(延迟设错 → 漏掉真连接 → 假阴性)。

3. 不处理源之间的冗余或协同——讲义的三个示意结构:

结构 成对 TE 的问题
共同驱动:Z → Y、Z → X 推断出虚假的 Y → X(冗余)
路径:Y → Z → X 推断出虚假的直接 Y → X(冗余)
协同/门控:Y、Z 共同决定 X(如 XOR) 单看 Y 或 Z 的成对 TE 可能都≈0,漏掉两条真连接

三、多变量有效网络推断

3.1 用条件 TE——但条件于什么?

  • 条件 TE 正好能处理冗余和协同(Week 11)。
  • 但条件于所有其他变量有两个问题:
    1. 太容易欠采样(条件变量维度太高);
    2. 会剔除太多连接——例如两个父节点高度冗余时,条件于对方后各自的 CTE 都≈0,两个都被删掉。

3.2 回到信息回归

两源情形(Week 11):

真正的目标是推断父节点集合 ——即使集体 TE 尽可能完整地解释目标的更新、又不包含多余的源。

3.3 迭代 / 贪心算法

一次推断整个父节点集合在组合上太难( 种子集),改为贪心地逐个添加(Lizier & Rubinov 2012):

  1. 嵌入目标过去(先处理存储);
  2. 从空的父节点集合 开始;
  3. 对每个候选源,计算它到目标的 TE,条件于 ;
  4. 若条件 TE 最大的候选源的 p 值显著,就把它加入 ;
  5. 如果加入了新父节点,回到第 2 步;否则进入第 5 步;
  6. 剪枝:在最终集合 的语境下,删掉冗余的连接(早期加入的源可能在后来者面前变得多余);
  7. 对整个父节点集合 做统计检验。

每加入一个父节点,信息回归就多一项:

这种方法的优点:

  • 比暴力搜索父节点集合高效得多;
  • 处理父节点之间的冗余和协同:冗余源在条件于已选父节点后 CTE 变小、不被选;协同源在条件于搭档后 CTE 变大、被选中;
  • 可以对每个源扫描多个过去样本(非均匀嵌入);
  • 统计检验提供「自动刹车」:数据的统计功效用尽时自然停止,避免过拟合/欠采样;
  • 可以增加额外检验;
  • 必须控制多重比较(例如 max statistics:在每一轮把最大的 CTE 与「所有候选源的最大值」的零分布比较);
  • 最终结果是父节点集合——节点被选入的顺序不再重要。

讲义示意图:表格横向是变量(),纵向是时间( ),在最大时间范围(max time horizon)之内:

  • 左边是目标嵌入候选( 的过去),先选出目标嵌入;
  • 右边是源候选(其他变量各个过去时刻),逐个选出 source selections(父节点集合 P);
  • 选中的不是「整个变量」而是变量在某个特定滞后的样本——这就是非均匀嵌入。

3.4 IDTxl

IDTxl(Information Dynamics Toolkit xl;Wollstadt, Lizier, Vicente et al. 2018;https://github.com/pwollstadt/IDTxl):

  • 用 JIDT 作为内部信息论引擎的 Python 包;
  • 实现了上述贪心算法,包括:
    • 父节点选择中的 max statistics 多重比较校正;
    • TE 参数选择、源的非均匀嵌入 / 延迟选择;
    • 额外的步骤(剪枝)和统计检验。

对 project:想做网络推断的话,成对 TE(JIDT)可以做「有向功能网络」;真正的多变量有效网络用 IDTxl 更合适。


四、Tutorial:CA rule 54 上的网络推断

数据:Module 10 的 ca54.txt(rule 54,600 步 × 10,000 格子)。我们知道真实结构:每个格子的直接父节点只有左右两个邻居(以及它自己)。只取前 100 个格子(networkSize = 100),且这次把每个格子当作异质变量单独计算(不合并样本),所以每对只有约 600 个样本。

A. MI 功能网络

  1. MI AutoAnalyser:Discrete、勾 All pairs?、取消 Compute result?、生成代码。
  2. 修改:
    • 交换循环顺序,外层为目标 d、内层为源 s(为后面的有向推断做准备);
    • 循环只到 networkSize;
    • 结果存入 results[s, d],删掉 print。
calc = MutualInformationCalculatorDiscrete(2, 2, 0)
for d in range(networkSize):
for s in range(networkSize):
if s == d: continue
calc.initialise()
calc.addObservations(data[:, s], data[:, d])
results[s, d] = calc.computeAverageLocalOfObservations()
plt.imshow(results) # 行 = source,列 = target

讨论:

  • 结构:MI 矩阵对称(MI 无方向),且呈现模块化的块状结构:一大块区域内的格子两两 MI 都高,不只是相邻格子。
  • 与真实因果结构对比:真实结构是「只有左右邻居」的窄对角带,MI 网络远不止于此。
  • 块结构的来源:CA 动态中的大片 domain/blinker 区域——同一 domain 内的格子按同样的规则模式同步变化,彼此之间强相关,不管是否直接相连(共同的动态状态 → 冗余,正是功能网络「不解释关系如何产生」的体现)。

补充技巧:对没有自然排序的数据(不像 CA 有空间顺序),可以对 FC 矩阵做层次聚类并重新排序,以显示模块结构:

from scipy.cluster.hierarchy import linkage, optimal_leaf_ordering, leaves_list
distances = numpy.max(fc) - fc
Z = linkage(distances, method='average')
order = leaves_list(optimal_leaf_ordering(Z, distances))
plt.imshow(fc[order, :][:, order], cmap=cm.coolwarm, norm=mplcolors.CenteredNorm())

B. TE 有向功能网络

  1. 复制 MI 代码,把计算器换成 TE:TransferEntropyCalculatorDiscrete(2, 4, 1, 1, 1, 1),k = 4——因为现在把变量当作异质的(不合并),每对只有约 600 个样本,不够支撑更大的 k(Module 10 合并全部格子时 k = 15)。
  2. 标题/标签把 MI 改成 TE。

讨论:

  • 最强源的位置变了:TE 网络更集中在对角线两侧(左右邻居),开始给出更合理的动态模型。
  • 块状结构仍然存在但减弱:TE 条件于目标过去,去掉了部分「同一 domain 内同步」带来的冗余;但 k = 4 太短,没能把 domain 的存储完全解释掉,剩余的存储信息还能从同块的其他格子「看到」。
  • 能否选一个阈值处处适用? Solution 用 results > 0.09 试——很难找到一个对所有目标都合适的阈值:有的目标真邻居的 TE 低于阈值,有的远处格子的 TE 高于阈值。

原则性阈值:解析 p 值 + Bonferroni

measDist = calc.computeSignificance()   # 解析零分布
pValues[s, d] = measDist.pValue
# 对角线(s == d)设 pValues = 1,避免显示成 0 造成误解
plt.imshow(pValues); plt.clim(0, 0.05 / (networkSize * (networkSize - 1))) # ≈ 5.05e-6
  • p 值的含义:若源与目标的下一个值(在目标过去条件下)独立,得到大于等于观测 TE 的概率。
  • 结果:有向功能网络抓住了两侧的直接父节点,阈值也有了原则。
  • 但仍有很多不该出现的「父节点」——我们知道只有左右各一个才是直接父节点。怎么排除?⟹ 多变量方法。

C. 多变量有效网络(贪心算法演示代码)

结构:

for d in range(networkSize):
conditionalSet = []
while True:
# 构造计算器:P 为空时用 TE,否则用条件 TE
calc = (ConditionalTransferEntropyCalculatorDiscrete(2, 4, len(conditionalSet))
if conditionalSet else TransferEntropyCalculatorDiscrete(2, 4, 1, 1, 1, 1))
for s in range(networkSize):
if s == d or s in conditionalSet:
pValues[s] = 1; continue
calc.initialise()
calc.addObservations(source, destination, conditional) # conditional = data[:, conditionalSet]
results[s] = calc.computeAverageLocalOfObservations()
pValues[s] = calc.computeSignificance().pValue
best = numpy.argmax(results)
if pValues[best] < 0.05 / (networkSize * (networkSize - 1)):
conditionalSet.append(best) # 显著 → 加入,进入下一轮
else:
break # 不显著 → 停止该目标
network[conditionalSet, d] = 1

Solution 输出节选(k = 4):

目标 0: 选 1 (TE=0.078);最大候选 26 不显著 (TE(26->0|1)=0.059, p=1.1e-4),停止
目标 1: 选 0 (TE=0.131),选 2 (TE(2->1|0)=0.225);停止
目标 2: 选 0 (TE=0.146),选 3 (TE(3->2|0)=0.091);最大候选 1 不显著 (TE=0.101, p=2.4e-5),停止
目标 3: 选 1 (TE=0.143),选 4;最大候选 2 不显著 (p=6e-6),停止

为什么仍不完全匹配真实结构(tutorial 列出的原因):

  • 统计波动:短数据(约 600 样本/对)让「谁是最强源」受噪声影响——如目标 2 先选了隔一个的格子 0 而不是直接邻居 1;
  • 统计功效有限;
  • 硬编码的历史长度 k = 4 可能在虚假源中留下了更多信息(目标的存储没被完全解释);
  • 没有剪枝步骤;
  • 保守的 p 值阈值(Bonferroni)加上解析 surrogate(近似、假设独立样本)。

注意目标 2、3 中「真邻居」的 CTE 其实不小(0.10),但 p 值(2.4×10⁻⁵、6×10⁻⁶)刚好没过 Bonferroni 阈值 5.05×10⁻⁶——阈值的保守性直接导致假阴性。

D. 可选扩展(Solution 中的两个方案)

方案 1:为每个目标优化嵌入长度(像 Module 10 那样最大化偏差修正 AIS,k 扫到 20):

  • 得到每个目标的最优 k 约为 4–6;
  • 结果并没有明显变好:例如目标 0 连左邻 1 都不显著了(p = 4.4×10⁻⁵),目标 2 只选出 0、目标 3 只选出 1——更长的目标嵌入解释掉了更多信息,剩给源的更少,在严格阈值下更难显著。

方案 2:把历史长度硬编码为 k = 1——更接近因果结构:

目标 1: 选 0 (TE=0.377),选 2 (TE(2->1|0)=0.504),停止 ✓
目标 2: 选 1 (TE=0.277),选 3 (TE(3->2|1)=0.508),停止 ✓
目标 3: 选 2 (TE=0.388),选 4 (TE(4->3|2)=0.500),停止 ✓
目标 0: 选 1, 2, 26, 46 …(边界附近仍有误选)
  • 为什么 k = 1 更好地复现因果结构?CA 的真实规则只依赖上一时刻的自己和两个邻居。k = 1 时目标过去只包含真实的「自身」父节点,两个邻居的贡献不会被更长的历史(存储)吸收,所以邻居的 CTE 很大(≈0.5 bits),而远处格子没有额外信息。
  • 用更长 k 时,模型描述的是「以目标长历史为语境的信息处理」,这对理解计算(存储 vs 传递)有意义;但如果目的是尽量复现变量之间的因果结构,k 取因果上真实的历史长度(这里为 1)更合适。

这呼应了 Week 11 的「信息传递 ≠ 因果效应」:同样的数据,建模目的不同,参数选择就不同。


五、讲义小结

  • 了解了从时间序列推断网络的不同选项,以及有效网络推断的复杂性和微妙之处;
  • 能用 JIDT 做简单的有向功能网络推断;
  • 理解 IDTxl 等更高级技术的优势;
  • 下一讲:总结(Wrap-up)。

六、本周考点速记 / 易错点

  1. 三种网络:功能(无向、MI/相关、不解释机制);结构(因果连接、一般需干预、不反映动态变化);有效(有向、能复现并解释节点时间序列的最小模型)。样题第 20 题:有效网络 = 「构建有向网络,提供能复现并解释每个节点时间序列更新的最小多变量模型」。
  2. 「有向网络表示成对统计关系」是有向功能网络,不是有效网络。
  3. 有效网络虽非因果,但:可能是数据能做到的最好、反映动态状态变化、揭示涌现计算结构。
  4. 成对 TE + 阈值 → 成对 TE + p 值(统计导出的阈值,稳健、适合小数据)。
  5. 多重比较:Bonferroni , ;或 FDR。
  6. 成对方法的三个问题:多重比较、TE 参数(嵌入、延迟)设错导致假阳/假阴、不处理冗余(共同驱动、路径)和协同(门控)。
  7. 条件于所有其他变量:欠采样 + 删掉太多连接(冗余父节点互相抵消)。
  8. 贪心算法:0 嵌入目标 → 1 空集 → 2 条件于 P 算各源 CTE → 3 最大且显著则加入 → 4 循环 → 5 剪枝 → 6 整体检验。高效、处理冗余与协同、可非均匀嵌入、统计检验做「自动刹车」、需多重比较校正(max statistics)、加入顺序最终无关。
  9. IDTxl:基于 JIDT,实现贪心算法 + max statistics + 参数/非均匀嵌入选择 + 剪枝。
  10. Tutorial:MI 网络对称、块状(domain 造成);TE 网络集中在邻居但阈值难定;p 值 + Bonferroni 更原则但仍有多余父节点;贪心多变量 + k = 1 最接近真实结构。
  11. 异质变量(不合并)时每对样本少 → 只能用较小的 k。

七、下周预告

Week 13 — Module 13: Wrap-up:课程学习目标回顾、本课覆盖与未覆盖的内容、「信息论就是问题与答案」,以及样卷与考试复习。