想象一间大办公室。部门之间靠“小道消息”联系:X 部门有个八卦,会先传到中间人 Z 那里,再由 Z 转告 Y 部门;有时老板 Z 会同时给 X、Y 两个部门发通知;有时 X、Y 会各自把汇报交给 Z 汇总。因果图就是这张“消息地图”,而 d-分离要回答的问题只有一个:当我知道了一些人手里的信息之后,X 部门的八卦还能不能传到 Y 部门? 如果不能,我们就说 X 和 Y 在给定信息下“d 分离”了——它们之间不再有任何相关性在流动。这个看似简单的判定,是因果推断最核心的基石:它帮我们看清“相关”从哪条路径来、控制哪些变量才能切断虚假关联,也正是 do-演算中判断“能否从观察数据识别因果效应”的第一步。

岗位关联

对 AI 从业者而言,掌握 d-分离就等于拿到一把“路径安检仪”:在特征筛选、混杂控制、模型可解释性分析中,能精确判断该保留哪些变量、屏蔽哪些变量,避免把相关性当因果性交给模型。

目录
  1. 可视化演示
  2. 概念引入
  3. 三种结构
  4. 条件阻断
  5. 形式化判定
  6. 图模型联系
  7. 实战应用
  8. 误区规避
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

动态展示因果图中d-分离的三种基本结构:链、叉、碰撞,以及条件化中间节点对路径阻断的影响,直观演示独立性判定规则。

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

d-分离判定 源节点 中间节点 目标节点 条件化 A-B-C 链/叉阻断 碰撞打通

概念引入

你新入职一家公司,想打探隔壁 Y 部门的消息,可你只认识 X 部门的同事。X 部门的八卦不会凭空飞到 Y,中间往往隔着传话人、群聊记录,甚至共同的老板。因果图把这种“消息地图”画出来:每个变量是图上的一点,箭头表示“谁的消息能传给谁”。d-分离就是在问:如果我心里已经装着某些人的全部情报,X 那边的消息还能不能拐弯抹角传到 Y?

用数学的语言说,d-分离(directed separation)是因果图上的一个判定规则。它检查从 X 到 Y 的所有路径,看它们是否被一个已知变量集合 Z 全部“挡住”。如果能全部挡住,就称 X 和 Y 在给定 Z 时 d 分离,记作:

回到办公室场景:d-分离不是玄学,它要求你先把 Z 的情报在脑中固定住,再逐个检查 X 到 Y 的每条传话路线。只要有一条路线还能传消息,X、Y 就没有 d 分离;所有路线都断了,才叫 d 分离。这就像查八卦源头:你把中间人都问了个遍,发现他们再没有新料可讲,那两边的消息就彻底断了。

X⊥ ⁣ ⁣ ⁣⊥Y∣ZX \perp\!\!\!\perp Y \mid Z
这个式子读作“在给定 Z 的条件下,X 与 Y 独立”。它不是说 X、Y 完全没有关系,而是说 Z 已经解释了它们之间全部的相关性,就像你已经知道所有传话人的口径后,再听一遍也不会得到新信息。
  1. 符号 X因果图中的一个变量,比如“是否加班”,它是消息的起点。
    XX
  2. 符号 Y我们关心的另一个变量,比如“绩效是否达标”,想知道 X 的消息还能不能传到它这里。
    YY
  3. 符号 ⊥⊥读作“独立于”,表示 X 和 Y 之间的相关性信息不再流动。
    ⊥ ⁣ ⁣ ⁣⊥\perp\!\!\!\perp
  4. 符号 Z一个变量集合,代表“我们已经知道的全部情报”,可以是一个或多个变量。
    ZZ
  5. 竖线 |“在给定……的情况下”,把 Z 当作固定背景,再看 X、Y 是否还有信息往来。
    ∣Z\mid Z

三种结构

办公室传话无非三种典型局面。第一种是链式结构:X 告诉 Z,Z 再告诉 Y,消息经过中间人接力;第二种是叉式结构:老板 Z 把同一份通知同时发给 X 和 Y,两边看似有关,其实是同一个源头;第三种是对撞结构:X 和 Y 都向 Z 汇报,消息在 Z 那里汇合,X、Y 平时各说各话。

