阿理是城市情报局的分析师。他截获了三个接头人 A、B、C 的往来日志,却看不到任何一条消息的方向——不知道是谁在指挥谁。日志只留下两种痕迹:哪些人之间有联系,以及哪些联系在盯住某个第三人后“突然消失”。凭这两种痕迹,阿理偶尔能斩钉截铁地给一条边盖章定向,但更多时候只能画一条没有箭头的线。他很快发现,许多画法不同、箭头方向各异的网络,居然能产生一模一样的日志——它们就像同一个影子投出的不同原型。这些“数据完全无法区分”的因果图家族,就是马尔可夫等价类。它像一面镜子,照出了从观测数据反推因果结构的边界:边界之内可以确定,边界之外只能靠实验或额外知识。本文陪阿理完成这次破案,也带你认识因果发现中最诚实的工具。

岗位关联

一句话价值:掌握马尔可夫等价类,你就能在因果发现中清楚区分“数据能证明什么、不能证明什么”,避免把相关当因果——这是因果推断、结构学习与 AI 可解释性工程师的核心基本功。

目录
  1. 可视化演示
  2. DAG基础
  3. 等价类定义
  4. 对撞子结构
  5. PC算法流程
  6. 部分有向图
  7. 可辨识边界
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

动态演示马尔可夫等价类的核心机制,通过架构/数据/状态/性能四种模式展示关键概念与交互流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

马尔可夫等价类:因果发现 因果发现问题定义与可识别挑战 马尔可夫等价类的定义与判定条件 核心机制可视化 马尔可夫等价类整体架构与关键组件

DAG基础

阿理的第一课,是理解地下组织的“指挥规则”。接头人之间传递消息有严格方向:A 把命令传给 B,B 再传给 C,消息绝不回头——如果 A 的命令绕一圈又回到 A,整个组织就会陷入逻辑死循环。这张“单向、无环”的指挥图,就是有向无环图(DAG):节点是接头人,箭头是命令方向,而“无环”保证了任何消息都不会成为自己的源头。

数据里的“日志”就是每个接头人的行动记录。真正关键的不是单个人的动静,而是条件独立性:如果阿理死死盯住 B 的举动,发现 A 和 C 的行动不再同步,那么 A、B、C 之间就有两种可能——A 通过 B 影响 C(链),或者 A 和 C 都受 B 指挥(叉)。这种“控制住中间人,两头就失联”的现象,是 DAG 在数据上留下的第一道指纹。

一张 DAG 能把全部变量的联合分布“因式分解”成局部规则的乘积:每个变量的概率只依赖它的父节点,也就是它的直接原因。这是因果假设进入数据的第一步——有了 DAG,联合分布被压缩成一连串“只看上级”的条件概率;反过来,从数据中发现的局部规则,也能反过来约束 DAG 的形状。阿理的工作,就是“由果推因”。

有了这条规则,阿理明白:他手中的日志不是一张“命令网”的完整照片,而是这张网投在数据上的影子。同一个影子可能对应多个不同的网络——这正是下一节要说的马尔可夫等价类。

P(x1,x2,…,xn)=∏i=1nP(xi∣Pa⁡(xi))\displaystyle P(x_1, x_2, \dots, x_n) = \prod_{i=1}^{n} P\bigl(x_i \mid \operatorname{Pa}(x_i)\bigr)
这条公式说:整个网络的联合概率,可以拆成每个接头人“只根据直接上级决定自己行动”的概率之积。它把一张宏观的图,压缩成了一个个微观的规则。
  1. 联合分布左边的 $P(x_1,\dots,x_n)$ 表示所有变量同时取某一组值的概率,相当于“整个网络出现这种状态的可能性有多大”。
    P(x1,x2,…,xn)P(x_1, x_2, \dots, x_n)
  2. 乘积符号右边的 $\prod_{i=1}^{n}$ 把 n 个局部条件概率连乘,把“全局概率”拆成“局部规则”,这是因果图压缩信息的关键动作。
    ∏i=1n\prod_{i=1}^{n}
  3. 父节点$\operatorname{Pa}(x_i)$ 是 $x_i$ 的直接原因(父节点),条件概率 $P(x_i \mid \operatorname{Pa}(x_i))$ 表示“我只由直接上级决定,不关心更远的上级”。
    P(xi∣Pa⁡(xi))P\bigl(x_i \mid \operatorname{Pa}(x_i)\bigr)

