想象你是新上任的城市交通规划师。你拿到一份年久失修的路网图,上面画满了路口和道路,却唯独没有标注每条路到底是单行还是双行。你能依靠的只有每天川流不息的车辆:它们的走向、拥堵和绕行习惯,都在悄悄泄露道路的方向。可问题是,好几套完全不同的“单行方案”,可能产生一模一样的车流观察——你只能断定这些方案在你的观测下无法分辨,却无法确定哪一套才是真实路况。这正是 Markov 等价类要讲的故事:因果推断里,数据就像车流观测,因果图(DAG)就像路网图;多张因果图可能编码出完全相同的条件独立性,它们彼此等价。我们能做的是识别出这个“方向迷宫”的边界,然后在关键路口亲手“封路测试”——干预实验——来打破迷局。
掌握 Markov 等价类,你就掌握了因果推断的“元认知”:知道观测数据能确定什么、不能确定什么。这是从相关走向因果的必修课,也是可解释 AI 落地时不可或缺的判断力。
可视化演示
展示DAG的Markov等价类:具有相同骨架和v-结构的DAG编码相同条件独立性,构成等价类,用CPDAG表示其中不可区分的边方向。
本节配有交互动效(进入视口后自动加载,约 3KB)。
Markov等价类 同骨架+同v结构=等价DAG CPDAG表示不可区分边方向 D1~D2 iff skel+v-struct 等价类内DAG编码相同条件独立性
DAG基础概念
规划师拿到旧图纸的第一件事,是检查路网有没有“绕圈”的毛病:如果 A 大街通向 B 大道,B 大道通向 C 花园,那么 C 花园就绝不能偷偷修一条回头路回到 A——否则车辆会陷入无限循环,整座城市的交通都会崩溃。因果图同样立下这条“无环”军规:没有任何一条有向路径能绕回起点,这正是“有向无环图”(DAG)名字里“无环”二字的含义。
在因果推断里,每个变量就是一个路口(结点),每条“原因→结果”的单行线就是一条有向边。变量与有向边合在一起,就构成一张因果图。DAG 最值钱的资产,是它编码的条件独立性:当我们已经掌握某些中间变量的取值后,其他变量之间的信息传递就会被切断。在车流隐喻里,这就像你一旦确认了枢纽 B 的拥堵状态,A 与 C 两个路口的车流就变得互不相干。
形式化地说,若给定 Z 时 X 与 Y 的联合分布可以分解为各自条件分布的乘积,就称 X 与 Y 在给定 Z 下条件独立:
判断图中任意两点是否条件独立,靠的是 d-分离准则:信息像车流一样沿有向边按方向流动,遇到“对撞结构”(两条边同时指向一点)时,若没有给定该点则路径被阻断,一旦给定反而被激活。理解了“信息在哪里被切断、在哪里被激活”,我们才能回答一个关键问题:为什么有些车流观察会完全无法区分两套单行方案?这就进入了等价类的核心。
- 条件独立记号读作“在给定 Z 的条件下,X 与 Y 独立”,是整篇文章的通用语言。
- 联合分布可分解给定 Z 后,X、Y 一起出现的概率等于各自条件概率相乘,说明两者之间没有信息流动。
等价类定义
一天下来,规划师震惊地发现:两份完全不同的单行方案,却产生了分毫不差的车流记录。他恍然大悟——观测数据只能告诉我们“哪些方案长得一模一样”,不能告诉我们“哪个才是真相”。这些互相无法区分的方案被他叠成一摞,命名为“等价类”。
在因果推断里,两个结点集合相同的 DAG,如果编码的条件独立性完全一致,就称它们马尔可夫等价,同属一个 Markov 等价类。比如三条链式 DAG(A→B→C、A←B→C、A←B←C)都满足 A 与 C 在给定 B 时独立,因此在观测层面无法区分。判断等价不需要逐个核对所有独立性,Verma 与 Pearl 发现,只需盯住两样东西。
第一样是骨架:把有向边全部抹去方向后得到的无向图,回答“哪些路口相邻”。第二样是 V 型结构:形如 X→Y←Z 且 X、Z 之间没有边相连的结构,也叫未屏蔽对撞子。在车流隐喻里,V 型结构就像“漏斗式汇合”——两股来路都只能冲进同一个枢纽,而两个源头之间没有直连,这种结构是唯一能“铁证”单一方向的局部模式。形式化的等价定义如下:
就像规划师先掂量“底层连接”和“漏斗汇合”两样清单,就能判断两份方案是否车流等价——这份清单的正式名字,就叫 Verma-Pearl 定理。
- 等价记号G₁ 与 G₂ 属于同一等价类,记作 G₁ ∼ G₂。
- 全称量化对所有互不相交的变量集合 X、Y、Z 都成立,一个也不能少。
- 独立性相同在 G₁ 中成立的条件独立性,在 G₂ 中同样成立;反之亦然。
Verma-Pearl判定定理
有了等价类的直觉,规划师还需要一把快刀:如何不用把两份方案的所有细节逐一比对,就能断定它们是否同属一摞?答案是把目光聚焦在两类“关键证据”上:底层连接是否一致,漏斗式汇合的位置是否一致。
定理的表述非常干净:两个 DAG 马尔可夫等价,当且仅当它们的骨架相同且 V 型结构集合相同。这是充要条件——既不多,也不少。特别要注意,V 型结构必须“未屏蔽”:如果父结点 X 与 Z 之间也有一条边直接相连,那么这个对撞子就被屏蔽了,箭头方向的信息也随之丢失,不能再作为判定证据。
1. 骨架相等:去掉所有箭头方向后,两图的“哪些路口相邻”完全一致。
2. 逻辑与:两个条件必须同时成立,缺一不可。
3. V 型结构集合相等:未屏蔽对撞子的位置在两图中一一对应。
为什么这两样就够?因为 d-分离的格局完全由骨架和 V 型结构决定:其余方向无论怎么翻转,条件独立性清单都不会变。规划师从此只需检查两份地图的连接关系与漏斗位置,就能断言车流等价——哪怕箭头画得完全不同。
CPDAG图表示
一个等价类可能包含很多张 DAG,总不能把所有候选方案都摊在桌上吧?规划师想出一个聪明的办法:把确定的方向画成实线箭头,把拿不准的方向画成双头线——一张“半定向地图”就浓缩了整个等价类。
这张图就是完全部分有向图,简称 CPDAG。构造规则很直观:对于等价类中的每一条边,如果所有成员 DAG 都一致地取 X→Y,那么它是强制边,方向已被数据钉死;如果某些成员取 X→Y、另一些取 X←Y,那么它是不确定边,用一条无方向的边 X—Y 表示。这样,等价类的信息被无损压缩进一张图。
1. 等价类集合:[G₀] 把“所有走起来一样的单行方案”收进同一个集合。
2. 全称量词:对集合中每一个成员 G 都成立,才配叫“强制”。
3. 强制边判定:方向在所有成员中一致,说明观测数据已经把方向钉死。
CPDAG 是等价类的“身份证”:一张图,一族方案,清清楚楚标出哪些方向已被数据确认、哪些仍悬而未决。对工程实践来说,这张诚实的“半定向地图”远比一张武断的全定向图更有价值。
PC算法学习
光有理论还不够,规划师决定亲自上街勘测:第一步,摸清哪些路口真的相连;第二步,寻找漏斗式汇合点;第三步,利用几条交通铁律把方向尽量传播到全城。这套三步勘测法,就是 PC 算法。
在忠实性假设下——即数据中的条件独立性完全由图结构编码,不多也不少——PC 算法从观测数据中恢复出整个等价类。它的思路不是从零画图,而是从“全连接”开始做减法:对每对变量做条件独立性检验,若发现某个条件集能让二者独立,就删除这条边,并记录下这个“分离集”。
1. 邻接集合:adj(X) 是当前图中 X 的全部邻居结点。
2. 条件集存在性:在 X 的邻居中(不含 Y)能找到某个 S 使二者独立。
3. 删边决策:条件独立成立,意味着 X—Y 之间没有直接因果连接。
拿到骨架后,算法在骨架上寻找 V 型结构并定向:若出现 X—Y—Z 而 X、Z 不相邻,则定向为 X→Y←Z。最后用 Meek 规则传播方向——例如已知 X→Y 且 Y—Z 而 X、Z 不相邻,则强制 Y→Z。最终输出的正是上一节那张 CPDAG。勘测手册的最终产物并不是一张全定向的“真相图”,而是一张标明“已知/未知”的诚实地图;剩下的方向,要靠干预实验来补测。
因果识别应用
车流能告诉我们“哪些方案无法区分”,可当市政厅问:“如果封掉 X 路口的某个方向,Z 区域的流量会变成什么样?”等价类内的不同方案会给出大相径庭的预测。这时,观测数据的权力到此为止,真正的主角是干预实验——亲手封路。
这是因果识别的核心困境:等价类成员在观测分布上不可区分,但 do 算子(干预算子)下的分布未必相同。最经典的例子是链 X→Y→Z 与叉 X←Y→Z:两者骨架相同、都没有 V 型结构,因此同属一个等价类;但因果含义天差地别——链中 X 通过 Y 中介影响 Z,叉中 X 与 Z 根本没有因果通路。
1. do 算子:do(x) 对应规划师“封路施工”后的世界,与“看到车流 X=x”完全不同。
2. 链式路径求和:X 经 Y 中介影响 Z,要按中间变量 Y 的所有可能取值加权求和。
3. 叉式无通路:X 与 Z 之间没有因果路径,干预 X 不改变 Z 的分布。
工程实践的标准姿势因此清晰起来:用 PC 等算法输出 CPDAG,识别出等价类边界;对方向存疑的关键边,再用随机干预(A/B 测试、CRISPR 扰动、自然实验)补测方向。规划师终于明白——观测车流图只能框定“迷宫”的边界,真正的钥匙,是亲手封路测一次。
AI 应用场景
基因调控网络重建
阶段:因果结构学习
解决的问题:研究者只能观测基因表达量,却看不到“哪个基因调控哪个基因”。传统相关性分析只能给出共表达模块,完全无法判断调控方向。基于等价类的 PC 算法输出 CPDAG:骨架还原调控关系,V 型结构给出部分确定方向;方向存疑的边再交给 CRISPR 干预实验(敲低目标基因后测表达变化)定夺。这就像先用车流观察圈定“等价迷宫”,再封路测试关键路口。
具体案例:某团队用单细胞转录组数据跑 PC 算法,得到含数百条边的 CPDAG,其中约 30% 的边已由 V 型结构定向;其余方向未定边通过 20 个候选基因的扰动实验逐一确认,最终构建出细胞命运决定的调控子图。
推荐系统因果去偏
阶段:因果效应估计
解决的问题:日志数据里“曝光→点击”与“兴趣→曝光”往往同属一个等价类,直接回归会把“兴趣驱动曝光”的混杂效应算成曝光的效果,产生选择偏差。等价类视角提醒工程师:观测数据无法区分“曝光塑造兴趣”还是“兴趣驱动曝光”,必须用随机化 A/B 测试(干预)来确定方向,再估计真实的点击因果效应。
具体案例:某推荐团队发现离线指标虚高,用 CPDAG 分析后确认行为图中存在反向因果边,随即设计随机曝光实验修正偏差,线上 CTR 提升 8%。
可解释AI的反事实边界
阶段:反事实推理
解决的问题:解释模块常回答“如果当初没有打折,用户会不会购买”这类反事实问题,答案高度依赖因果方向。若方向在等价类内未定,同一问题可能给出矛盾解释。用 CPDAG 显式标注未定向边,AI 系统可以在解释中声明不确定性边界,避免误导性的因果断言。
具体案例:信贷风控解释模块中,对“收入→额度”这类等价类内方向未定的边,系统在解释附注“该结论依赖方向假设”,顺利通过监管审计。
Python 演示
# -*- coding: utf-8 -*-# Markov等价类判定: 骨架 + V型结构 (Verma-Pearl定理) def skeleton(edges): """返回无向骨架, 用双向邻接集合表示: {(u,v),(v,u)}""" s = set() for u, v in edges: s.add((u, v)) s.add((v, u)) return s def parents(node, edges): """返回指定结点的全部父结点集合""" return {u for u, v in edges if v == node} def v_structures(edges): """返回V型结构(未屏蔽对撞子)集合, 每个元素为三元组 (u, v, w)""" vs = set() nodes = {n for e in edges for n in e} skel = skeleton(edges) for b in nodes: pa = sorted(parents(b, edges)) for i in range(len(pa)): for j in range(i + 1, len(pa)): x, y = pa[i], pa[j] if (x, y) not in skel: vs.add((x, b, y)) return vs def markov_equivalent(g1, g2): """判定两个DAG是否属于同一Markov等价类""" return skeleton(g1) == skeleton(g2) and v_structures(g1) == v_structures(g2) if __name__ == "__main__": chain1 = [("A", "B"), ("B", "C")] # A -> B -> C chain2 = [("B", "A"), ("B", "C")] # A <- B -> C (fork) chain3 = [("B", "A"), ("C", "B")] # A <- B <- C collider = [("A", "B"), ("C", "B")] # A -> B <- C (v-structure) print("three chains pairwise equivalent:", markov_equivalent(chain1, chain2), markov_equivalent(chain1, chain3)) print("chain vs v-structure equivalent:", markov_equivalent(chain1, collider)) print("v-structure set:", v_structures(collider))
s.add((u, v))把无向边双向登记进集合,之后判断“是否相邻”只需一次查表。return {u for u, v in edges if v == node}父结点就是“有向边终点”对应的起点。skel = skeleton(edges)提前算好骨架,供后续判断“两个父结点是否相邻”。for b in nodes:逐个检查每个结点是否充当“漏斗式汇合”的枢纽。if (x, y) not in skel:只有当两个父结点之间没有边时,才算未屏蔽对撞子,即 V 型结构。vs.add((x, b, y))记录三元组 (父1, 对撞点,父2),构成 V 型结构集合。return skeleton(g1) == skeleton(g2) and v_structures(g1) == v_structures(g2)Verma-Pearl 定理的一行落地。
常见误区
误区把 PC 算法输出的带箭头图当成真实因果图:“箭头都画出来了,方向肯定对,直接写进因果报告。”这在初学者中非常普遍。
正解PC 算法在忠实性假设下输出的是 CPDAG,代表整个等价类——只有强制边的方向可识别,不确定边只是“数据无法裁决”。把它当成真实因果图,会制造虚构的因果结论。就像观测车流无法分辨 A→B 与 B→A 两种单行方案,算法画了箭头也不等于事实。
为何常见:算法的输出形态是有向图,绘图库默认渲染箭头,人们很容易把“输出符号”误当成“事实断言”。
误区“两个图都是 A-B-C 的邻接关系,底层连接一模一样,当然等价。”
正解骨架相同只是必要条件,还必须比较 V 型结构。A→B←C 与 A→B→C 骨架完全相同,但前者存在未屏蔽对撞子、后者没有,因此属于不同的等价类。就像两座城的底层道路连接一样,一处有“漏斗式汇合”、一处没有,车流特征完全不同。
为何常见:直觉上“方向不重要”被骨架概念强化,而 V 型结构正是反直觉的关键点,容易被忽略。
误区“现在数据这么多,再多采一些样本、把检验做细一点,总能确定到底是链还是叉吧?”
正解这是信息论的硬边界:等价类成员在观测分布上完全一致,再多数据也无法从分布本身区分它们。要打破等价,必须引入干预数据或领域假设。无论你站岗观察多久车流,都无法仅凭车流区分两份“走起来完全相同”的单行方案。
为何常见:深度学习环境下“数据越多越强”的直觉深入人心,而因果结构学习恰恰存在原理性的不可识别。
误区“X→Y←Z 是 V 型结构;如果 X 和 Z 之间还有一条边,那它当然也是 V 型结构。”
正解V 型结构必须是“未屏蔽对撞子”:两个父结点之间不能有边。若 X—Z 之间有边,这个对撞子就被屏蔽了,箭头方向可能变得不可识别。严格定义永远是“未屏蔽”三个字。
为何常见:只记住了“对撞=汇聚到一点”,却漏掉了“父母不相邻”这一核心限定词。
误区“既然观测数据分不清方向,那就多加点特征做倾向评分,效果等同于干预实验。”
正解倾向评分等观测方法只能调整已观测到的混杂,无法改变等价类的信息边界。只有 do(x) 级别的干预(随机实验、A/B 测试、自然实验)才能真正打破对称。封路施工与坐在路边统计绕行方案,是两类完全不同的信息。
为何常见:因果推断课程常把重点放在“调整混杂”上,读者容易高估观测调整的效力、低估干预的不可替代性。
面试题
Q1. 以下哪项是判断两个 DAG 属于同一 Markov 等价类的核心标准?
- A.拥有完全一致的结点集合
- B.编码的条件独立性完全相同← 正确答案
- C.拥有完全一致的有向边数
- D.拥有数目相同的全部路径
答案:B。等价类以“编码的条件独立性集合”为准,而不是边数、结点数或路径数。就像两位规划师给出不同的单行方案,只要车流观察完全一致,就属于同一等价类。A、C、D 描述的只是表面相似,不能保证条件独立性一致。
Q2. Verma-Pearl 定理中,两个 DAG 等价的充要条件是?
- A.结点集合与无环结构都相同
- B.骨架相同且 V 型结构相同← 正确答案
- C.条件独立数目与骨架都相同
- D.有向边数目与结点数都相同
答案:B。定理说骨架相同且 V 型结构相同是充要条件,二者缺一不可。类比两份路网图要“车流等价”,既要底层连接一致,也要漏斗式汇合的位置一致。其余选项要么缺少 V 型结构,要么把必要条件当成了充分条件。
Q3. 仅凭观测数据,以下哪种局部结构的箭头方向必然可识别?
- A.A→B→C 的链式结构
- B.A←B→C 的叉式结构
- C.A→B←C 的V型结构← 正确答案
- D.A←B←C 的链式结构
答案:C。A→B←C 是未屏蔽对撞子(V 型结构),其“两路汇入、父结点不相邻”的模式是观测数据中唯一能铁证方向的局部结构。链式与叉式结构的方向可以整体翻转而不改变条件独立性,就像普通单行线无法从车流看出方向,只有漏斗式汇合能暴露真相。
Q4. 关于 CPDAG 中“不确定边”的准确含义是?
- A.方向一致但尚未被数据验证的边
- B.等价类成员中存在两种方向的边← 正确答案
- C.数据不支持但理论上必须存在的边
- D.因果强度较弱所以方向不明确的边
答案:B。不确定边表示在等价类内既有取 X→Y 的成员、也有取 X←Y 的成员,观测数据无法裁决,因此画成无方向边。其余选项混淆了“尚未验证”“数据不支持”“强度弱”等无关语义。类比车流观测无法判断某条路到底往哪边单行,只能标成双头线。
Q5. 关于 Markov 等价类,下列说法正确的有?
- A.同一等价类的成员共享同一个骨架← 正确答案
- B.同一等价类的成员共享相同V型结构← 正确答案
- C.观测数据无法区分等价类内的成员← 正确答案
- D.等价类成员的干预效应估计必然相同
答案:ABC。等价类成员共享骨架、共享 V 型结构,观测分布完全相同,故 A、B、C 正确。D 错误:干预效应未必相同,典型如链 X→Y→Z 与叉 X←Y→Z 同属一个等价类,但 P(z|do(x)) 的答案完全不同。
Q6. PC 算法学习骨架阶段的核心操作是?
- A.对每对变量执行条件独立性检验← 正确答案
- B.对每对变量计算完整的相关系数
- C.对每个节点统计其入度与出度的值
- D.对每条候选边执行随机的干预实验
答案:A。PC 算法从完全图出发,用条件独立性检验删边得到骨架;相关系数、度数统计都不是删边依据,干预实验则超出观测数据范畴。类比规划师先通过车流判断“哪些路口真相连”,再谈方向。
Q7. 关于干预实验在因果识别中的作用,正确的有?
- A.干预可以打破等价类的不可区分性← 正确答案
- B.干预后的数据分布用 do 算子刻画← 正确答案
- C.干预实验能可靠区分 X→Y 与 X←Y← 正确答案
- D.大型观测数据集完全可以替代干预
答案:ABC。干预(像封路施工)改变了数据生成机制,能区分方向;do 算子恰好刻画这种干预后的分布。A、B、C 正确。D 错误:再大的观测样本也突破不了等价类的信息边界,这正是观测与干预的本质区别。
Q8. 链式 X→Y→Z 与叉式 X←Y→Z 同属一个等价类,关于 P(z|do(x)) 说法正确的是?
- A.两种结构下干预效应的估计必然相同
- B.链式需沿中介路径求和而叉式不需要← 正确答案
- C.叉式需沿中介路径求和而链式不需要
- D.两种结构下干预效应都无法进行估计
答案:B。链式结构里 X 经 Y 中介影响 Z,干预效应必须沿 Y 加权求和;叉式结构里 X 与 Z 没有因果通路,干预 X 不改变 Z。这是等价类成员预测相悖的经典案例,也是因果识别的核心困境。
Q9. CPDAG 作为等价类的表示,其核心价值是?
- A.用一张混合方向图唯一代表整个等价类← 正确答案
- B.从观测数据中筛选出最可能的唯一因果图
- C.对每条因果边都精确标注出唯一的箭头方向
- D.用颜色深浅标示每条边的因果效应大小
答案:A。CPDAG 以“强制边+不确定边”的混合方向唯一表示整个等价类,避免过度承诺方向。其余选项要么仍想输出唯一因果图,要么混淆了边的因果效应强弱——CPDAG 表达的是方向信息,不是效应大小。
Q10. 关于强制边(compelled edge)的说法,正确的有?
- A.等价类中所有 DAG 上的方向都一致← 正确答案
- B.可由 V 型结构与 Meek 规则推导出来← 正确答案
- C.强制边的方向在观测数据下可识别← 正确答案
- D.强制边只会出现在骨架的叶子结点上
答案:ABC。强制边在等价类所有成员中方向一致,可由 V 型结构和 Meek 规则推出,且方向在观测数据下可识别,故 A、B、C 正确。D 错误:强制边可以出现在图的任何位置,与是否叶子无关。