这三种结构决定了消息能不能流通。链式与叉式有一个共同点:当 Z 的情报已知时,X 和 Y 之间的消息就被切断了。链式中,Z 知道的你都知道了,再听一遍等于重复;叉式中,Z 广播的内容你已经知道,X、Y 自然给不了新信息。用公式来表达链式结构 X→Z→Y 下的条件独立:

但对撞结构恰好相反。X→Z←Y 时,X 和 Y 的消息一起涌向 Z。只要不知道 Z 的汇总,X、Y 之间毫不相干;一旦你知道了 Z 的结果,它们反而“不打自招”。比如 Z 是“项目是否出事故”,X 是“是否按规范操作”,Y 是“环境是否恶劣”:如果 Z 已知出事故了,且你知道 X 很规范,就能反推出 Y 一定很糟糕。

把三种结构记在脑子里,读任何因果图都像是在读办公室座位图:看到一串箭头,先判断中间人属于“转发”、“广播”还是“汇合”,消息能不能通也就一目了然了。这是 d-分离 最基础的语法课。

P(Y∣X,Z)=P(Y∣Z)P(Y \mid X, Z) = P(Y \mid Z)
意思是:在已经知道 Z 的条件下,再追问 X 并不会改变 Y 的分布——X 对 Y 不提供额外信息。
  1. 链式条件独立X→Z→Y 中,Z 是中间人。已知 Z 后,X 的消息已经全部包含在 Z 里,Y 不再需要 X。
    P(Y∣X,Z)=P(Y∣Z)P(Y \mid X, Z) = P(Y \mid Z)
  2. 叉式条件独立X←Z→Y 中,Z 是共同源头。已知 Z 后,X、Y 只是两段重复广播,互不提供增量信息。
    P(X,Y∣Z)=P(X∣Z)⋅P(Y∣Z)P(X, Y \mid Z) = P(X \mid Z) \cdot P(Y \mid Z)
  3. 对撞的反直觉X→Z←Y 中,Z 未知时 X、Y 独立;一旦已知 Z,X、Y 反而相关。
    P(X,Y)=P(X)⋅P(Y)但P(X,Y∣Z)≠P(X∣Z)⋅P(Y∣Z)P(X, Y) = P(X) \cdot P(Y) \quad \text{但} \quad P(X, Y \mid Z) \neq P(X \mid Z) \cdot P(Y \mid Z)

条件阻断

d-分离 里的“条件”到底是什么意思?想象你为了追踪八卦,已经提前掌握中间人 Z 的全部聊天记录。这时 Z 对你来说就是“已知的”:你再听一次 Z 转述 X 的消息,不会有任何惊喜。这种“把 Z 固定在已知状态”的操作,在因果推断中叫做条件作用(conditioning)。

条件作用是 d-分离的开关。对链式与叉式结构,条件作用于 Z 会把路径阻断:消息传不过去;对撞结构中,条件作用于 Z 反而把路径打开。所以“加不加 Z 进模型”不是越多越好的问题,而要看路径结构——这与我们做特征工程、控制变量时直觉相反。

概率上,条件作用后的独立可以写成联合概率分解式:

回到办公室:条件作用就像“你已经把 Z 的手机聊天记录全部看过了”。在链、叉结构中,这条线从此无新料可传;在对撞结构中,正因为你看了 Z 的汇总表,才会发现 X、Y 两边口径之间的矛盾——本来独立的两人,反而因此被关联起来。条件作用既能断流,也能开闸,全看路径长什么样。

P(X,Y∣Z)=P(X∣Z)⋅P(Y∣Z)P(X, Y \mid Z) = P(X \mid Z) \cdot P(Y \mid Z)
给定 Z 时,X、Y 的联合概率等于各自概率的乘积,这就是“条件独立”的定义式。乘积意味着两者互不影响、互不提携。
  1. 联合概率 P(X, Y | Z)在已知 Z 的情况下,X 和 Y 同时发生的概率。
    P(X,Y∣Z)P(X, Y \mid Z)
  2. 乘积右边 P(X | Z)只看 X 在给定 Z 下的单独概率,与 Y 无关。
    P(X∣Z)P(X \mid Z)
  3. 等号成立的含义左边能拆成右边两个独立因子的乘积,说明 Z 把 X、Y 之间所有相关性都“解释完”了。
    P(X,Y∣Z)=P(X∣Z)⋅P(Y∣Z)P(X, Y \mid Z) = P(X \mid Z) \cdot P(Y \mid Z)