等价类定义

阿理把两张不同的组织结构图拿给老同事看,对方却笑着说:“从日志看,它们完全相同。”他这才意识到:只要两张图的“接头关系”一样,且“消息汇合点”一样,任何日志都无法区分它们。这样的图被归进同一个家族,学名叫做马尔可夫等价类。

正式地说,两个 DAG 是马尔可夫等价的,当且仅当它们编码出完全相同的条件独立性集合。判定定理更简洁:骨架相同(谁和谁有边),且对撞子相同(哪些节点被两条箭头同时指向)。所谓骨架,就是把所有箭头抹掉后剩下的无向边;而“链 A→B→C”与“叉 A←B→C”骨架相同、又没有对撞子,因此它们天然是一对“双胞胎”。

等价类提醒阿理:很多时候他无法一锤定音,只能在几张候选图之间徘徊。与其反复改猜测,不如把整个等价类当作一个整体来研究——而等价类里唯一能“盖棺定论”的结构,就是下一节的对撞子。

G1≡G2  ⟺  skel⁡(G1)=skel⁡(G2) ∧ V(G1)=V(G2)\displaystyle G_1 \equiv G_2 \iff \operatorname{skel}(G_1) = \operatorname{skel}(G_2) \ \land\ \mathcal{V}(G_1) = \mathcal{V}(G_2)
等价判定定理:两张图只要“骨架一致、对撞子一致”,就必然属于同一等价类。这把“条件独立集合相同”这个抽象条件,变成了两个肉眼可查的图属性。
  1. 等价符号$G_1 \equiv G_2$ 读作“两张有向无环图马尔可夫等价”,意思是它们对观测数据而言完全无法区分。
    G1≡G2G_1 \equiv G_2
  2. 骨架条件$\operatorname{skel}(G_1)=\operatorname{skel}(G_2)$ 要求剔除箭头后的无向边完全一致,即“谁和谁有联系”相同。
    skel⁡(G1)=skel⁡(G2)\operatorname{skel}(G_1) = \operatorname{skel}(G_2)
  3. 对撞子条件$\mathcal{V}(G_1)=\mathcal{V}(G_2)$ 要求两张图的对撞子集合相同,即“哪些节点同时被两条箭头指向”完全一致。
    V(G1)=V(G2)\mathcal{V}(G_1) = \mathcal{V}(G_2)
  4. 逻辑与$\land$ 表示两条必须同时成立,缺一不可;这条判定准则叫作 Verma-Pearl 准则。
    ∧\land

对撞子结构

唯一的例外出现了。阿理发现 A 和 C 平时行动完全无关,可一旦 B 同时掌握两条线的动态,A、C 就会出现“此消彼长”的联动:A 这边动作大了,C 那边必然收敛。他立刻断定:A 和 C 都在向 B 汇报。这个“两条箭头汇入一个节点”的结构就是对撞子,它的方向性坚如磐石——是数据能提供的唯一定向铁证。

统计语言是这样的:变量 X、Y 边际独立,但以 Z 为条件后反而相关。这恰好与链(X→Z→Y)相反——链上 X、Y 在给定 Z 后是独立的。所以“不控制时无关、一控制反而相关”的指纹,只属于对撞子。这个反直觉的现象叫作“解释消除”:Z 的取值已经包含了 X 的功劳,再叠加 Y 的贡献时,若 Z 的观测值被固定,X 偏大就意味着 Y 偏小,于是出现负向联动。

对撞子像地下网的“核心枢纽”,是数据能盖章确认的唯一方向线索。PC 算法正是拿着这枚印章,去逐一检查每条三节点组合——这就是下一节的破案手册。

X⊥⊥Y,X̸ ⁣⊥⊥Y∣Z(X→Z←Y)\displaystyle X \perp\kern-5pt\perp Y, \qquad X \not\!\perp\kern-5pt\perp Y \mid Z \qquad (X \to Z \leftarrow Y)
这条公式是对撞子的“身份证”:平时 X 与 Y 互不相干,一旦已知 Z 的取值,X 与 Y 反而出现依赖。条件独立集合中的这一正一反,就是唯一能确定箭头方向的证据。
  1. 边际独立$X \perp\kern-5pt\perp Y$ 表示不控制任何变量时 X 与 Y 互不影响——对撞子的两个“父母”通常互不相干。
    X⊥⊥YX \perp\kern-5pt\perp Y
  2. 条件依赖$X \not\!\perp\kern-5pt\perp Y \mid Z$ 表示一旦已知 Z 的取值,X 与 Y 反而出现关联——这就是“解释消除”带来的负联动。
    X̸ ⁣⊥⊥Y∣ZX \not\!\perp\kern-5pt\perp Y \mid Z
  3. 结构标志$X \to Z \leftarrow Y$ 表示两条箭头都指向 Z,Z 是信息枢纽;只有这种形状会触发上面的独立性指纹。
    X→Z←YX \to Z \leftarrow Y

PC算法流程

阿理把破案过程整理成手册:PC 算法。第一步是骨架学习——从“所有人两两相连”的全连接图出发,逐条检查每一对变量:如果存在某个条件集,让这对变量条件独立,就删掉这条边。条件集从空集开始,逐步扩容到一阶、二阶,直到图不再变化为止。这一步依赖“忠实性假设”:数据里的条件独立关系,忠实反映了图结构里的 d-分离关系。

第二步是对撞子定向:扫描所有“三节点组 X–Z–Y”(其中 X 与 Y 不相连),如果 Z 不在 X、Y 的分离集中,就把两端箭头指向 Z,得到 X→Z←Y。第三步是传播定向:用几条机械规则——比如“已经有了 X→Z 且 Z–Y,就定向 Z→Y”——把确定性传播到更多边,同时保证不产生新环、不制造新的对撞子。手册虽机械,却严格:它绝不给数据不支持的边强行加箭头。阿理按手册跑完,得到的地图上一半是虚线——这正是下一节的部分有向图 PDAG。

Xi⊥⊥Xj∣S  ⟹  删除边 Xi−Xj\displaystyle X_i \perp\kern-5pt\perp X_j \mid \mathbf{S} \;\Longrightarrow\; \text{删除边 } X_i - X_j
骨架学习的核心规则:只要找到某个条件集 S,让 X_i 与 X_j 条件独立,就删除它们之间的边。删完之后,剩下的无向图就是因果骨架。
  1. 候选条件集$\mathbf{S}$ 是不包含 $X_i, X_j$ 的任意变量子集,从空集开始逐级扩展,模拟“在越来越多信息下两者是否还相关”。
    S⊆V∖{Xi,Xj}\mathbf{S} \subseteq V \setminus \{X_i, X_j\}
  2. 独立性检验$X_i \perp\kern-5pt\perp X_j \mid \mathbf{S}$ 表示给定 $\mathbf{S}$ 后二者条件独立,对应偏相关检验的 p 值大于阈值。
    Xi⊥⊥Xj∣SX_i \perp\kern-5pt\perp X_j \mid \mathbf{S}
  3. 删除规则$\Longrightarrow$ 读作“一旦发现就删”,这是骨架学习最核心的动作:条件独立意味着没有直接边。
    Xi−Xj∉skel⁡(G)X_i - X_j \notin \operatorname{skel}(G)

部分有向图

地图上有的边画了箭头,有的只是虚线。这张“半定向”的图叫部分有向无环图(PDAG)。它是整类马尔可夫等价图的“公分母”:把所有候选 DAG 放到一起,方向一致的边保留箭头,方向打架的边退化为无向边。换句话说,PDAG 把所有成员图的共识提取出来,把分歧如实暴露出来。

用人话讲,PDAG 是阿理能给出的最有诚意的答案——确定的部分盖章,不确定的部分画虚线,并明确告诉决策者“剩下这些方向,日志无能为力”。这也意味着因果发现的输出从来不是一张“全箭头图”,而是一张带着未知区域的诚实地图。