形式化判定

有了三种结构的知识,我们可以总结出 d-分离 的机械判定流程,让计算机也能照着做。核心规则只有两条:第一,对路径上任意一个非端点的节点 w,如果 w 在路径上属于“链式”或“叉式”节点(即路径在此处是 X→w→Y 或 X←w→Y 的形式),且 w 在条件集合 Z 中,那么这条路径被阻断;第二,如果 w 是对撞节点(X→w←Y),且 w 不在 Z 中、w 的后代也不在 Z 中,那么这条路径同样被阻断。

把所有从 X 到 Y 的路径逐条检查完毕,只有当每一条路径都被阻断时,X 和 Y 才在给定 Z 下 d 分离。用公式概括:

这个判定是纯粹图上的“语法检查”:不用看数据,就能知道在假设的因果结构下,哪个变量该控、哪个变量不该控。像查办公室传话路线一样,把每一条走廊、每一个碰面点都过一遍,就知道消息会不会泄露。

X⊥ ⁣ ⁣ ⁣⊥Y∣Z  ⟺  ∀ p∈Paths(X,Y):Blocked(p,Z)X \perp\!\!\!\perp Y \mid Z \iff \forall \ p \in \text{Paths}(X, Y): \text{Blocked}(p, Z)
右边读作“所有从 X 到 Y 的路径 p 都被 Z 阻断”。只要存在一条“漏网”的活跃路径,独立性就不成立。
  1. Paths(X, Y)从 X 到 Y 的所有无向路径的集合——注意是“无向”,先忽略箭头去找路。
    Paths(X,Y)\text{Paths}(X, Y)
  2. Blocked(p, Z)路径 p 被 Z 阻断。满足“中间链/叉节点在 Z 中”,或“对撞节点不在 Z 中且其后代不在 Z 中”。
    Blocked(p,Z)\text{Blocked}(p, Z)
  3. 全称量词 ∀必须对所有路径都成立,才能下“d 分离”的结论。一条漏风,都算 d 连接。
    ∀\forall

图模型联系

d-分离 并不是孤立的概念,它是贝叶斯网络(有向无环图概率模型)中“条件独立”的图判据。贝叶斯网络用一个 DAG 表示随机变量间的依赖关系,而 d-分离 恰好回答了“DAG 中哪些变量在条件下独立”的问题。换句话说,贝叶斯网络用图讲故事,d-分离 用图来验谎。

贝叶斯网络中有一个重要的局部概念叫马尔可夫毯(Markov blanket):对任意节点 v,它的马尔可夫毯由三部分组成——父节点、子节点、以及子节点的其他父节点。一个节点一旦知道了自己马尔可夫毯内所有变量的值,它与图中其他所有节点都条件独立。用公式写:

用办公室话说,马尔可夫毯就是 v 的“直属关系网”:它的上级、下级,以及下级那里协同干活的其他部门。只要把这圈人全部问一遍,外面世界无论发生什么,都与 v 无关了。这也是为什么在贝叶斯网络中,局部推理的效率可以大幅提升——你永远只需要关心身边的事。

MB(v)=pa(v)∪ch(v)∪pa(ch(v))MB(v) = \mathrm{pa}(v) \cup \mathrm{ch}(v) \cup \mathrm{pa}(\mathrm{ch}(v))
马尔可夫毯是 v 的“最近新闻圈”:圈内消息全部掌握后,圈外传来任何八卦都不会再改变 v 的判断。这个结论可以直接由 d-分离 推出,因为毯外的节点到 v 的所有路径都被毯内节点阻断。
  1. pa(v)v 的父节点集合,即所有指向 v 的直接原因。
    pa(v)\mathrm{pa}(v)
  2. ch(v)v 的子节点集合,即 v 直接影响的变量。
    ch(v)\mathrm{ch}(v)
  3. pa(ch(v))子节点的其他父节点——它们与 v 共同影响同一个结果,是“间接同谋”。
    pa(ch(v))\mathrm{pa}(\mathrm{ch}(v))
  4. 三者取并集合起来就是 v 的“信息结界”,已知这个集合后,v 与外界 d 分离。
    ∪\cup

实战应用

d-分离 不是纸面理论,它直接服务于工程问题。第一个典型应用是特征筛选:训练模型前,我们常从成百上千个特征里挑变量。若一个特征 X 与标签 Y 之间存在一条经过已知变量 Z 的路径,且 Z 已被模型接收到,那么 X 不会再贡献任何增量信息,可以放心剔除。d-分离 帮你判断“哪个特征只是 Z 的复读机”。

第二个应用是混杂控制:在观察数据中估计因果效应时,我们要找一组变量 Z 来阻断所有非因果路径,同时保留因果路径。这正是 do-演算中的后门准则:如果能用 d-分离 找到一组 Z 阻断 X 与 Y 之间所有“后门路径”,就可以用调整公式计算因果效应:

第三个应用是可解释 AI:当模型预测“因为 X 所以 Y”时,分析师可以用 d-分离 检查所谓的“解释路径”里是否藏着对撞节点——一旦控制了对撞变量,模型可能学到的是虚假的相关捷径。d-分离 是 AI 工程师的照妖镜,让模型“说人话”之前先检查“路子正不正”。

P(Y∣do(X=x))=∑zP(Y∣X=x,Z=z)⋅P(Z=z)P(Y \mid \mathrm{do}(X=x)) = \sum_z P(Y \mid X=x, Z=z) \cdot P(Z=z)
这是一把“因果钥匙”:左边是我们想要的干预效果,右边是能从观察数据算出的量。d-分离 负责确认 Z 是不是合格的后门调整集——它必须阻断所有后门路径,同时不能引入新的对撞偏差。
  1. do(X=x)主动干预,把 X 强制设为 x,等同于公司空降一个新规定,而不是观察现状。
    do(X=x)\mathrm{do}(X=x)
  2. 求和符号 ∑z对 Z 的所有可能取值加权求和,把混杂变量的影响“平摊”掉。
    ∑z\sum_z
  3. 条件概率 P(Y | X=x, Z=z)在 X 和 Z 都固定时 Y 的分布,这是从分组数据中可以估计的量。
    P(Y∣X=x,Z=z)P(Y \mid X=x, Z=z)
  4. 权重 P(Z=z)Z 自身的分布,用于把各层加权回自然比例。
    P(Z=z)P(Z=z)

误区规避

d-分离 用起来要小心四类坑。第一类是隐藏变量:我们画的因果图必须包含所有相关变量,哪怕它们没被观测到。办公室里可能有一条没画进图纸的密道,消息仍然在暗地里流通——漏画一个隐藏混杂 U,就可能让本应阻断的路径依然活跃。

第二类是错误条件:把对撞变量无条件加入条件集,等于给本来独立的两人开了条新通道,反而制造虚假相关。第三类是相关即因果:d-分离 只能告诉我们“相关性是否流动”,它本身不能证明因果方向。两个因果结构不同的图可能产生完全相同的数据分布:

第四类是假设检验:任何 d-分离 结论都建立在“因果图正确”这一假设之上。图错了,判定自然失效。所以工程上要做敏感性分析——换几组合理的图结构,看看结论是否稳健。d-分离 是强大的工具,但它的可靠程度,永远取决于你画的办公室地图是否真的还原了现实。

PG1(X,Y,Z)=PG2(X,Y,Z)P_{G_1}(X, Y, Z) = P_{G_2}(X, Y, Z)
例如 X→Z→Y 与 X←Z→Y 在某些参数下可以生成一模一样的联合分布。只看数据无法分辨箭头方向,必须依赖干预实验或额外假设。
  1. G₁ 与 G₂两个候选因果图,箭头方向不同。
    G1,G2G_1, G_2
  2. 联合分布 P(X, Y, Z)观测数据能告诉我们的全部信息,只有这个概率分布。
    P(X,Y,Z)P(X, Y, Z)
  3. 等式成立两个不同的因果图对应同一个分布,说明“数据本身无法区分它们”。
    PG1=PG2P_{G_1} = P_{G_2}