X→Y∈C([G])  ⟺  ∀G′∈[G]: X→Y∈G′\displaystyle X \to Y \in \mathcal{C}\bigl([G]\bigr) \iff \forall G' \in [G]:\ X \to Y \in G'
完成态 PDAG 的定向规则:只有等价类里每个成员图都包含 X→Y 这条箭头时,PDAG 才把它画成定向边;只要存在一个成员方向相反,它就退化为无向边。
  1. 完成态 PDAG$\mathcal{C}([G])$ 表示等价类 $[G]$ 的完成态部分有向无环图,它把该类所有成员“求并集后取共识”。
    C([G])\mathcal{C}\bigl([G]\bigr)
  2. 共享方向$X \to Y \in \mathcal{C}([G])$ 表示这条箭头出现在完成态 PDAG 中,即方向被整个等价类一致认可。
    X→Y∈C([G])X \to Y \in \mathcal{C}\bigl([G]\bigr)
  3. 全称量化$\forall G' \in [G]$ 遍历等价类里的每一个候选 DAG,要求无一例外都包含同向箭头。
    ∀G′∈[G]\forall G' \in [G]

可辨识边界

链 X→Y→Z 和叉 X←Y→Z 在等价类里是双胞胎:任意大的数据量下,日志都一模一样。阿理意识到,想区分它们,必须从“观测”转向“干预”——主动给 X 发一条假情报,看 Z 的动静会不会变。会变,说明 X 确实在指挥链路上,是链;纹丝不动,说明 X 只是下游的传声筒,是叉。

除了干预,时间先后、领域知识、非高斯性等额外信息也能帮忙,但核心原则不变:凡等价类内共享的方向都可辨识,凡等价类内不同的方向都不可辨识——这就是“可辨识边界”。阿理最终把报告写成两部分:“数据已证明”和“数据无法证明”。边界之外,要么做实验,要么诚实地说不知道——这正是因果科学最可贵的品质。

链: P(c∣do(a))=∑bP(c∣b) P(b∣a),叉: P(c∣do(a))=P(c)\displaystyle \text{链: } P(c \mid do(a)) = \sum_{b} P(c \mid b)\, P(b \mid a), \qquad \text{叉: } P(c \mid do(a)) = P(c)
do 算子模拟“人为强制 A 取某个值”,它切断所有指向 A 的箭头。如果干预 A 后 C 的分布变了,说明存在 A→…→C 的路径;如果不变,说明 C 不在 A 的下游。
  1. 干预算子$do(a)$ 表示“人为强制 A 取值为 a”,它切断所有指向 A 的箭头,只保留从 A 向外的传播——这是观测数据永远做不到的。
    do(a)do(a)
  2. 链式求和$\sum_{b} P(c\mid b)\, P(b\mid a)$ 沿中间人 B 把所有传导路径加权求和,反映“干预 A 后,影响确实顺着 B 流到了 C”。
    ∑bP(c∣b) P(b∣a)\sum_{b} P(c \mid b)\, P(b \mid a)
  3. 叉式结论$P(c \mid do(a))=P(c)$ 表示干预 A 后 C 的分布纹丝不动——因为 A 只是 B 的下游,不存在从 A 流向 C 的箭头。
    P(c∣do(a))=P(c)P(c \mid do(a)) = P(c)

AI 应用场景

基因调控网络重建

阶段:结构学习(因果发现)

解决的问题:传统共表达网络只能显示基因之间的相关,无法区分调控方向。用 PC 算法从转录组数据重建调控网络时,输出的是 PDAG:对撞子结构(如“转录因子 A 和 B 共同调控靶基因 C”)可以被唯一定向,而链式通路的方向属于马尔可夫等价类,必须靠 CRISPR 敲除实验才能确认。等价类分析帮科学家把“数据已证明”和“待实验验证”明确分开。

具体案例:某肿瘤研究组用 300 份乳腺癌 RNA-seq 样本跑 PC 算法,得到的调控 PDAG 中,TP53 相关的几条对撞子边被唯一定向,而“增殖通路”的链式方向仍是无向边,后续用基因敲除实验补齐方向。

电商转化路径归因

阶段:因果推断与归因分析

解决的问题:日志里“看了推荐页→加购→购买”的方向看似明显,但“加购”与“购买”也可能是大促这类共同原因造成的。用 PC 算法对用户会话变量做骨架学习,再结合等价类分析,能明确指出哪些环节的方向已被数据证明,哪些环节必须做 A/B 实验才能定向,避免把相关当因果做出错误投放决策。