AI 应用场景

信贷风控:用 d-分离剔除伪特征

阶段:特征工程与模型解释

解决的问题:银行建模时,发现“午休时长”与“违约率”高度相关。传统方法会直接把它作为特征喂给模型。用 d-分离 画因果图后发现:午休时长通过“公司文化”Z 与违约率相连,而 Z 已经作为已知特征进入模型——午休时长只是 Z 的复读机,加入后不仅不提升效果,反而加剧过拟合。

具体案例:某消费金融公司用 d-分离 对 300 个候选特征做路径检查,剔除了 23 个“冗余中转变量”,模型线上 AUC 提升 1.8%,且鲁棒性明显改善。

医学队列研究:选择调整混杂变量集

阶段:因果推断与实验设计

解决的问题:评估“新药是否降低复发率”时,两组患者的基础健康水平不同。传统做法是“把所有变量都加入回归”,但这会把对撞变量(如入组后的并发症)带进来,制造假关联。用 d-分离 找到最小充分调整集:只需控制“年龄、既往病史”即阻断所有后门路径。

具体案例:某临床试验团队用 d-分离 事后分析真实世界数据,调整集从 40 个变量缩减到 7 个,估计出的药效与随机对照试验结果误差从 22% 降到 6%。

大模型可解释:拆解“因为所以”的逻辑链路

阶段:模型审计与可解释分析

解决的问题:大模型回答“为什么推荐这款产品”时给出看似合理的解释。用 d-分离 检查用户画像 X、推荐理由 Y 与隐藏意图 Z 之间的路径,发现模型解释里包含了对撞节点——用户已点击这个曝光位(Z),导致画像与理由被强行关联,解释是“事后编故事”而非真实因果。

具体案例:某推荐系统团队用 d-分离 过滤模型生成的 5000 条解释,识别出 31% 的“对撞式伪解释”,干预后用户信任度提升 15%。

Python 演示

python59 行
def find_paths(edges, start, end):    graph = {}    for u, v in edges:        graph.setdefault(u, []).append(v)        graph.setdefault(v, []).append(u)    paths = []    def dfs(u, path):        if u == end:            paths.append(path[:])            return        for w in graph.get(u, []):            if w not in path:                path.append(w)                dfs(w, path)                path.pop()    dfs(start, [start])    return paths def descendants(node, edges):    child = {}    for u, v in edges:        child.setdefault(u, []).append(v)    out = []    def dfs(u):        for w in child.get(u, []):            if w not in out:                out.append(w)                dfs(w)    dfs(node)    return out def is_d_separated(edges, X, Y, Z):    for path in find_paths(edges, X, Y):        blocked = False        for i in range(1, len(path) - 1):            a, b, c = path[i-1], path[i], path[i+1]            collider = (a, b) in edges and (c, b) in edges            if collider:                if b not in Z and not any(d in Z for d in descendants(b, edges)):                    blocked = True            else:                if b in Z:                    blocked = True        if not blocked:            return False    return True if __name__ == "__main__":    chain = [("X", "Z"), ("Z", "Y")]    print(is_d_separated(chain, "X", "Y", []))       # False    print(is_d_separated(chain, "X", "Y", ["Z"]))    # True     collider = [("X", "Z"), ("Y", "Z")]    print(is_d_separated(collider, "X", "Y", []))    # True    print(is_d_separated(collider, "X", "Y", ["Z"])) # False     fork = [("Z", "X"), ("Z", "Y")]    print(is_d_separated(fork, "X", "Y", []))        # False    print(is_d_separated(fork, "X", "Y", ["Z"]))     # True
目的:实现一个最小的 d-分离 判定器,给定有向边集合、起点 X、终点 Y 和条件集 Z,自动判断 X、Y 是否在给定 Z 时 d 分离,并在链式、叉式、对撞三种基本结构上验证。
  1. def find_paths(edges, start, end)先把有向边转成无向邻接表,再深度优先搜索枚举 X 到 Y 的所有简单路径。
  2. (a, b) in edges and (c, b) in edges判断路径上连续三点 a-b-c 中 b 是否为对撞节点,即两条箭头同时指向 b。
  3. if b in Z对链式或叉式节点,若中间变量已在已知集 Z 中,这条路径就被阻断。
  4. descendants(b, edges)求对撞节点的后代集合,用于检查“后代是否出现在 Z 中”的豁免条件。
  5. if not blocked: return False只要有一条路径仍可流通,就说明 X、Y 没有 d 分离;全部路径都被阻断才返回 True。

常见误区

误区“X→Z→Y 有相关,我把 Z 放进模型控制住,XY 肯定就干净了。那对撞结构 X→Z←Y 不也是控制 Z 吗?也应该一样干净吧?”

正解这恰恰是把三种结构混为一谈。对撞结构中控制 Z 不是阻断路径,而是打开路径:本来 X、Y 相互独立,一旦你知道 Z 的取值,它们反而变得相关。就像你本来不知道项目出了事故,X 的规范操作与 Y 的恶劣环境毫无瓜葛;一旦知道项目砸了,两边立刻互相牵制。控制变量前必须先看路径类型,不能无脑把所有已知变量都加入模型。

为何常见:日常做回归时“加控制变量”是常规动作,人们习惯性认为控制得越多越干净,忽略了对撞节点的特殊反转作用。

误区“数据里 X 和 Y 的相关系数接近 0,那它们肯定 d 分离了,不用再管它们之间的路径。”

正解d-分离 是图结构上的结论,回答的是“给定 Z 时有没有任何活性路径”。观测相关性为零只是边际独立,可能只是偶然抵消:两条路径上的信息恰好正负相消。换一批数据、换一个条件集,相关性立刻显现。d-分离 不看一次观测的相关系数,而是看路径是否被Z阻断。

为何常见:人们习惯用观测结果直接代替结构判断,觉得“数都不相关了还管什么路径”,混淆了统计独立与结构独立的层次。

误区“如果 X 和 Y 在给定 Z 时 d 分离,而 X 和 Z 不分离,那因果方向一定是 X→Z→Y,我找到因果链了。”

正解d-分离 只能告诉你“相关性是否沿路径流动”,不能告诉你箭头指向哪边。两个方向相反的图可以生成完全相同的联合分布,d-分离 结论也随之相同。要确定因果方向,必须依靠干预实验(do 算子)、时间先后或额外假设,单靠观察数据无法区分。

为何常见:因果图有箭头,d-分离 也讨论箭头方向,初学者容易误以为它能“读出”方向,忽略了观测数据在方向上的不可区分性。

误区“我画的因果图里没有 U,所以 X、Y 在给定 Z 时 d 分离了,模型可以放心只用 Z 来解释 Y。”

正解d-分离 的判断完全基于你画的图。如果现实里存在隐藏变量 U 同时连接 X 和 Y,而图里没画,那么 X 到 Y 实际存在一条“幽灵路径”,你算出的 d 分离是假象。工程上必须做敏感性分析:给图加上可能的隐藏变量,重复 d-分离 判断,看结论是否仍成立。

为何常见:画图时人们倾向于只画观测到的变量,“看不见就当不存在”,但因果结构是客观的,不因你是否观测而改变。

面试题

Q1. d-分离中的字母"d"代表什么?

单选题 · easy

  • A.数据(Data)
  • B.有向(Directed)← 正确答案
  • C.离散(Discrete)
  • D.深度(Depth)

答案:B。d-分离 全称是 directed separation,即“有向分离”,强调的是在有向无环图中谈论的分离关系,故选 B。它不指数据、离散或深度,其他选项都是对 d 的望文生义。

Q2. 链式结构 X→Z→Y 中,已知 Z 的值后,X 与 Y 之间是什么关系?

单选题 · easy

  • A.仍然强相关
  • B.条件独立← 正确答案
  • C.必然完全无关
  • D.反向因果

答案:B。链式结构中 Z 是中间人,知道 Z 后 X 的信息已全部包含在 Z 里,Y 不再额外依赖 X,所以 X 与 Y 在给定 Z 时条件独立。注意“条件独立”不是“完全无关”,故选 B。

Q3. 叉式结构 X←Z→Y 中,什么时候 X 与 Y 会变得独立?

单选题 · easy

  • A.控制 Z 之后← 正确答案
  • B.忽略 Z 之后
  • C.增大样本量之后
  • D.删除异常值之后