具体案例:某电商分析用户行为日志,PC 发现“推荐曝光→加购”与“搜索→加购”构成对撞结构,可确证;而“加购→购买”与“购买→加购”落在同一等价类中,最终用灰度实验确认真实方向后,才调整了推荐策略。

临床风险因素识别

阶段:因果假设验证

解决的问题:电子病历是典型的观测数据,“血压高→心梗”与“心梗前兆→血压高”会生成相同的条件独立关系,单靠统计建模无法区分。先用 PC 给出骨架与等价类标记,研究者就知道哪些方向需要额外证据,进而用孟德尔随机化(遗传工具变量)或随机对照试验来突破可辨识边界。

具体案例:某药企分析 5 万份高血压病历,PC 输出的 PDAG 显示“药物使用”与“血压改善”之间的箭头方向不确定,团队改用遗传风险评分作为工具变量,才确认了药物降低血压的因果方向。

Python 演示

python69 行
import numpy as npfrom itertools import combinationsfrom math import sqrt, log, erf  def fisher_pval(r, n, k):    # Fisher z 变换, 检验偏相关系数是否为 0    z = 0.5 * log((1 + r) / (1 - r)) * sqrt(n - k - 3)    return 2 * (1 - 0.5 * (1 + erf(abs(z) / sqrt(2))))  def partial_corr(X, i, j, S):    # 给定条件集 S 时 i 与 j 的偏相关系数    idx = [i, j] + list(S)    C = np.linalg.inv(np.cov(X[:, idx].T))    return -C[0, 1] / sqrt(C[0, 0] * C[1, 1])  def pc_skeleton(X, alpha=0.05):    # PC 算法第一阶段: 从全连接图出发删除条件独立边    n, p = X.shape    adj = [[i != j for j in range(p)] for i in range(p)]    sepset = {}    for k in range(p):        for i in range(p):            for j in range(i + 1, p):                if not adj[i][j]:                    continue                others = [t for t in range(p) if t != i and t != j]                for S in combinations(others, k):                    r = partial_corr(X, i, j, S)                    if fisher_pval(r, n, len(S)) > alpha:                        adj[i][j] = adj[j][i] = False                        sepset[(i, j)] = S                        break    return adj, sepset  def orient_colliders(adj, sepset, p):    # 第二阶段: 若 j 不在 i-k 的分离集中, 定向 i->j<-k    oriented = []    for i in range(p):        for k in range(i + 1, p):            if adj[i][k]:                continue            for j in range(p):                if j != i and j != k and adj[i][j] and adj[j][k]:                    S = sepset.get((i, k), sepset.get((k, i), []))                    if j not in S:                        oriented.append((i, j, k))    return oriented  def main():    np.random.seed(7)    n = 4000    a = np.random.normal(size=n)    c = np.random.normal(size=n)    b = 0.8 * a + 0.8 * c + np.random.normal(size=n) * 0.5    X = np.column_stack([a, b, c])    adj, sepset = pc_skeleton(X)    print('骨架邻接矩阵 (0 表示无边):')    print(np.array(adj, dtype=int))    print('对撞子定向结果 (i, j, k 表示 i->j<-k):')    print(orient_colliders(adj, sepset, 3))  if __name__ == '__main__':    main()
目的:用 PC 算法的骨架学习与对撞子定向两个阶段,从合成的观测数据中重建因果结构,验证“只有对撞子方向可辨识”这一核心结论。
  1. z = 0.5 * log((1 + r) / (1 - r)) * sqrt(n - k - 3)Fisher z 变换把相关系数转成近似正态的统计量,用来算条件独立的 p 值。
  2. C = np.linalg.inv(np.cov(X[:, idx].T))用协方差矩阵的逆(精度矩阵)计算偏相关系数,等价于“控制住其他变量后的相关”。
  3. for S in combinations(others, k):从小到大遍历所有候选条件集,对应 PC 算法“分离集逐级扩容”。
  4. if fisher_pval(r, n, len(S)) > alpha:p 值大于阈值说明条件独立,这是删边的唯一判据。
  5. adj[i][j] = adj[j][i] = False无向边要双向删除,保证骨架对称。
  6. sepset[(i, j)] = S记录分离集,供第二阶段判断“中间人是否在分离集中”。
  7. if j not in S:对撞子定向的核心条件:j 不在 i、k 的分离集中,就定向为 i→j←k。
  8. b = 0.8 * a + 0.8 * c + np.random.normal(size=n) * 0.5生成对撞子结构 A→B←C 的合成数据,B 同时受 A、C 影响。

常见误区

误区“我用 PC 算出来 X 和 Y 在给定 Z 后 p 值很大,所以 X 和 Y 之间肯定没有因果联系,可以放心地忽略它们。”

正解条件独立只说明“控制 Z 后没有直接边”,不代表没有因果路径。比如链 X→Z→Y 中,X 与 Y 在给定 Z 后条件独立,但 X 依然是 Y 的因,只是影响经过 Z 间接传递。PC 删除的只是“直接边”,间接效应和因果路径依然存在。把“无偏相关”说成“无因果”,就像因为看不到中间人 B 的转述,就断言 A 从未影响过 C。

为何常见:初学者容易把“统计独立”等同于“没关系”,忽略了间接路径与中介变量的存在。

误区“两张图只要边一样,方向怎么画都行,反正它们属于同一个马尔可夫等价类,我随便挑一张交差。”

正解马尔可夫等价的判定是“骨架相同 + 对撞子相同”。对撞子是一票否决项:把 X→Z←Y 改成 X→Z→Y,条件独立集合立刻改变,就不再等价。方向只能在“不触碰对撞子、不产生新环”的范围内摇摆。所谓“随便画”,其实有一整套无环与对撞子约束。

为何常见:只记住了“方向不可辨识”的印象,却忘了唯一的例外——对撞子,以及无环性对方向的限制。

误区“跑完 PC 算法,我就得到了每条边都带箭头的因果 DAG,可以直接拿去写报告、做决策了。”

正解PC 算法输出的是 PDAG(部分有向无环图),大量边仍然无向——这些正是等价类内方向存在分歧的边。强行随机定向会制造虚假的因果结论。规范做法是把 PDAG 当作等价类的代表,再结合干预实验或背景知识补全方向,而不是假装数据已经给出了全部答案。

为何常见:教程里展示的最终图常常是已经补全方向的样子,让人误以为定向规则能解决一切。

误区“现在数据量动辄上亿,加上深度学习模型,肯定能把 X→Y→Z 和 X←Y→Z 分开,只是以前算法不够强而已。”

正解这是可辨识性问题,不是精度问题。链与叉产生完全相同的条件独立集合,任何观测数据、任何算法、任何样本量都无法区分;必须依靠干预、时间顺序或领域假设等额外信息。数据再多,也突破不了马尔可夫等价类划下的边界——就像再清晰的影子照片,也拍不出背对镜头的人长什么样。

为何常见:深度学习中“数据越多越强”的直觉被错误迁移到因果结构识别上,忽略了统计学上的不可辨识性。

面试题

Q1. 两个 DAG 属于同一马尔可夫等价类的充要条件是?

单选题 · easy

  • A.节点数量完全相同
  • B.骨架与对撞子一致← 正确答案
  • C.边的数量恰好一样多
  • D.每个节点的父节点相同

答案:B。马尔可夫等价类由“骨架相同 + 对撞子相同”完全刻画(Verma–Pearl 准则)。节点数、边数相同只是必要但不充分;父节点相同则过强——链与叉父节点不同却依然等价,所以 B 正确。

Q2. 对撞子结构 X→Z←Y 的统计特征是?

单选题 · easy

  • A.X 与 Y 边际独立且条件独立
  • B.X 与 Y 边际独立,给定 Z 后相关← 正确答案
  • C.X 与 Y 始终存在正相关关系
  • D.X 与 Y 的相关性与 Z 无关

答案:B。对撞子的指纹正是“边际独立、条件依赖”。Z 是 X 与 Y 的共同后代,固定 Z 后出现“解释消除”的负向联动;A、C、D 都与这条指纹相反,因此错误。

Q3. PC 算法骨架学习阶段删除一条边的依据是?