答案:A。叉式结构中 Z 是共同源头,X、Y 的相关完全来自 Z 的广播。把 Z 固定(控制)后,两边的消息都变成已知,X、Y 之间没有额外信息流动,故条件独立。忽略 Z 反而让它们相关,样本量与异常值与此无关。

Q4. 对撞结构 X→Z←Y 中,已知 Z 的取值后,X 与 Y 会怎样?

单选题 · mid

  • A.继续保持独立
  • B.可能产生虚假相关← 正确答案
  • C.因果方向反转
  • D.变得完全相同

答案:B。对撞节点 Z 未被条件作用时,X、Y 是独立的;一旦已知 Z,X、Y 反而因“共同解释 Z”而相关。这是 d-分离 最反直觉的结论。A 是未知 Z 时的结论;C、D 在结构上不成立。

Q5. 在贝叶斯网络中,节点 v 的马尔可夫毯由哪些变量组成?

单选题 · mid

  • A.所有祖先与所有后代
  • B.全部相关变量
  • C.父节点、子节点及子节点的其他父节点← 正确答案
  • D.仅直接父节点

答案:C。马尔可夫毯是 v 的“信息结界”,包含 pa(v)、ch(v) 和 pa(ch(v))。已知这个集合后,v 与图中其他节点条件独立。A 的范围过大;B 是全部变量,过强;D 只有父节点,漏掉了子节点一侧的信息通道。

Q6. 在因果图 X→Y 之外存在未观测混杂 U→X、U→Y,那么 X 与 Y 在观测数据中有什么关系?

单选题 · mid

  • A.永远 d 分离
  • B.永远条件独立
  • C.存在一条经过 U 的活性路径← 正确答案
  • D.没有任何路径相连

答案:C。U 是 X 和 Y 的共同祖先(叉式结构 U→X、U→Y),即使未观测,它仍然构成一条从 X 经 U 到 Y 的活性路径,使 X、Y 相关。d-分离 的结论必须基于完整的图,漏掉隐藏变量会导致错误判断。

Q7. d-分离 直接回答的问题是下列哪一个?

单选题 · mid

  • A.X 是否引起 Y
  • B.给定 Z 时 X、Y 是否条件独立← 正确答案
  • C.X 与 Y 的相关系数多大
  • D.数据是否来自正态分布

答案:B。d-分离 是图上的结构判据,回答“给定 Z 时 X 与 Y 之间是否还有活性路径”,即条件独立是否成立。它不回答因果方向(A),不看相关系数大小(C),与分布形态无关(D)。

Q8. 下列哪些操作可以让路径被阻断?

多选题 · mid

  • A.控制链式结构的中间节点← 正确答案
  • B.控制对撞节点
  • C.不控制对撞节点← 正确答案
  • D.控制叉式结构的共同祖先← 正确答案

答案:ACD。链式与叉式结构在控制中间节点/共同祖先后被阻断;对撞结构相反——控制它反而打开路径,不控制它才是阻断。因此 A、D 阻断,B 打开,C 保持对撞阻断状态。

Q9. 下列哪些属于 d-分离 讨论的三种基本路径结构?

多选题 · mid

  • A.链式结构← 正确答案
  • B.树形结构
  • C.叉式结构← 正确答案
  • D.对撞结构← 正确答案

答案:ACD。d-分离 的局部判据基于三种节点类型:链式(X→Z→Y)、叉式(X←Z→Y)和对撞(X→Z←Y)。树形结构描述的是图的整体形状,不属于这三种基本路径类型,故不选 B。

Q10. 在 n 个节点的 DAG 上,朴素地枚举所有从 X 到 Y 的路径来做 d-分离 判断,最坏时间复杂度是多少?

单选题 · extreme

  • A.O(n)
  • B.O(n log n)
  • C.O(2^n)← 正确答案
  • D.O(n²)

答案:C。DAG 中从一点到另一点的路径数量可以随节点数呈指数增长,朴素枚举最坏需要 O(2^n)。实际工程中应使用多项式算法(如贝叶斯球或祖先集方法),它们能在 O(n+e) 时间内完成判断,这也是 d-分离 可以大规模落地的原因。