单选题 · easy

  • A.两变量相关系数显著大于零
  • B.存在条件集使两变量条件独立← 正确答案
  • C.两变量的方差差异足够大
  • D.两变量不在同一个等价类中

答案:B。骨架学习的核心是找到“分离集”:只要存在某个条件集让两变量条件独立,就删除这条边。相关系数显著恰恰说明有边而不是删边,方差与等价类都与删边判据无关。

Q4. 链 A→B→C 与叉 A←B→C 的关系是?

单选题 · mid

  • A.二者条件独立集合完全相同← 正确答案
  • B.二者包含不同数量的对撞子
  • C.只有叉结构可由数据识别
  • D.二者属于两个不同的等价类

答案:A。链与叉都满足 A⊥C|B,且都没有对撞子,因此属于同一马尔可夫等价类,条件独立集合完全相同。既然属于同一类,就不可能被观测数据区分,B、C、D 均错误。

Q5. 能打破链与叉之间等价性的手段有?

多选题 · mid

  • A.主动干预实验得到 do 数据← 正确答案
  • B.消息传递的时间先后信息← 正确答案
  • C.无限增加观测样本量
  • D.领域专家提供的背景知识← 正确答案

答案:ABD。马尔可夫等价类是“观测数据的可辨识边界”,无论样本量多大都无法突破;而干预实验、时间先后、专家知识都属于额外信息,能给方向判定提供新的约束,从而打破等价性。

Q6. 关于部分有向无环图(PDAG)正确的有?

多选题 · mid

  • A.定向边是所有等价成员的共享方向← 正确答案
  • B.无向边表示等价类内方向有分歧← 正确答案
  • C.PDAG 只能由干预实验来构建
  • D.完成态 PDAG 可代表整个等价类← 正确答案

答案:ABD。完成态 PDAG 是等价类的“公分母”:定向边是全体成员共享的方向,无向边表示成员之间存在方向分歧。PC 算法从观测数据就能构建 PDAG,不需要干预实验,C 错误。

Q7. PC 算法的执行顺序是?

单选题 · mid

  • A.边定向 → 骨架学习 → 规则传播
  • B.骨架学习 → 对撞子定向 → 规则传播← 正确答案
  • C.规则传播 → 骨架学习 → 边定向
  • D.骨架学习 → 规则传播 → 对撞子定向

答案:B。PC 算法先做骨架学习(条件独立删边),再通过对撞子定向锁定唯一铁证,最后用传播规则在不产生新环、新对撞子的前提下扩展定向边。其余顺序都颠倒了因果依赖关系。

Q8. 关于对撞子在可辨识性中的作用,正确的有?

多选题 · hard

  • A.对撞子是数据可辨识的方向指纹← 正确答案
  • B.翻转对撞子方向会改变条件独立集← 正确答案
  • C.对撞子越多等价类中的图越多
  • D.PC 用分离集检验来寻找对撞子← 正确答案

答案:ABD。对撞子产生“边际独立、条件依赖”的独特指纹,翻转它的方向会改变指纹,因此它是可辨识方向的核心。对撞子越多,约束越多,等价类反而越小,C 错误。PC 正是通过“中间人不在分离集中”来识别对撞子。

Q9. 完成态 PDAG 中无向边 X—Y 的含义是?

单选题 · hard

  • A.X 与 Y 之间确定没有因果联系
  • B.等价类中既有单向又有反向成员← 正确答案
  • C.该边必然来自对撞子结构
  • D.该边只能在干预实验后出现

答案:B。无向边表示等价类内部方向存在分歧:有些成员 DAG 是 X→Y,另一些是 Y→X。无向边与对撞子没有必然联系,也不依赖干预实验;它说明观测数据无法在这两个方向之间做出裁决。

Q10. 对撞子 X→Z←Y 中固定 Z 后 X 与 Y 呈现?

单选题 · extreme

  • A.保持独立不受 Z 任何影响
  • B.此消彼长的负向联动关系← 正确答案
  • C.同涨同跌的正向联动关系
  • D.联动方向取决于样本量

答案:B。这就是“解释消除”:Z 的取值已包含 X 的贡献,固定 Z 后,X 偏大意味着需要 Y 偏小来补足,形成负向联动。A 违背条件依赖指纹,C 符号相反,D 与样本量无关。