想象一个庞大的家族:每个人是一个“变量”,家族里的箭头代表“谁把消息/基因传给了谁”。箭头只能从长辈指向晚辈,绝不允许隔代循环——这就是一张有向无环图(DAG)。问题来了:住在家族两头的堂兄 A 和堂妹 C,他们之间的“秘密消息”能不能传达到?如果中间某个亲戚(如 B)刚好被你盯住,消息会不会被截断?如果 B 是个“双方汇聚的孩子”,你观察到他的那一刻,反而会让原本互不相识的两条血脉开始互通消息。 d-分离判据,就是这张家族通讯网上的“电话总机规则”:它告诉你,当你掌握了一组“已知道的人”(条件集 Z)之后,X 和 Y 之间的所有信息通路是否全部被阻断。如果全部阻断,就说 X 与 Y 在给定 Z 下 d-分离,也就是条件独立。这套规则是因果推断、图模型和可解释 AI 的基石。

岗位关联

学会 d-分离,你就掌握了从因果图中读出条件独立性的尺子:在找特征、查混杂、做归因时,能快速判断“这个变量该不该被控制,会不会反而惹出新的依赖”。

目录
  1. 可视化演示
  2. 家族通讯网(DAG 语言入门)
  3. 三种路型(基本结构)
  4. 阻断规则(信息什么时候传不过去)
  5. 判据定义(什么是 d-分离)
  6. 判别算法(怎样系统判断 d-分离)
  7. 实战工具箱(d-分离能做什么)
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

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

家族通讯网(DAG 语言入门)

想象一份家族通讯录:每个人是图里的一个“节点”,一条从 A 指向 B 的箭头,表示“A 的消息会直接传给 B”。如果 A 是 B 的爸爸,B 是 C 的妈妈,那消息就会沿着 A→B→C 这条“链式路线”一路传下去。家族里有一条铁规矩:没有人能成为自己的祖先,否则消息就会在时间上倒流,形成循环。这条铁规矩,就是“有向无环”的含义。

在因果推断中,变量就是家族成员,有向边就是“一个变量对另一个变量的直接因果作用”。d-分离不关心两个变量之间有没有一条“完美的因果路线”,它关心的是:从 X 出发,沿着箭头方向或逆着箭头方向,能不能走到 Y。这样的任意路线叫作“通路(trail)”,哪怕方向不完全一致,也算一条信息通道。

1. 节点集合:\(\mathcal{V}\) 是全部家族成员,对应现实里的随机变量。

V={X1,X2,…,Xn}\mathcal{V}=\{X_1,X_2,\dots,X_n\}

2. 有向边集合:\(\mathcal{E}\subseteq\mathcal{V}\times\mathcal{V}\) 是一组有顺序的“父子对”,箭头方向代表信息传播方向。

E⊆{(A,B)∣A∈V,B∈V}\mathcal{E}\subseteq\{(A,B)\mid A\in\mathcal{V},B\in\mathcal{V}\}

3. 无有向环约束:图中不存在一条路径让某个节点沿着箭头方向回到自己。

∀v∈V: v∉desc⁡(v)\forall v\in\mathcal{V}:\ v\notin \operatorname{desc}(v)

有了这张“家族通讯网”,我们就能把复杂的因果假设画成一张图,然后像查地图一样回答:哪条路通、哪条路不通。

text5 行
$$\mathcal{G}=(\mathcal{V},\mathcal{E}),\quad\mathcal{E}\subseteq\mathcal{V}\times\mathcal{V},\quad\text{无有向环}$$

三种路型(基本结构)

家族里任意两位亲戚之间的消息传播,绕来绕去最后都可以拆成三种基本路型。第一种叫“链式管道”,形状是 \(A\to B\to C\):爷爷把消息传给爸爸,爸爸再传给孙子。第二种叫“分岔共祖”,形状是 \(A\leftarrow B\to C\):B 是 A 和 C 共同的祖先,同一个长辈分别向两个晚辈发消息。第三种叫“碰撞汇合”,形状是 \(A\to B\leftarrow C\):A 和 C 是两个各不相干的长辈,但他们的消息都汇入同一个孩子 B。

三种路型里,前两种看起来都只是“消息路过 B”,但第三种有一个独一无二的性质:两个箭头在 B 处“撞车”。碰撞节点会让原本没有血缘互动的 A 和 C,在 B 被观察时产生一种说不清道不明的关联——就像两个互不相识的家长,因为共同孩子的一个异常表现,突然开始互相猜疑。

任何复杂的 DAG 通路,都是由这三种路型首尾拼接而成的。看懂它们,就掌握了 d-分离的“语法”。

A→B→C,A←B→C,A→B←CA \to B \to C,\qquad A \leftarrow B \to C,\qquad A \to B \leftarrow C
三条公式分别代表链式、分岔和碰撞三种基本结构;它们是 d-分离判据里最重要的“路型基因”。
  1. 链式 \(A\to B\to C\)箭头同向串联,消息会沿着同一方向流过 B。
    A→B→CA \to B \to C
  2. 分岔 \(A\leftarrow B\to C\)B 的箭头同时指向 A 和 C,B 是共同源头。
    A←B→CA \leftarrow B \to C
  3. 碰撞 \(A\to B\leftarrow C\)两个箭头都指向 B,B 是“消息汇聚点”。
    A→B←CA \to B \leftarrow C

阻断规则(信息什么时候传不过去)

现在家族里多了一件事:你“知道”了某些人的信息,也就是对变量做了“条件化”,记作 \(Z\)。“知道”这件事本身,会改变信息通路的开关状态。

对于链式 \(A\to B\to C\):如果你已经知道 B 的动向,A 再传来消息也不会给 C 增加新信息,所以通路被阻断。对于分岔 \(A\leftarrow B\to C\):既然共同祖先 B 的情况已知,A 和 C 之间就不再需要互传消息,通路也被阻断。这两种情况里,B 都是“非碰撞节点”,被 \(Z\) 盯住后,它就成了一个尽职的守门员。

碰撞结构恰恰相反:\(A\to B\leftarrow C\) 在没有观察 B 时,A 和 C 本来互不相通,碰撞节点 B 自动阻断通路;可一旦你观察了 B,或者观察了 B 的某个后代,这条原本安静的路反而被打开。这就是“观察反而开口”的反直觉规则。

“知道得太多”有时比“知道得少”更危险:把碰撞节点拉进条件集,等于亲手打开一扇原本紧闭的门。

p \text{ 被 } \mathcal{Z} \text{ 阻断}\iff\exists v\in p:\(v \text{ 非碰撞} \wedge v\in\mathcal{Z})\ \vee\(v \text{ 碰撞} \wedge v\notin\mathcal{Z} \wedge \operatorname{desc}(v)\cap\mathcal{Z}=\varnothing)
这条规则是 d-分离的总开关:非碰撞节点在条件集里会关上通路;碰撞节点及其后代都不在条件集里时,也会关上通路。
  1. 非碰撞节点被观察路径上某个普通中间节点 \(v\in\mathcal{Z}\),通路关闭。
    v 非碰撞, v∈Z⇒阻断v \text{ 非碰撞},\ v\in\mathcal{Z} \Rightarrow \text{阻断}
  2. 碰撞节点未被观察路径上存在碰撞点 \(v\),但它和它所有后代都不在 \(Z\) 中,通路关闭。
    v 碰撞, v∉Z, desc⁡(v)∩Z=∅⇒阻断v \text{ 碰撞},\ v\notin\mathcal{Z},\ \operatorname{desc}(v)\cap\mathcal{Z}=\varnothing \Rightarrow \text{阻断}
  3. 碰撞节点被观察只要 \(v\in\mathcal{Z}\) 或其某个后代在 \(Z\) 中,通路反而打开。
    v∈Z 或 desc⁡(v)∩Z≠∅⇒开放v\in\mathcal{Z}\ \text{或}\ \operatorname{desc}(v)\cap\mathcal{Z}\neq\varnothing \Rightarrow \text{开放}

判据定义(什么是 d-分离)

把前面的规则拼在一起,就是 d-分离的全貌:给定条件集 \(Z\) 后,如果 X 到 Y 的每一条通路都被阻断,我们就说 X 与 Y 在给定 Z 下 d-分离。这里的“d”代表“有向(directional)”,强调判断过程依赖箭头的方向。

d-分离之所以重要,是因为它连接了“图世界”和“概率世界”。在因果马尔可夫性质下,图上的 d-分离可以推出概率上的条件独立:

\[

X \perp\!\!\!\perp_{\mathcal{G}} Y \mid \mathcal{Z}

\ \Longrightarrow\

P(X,Y\mid \mathcal{Z})=P(X\mid \mathcal{Z})\,P(Y\mid \mathcal{Z})

\]

也就是说,当 Z 把所有信息通道都堵死后,知道 Y 不会让 X 的概率分布产生任何额外变化,X 和 Y 就像两个互不通话的独立房间。反过来,图的“马尔可夫等价类”告诉我们:链式 \(A\to B\to C\) 和分岔 \(A\leftarrow B\to C\) 可能编码同样的条件独立关系,不能单靠数据区分谁是因谁是果。

dsepG(X,Y∣Z)  ⟺  ∀p∈PXY: p 被 Z 阻断dsep_{\mathcal{G}}(X,Y\mid \mathcal{Z})\iff\forall p\in\mathcal{P}_{XY}:\ p \text{ 被 } \mathcal{Z} \text{ 阻断}
这不是一个“差不多”的直觉,而是一个全称判断:所有可能的消息小路都必须被堵死,缺一条都不叫 d-分离。
  1. 所有通路集合\(\mathcal{P}_{XY}\) 是 X 到 Y 的全部无向通路。
    PXY={p∣p 是 X 到 Y 的通路}\mathcal{P}_{XY}=\{p \mid p \text{ 是 }X\text{ 到 }Y\text{ 的通路}\}
  2. 每条路都被阻断对集合里的任意一条通路 p,都必须满足上面的阻断规则。
    ∀p∈PXY: p blocked\forall p\in\mathcal{P}_{XY}:\ p \text{ blocked}
  3. d-分离结论全部阻断,才写作 X 与 Y 在 Z 条件下 d-分离。
    dsepG(X,Y∣Z)dsep_{\mathcal{G}}(X,Y\mid \mathcal{Z})

判别算法(怎样系统判断 d-分离)

手工作业时,你可以用“贝叶斯球”算法来理解:从 X 处抛出一颗球,让它沿着通路滚动。遇到非碰撞节点时,如果该节点不在 Z 中,球能穿过;如果它在 Z 中,球被挡住。遇到碰撞节点时,规则反过来:如果碰撞节点本身或它的后代在 Z 中,球才能通过;否则球永远撞墙。

正式做法是先枚举 X 到 Y 的所有简单通路,再逐条检查。为了快速判断碰撞节点是否因为“观察了后代”而打开,可以提前计算所有 Z 中节点的祖先集合。一个路径“开放”的数学条件如下:

最后,只要开放路径集合为空,就说明 d-分离成立;只要还剩一条开放路径,结论就是不成立。

p∈Popen(X,Y∣Z)  ⟺  ∀ 碰撞节点 c∈p: c∈Z∪Anc⁡(Z) ∧forall 非碰撞节点 n∈p: n∉Zp\in\mathcal{P}_{open}(X,Y\mid Z)\iff\forall \text{ 碰撞节点 } c\in p:\ c\in\mathcal{Z}\cup\operatorname{Anc}(\mathcal{Z})\ \wedge\\forall \text{ 非碰撞节点 } n\in p:\ n\notin\mathcal{Z}
dsep(X,Y∣Z)  ⟺  Popen(X,Y∣Z)=∅dsep(X,Y\mid Z)\iff \mathcal{P}_{open}(X,Y\mid Z)=\varnothing
这个算法把“家族八卦能否传到”变成了一个可编程的图搜索问题,也是 Python 实现 d-分离判断的基础。
  1. 祖先集合标记\(\operatorname{Anc}(\mathcal{Z})\) 是 Z 中所有节点的祖先集合,用来判断碰撞节点是否被“后代观察”间接打开。
    Anc⁡(Z)=⋃z∈ZAnc⁡(z)\operatorname{Anc}(\mathcal{Z})=\bigcup_{z\in\mathcal{Z}}\operatorname{Anc}(z)
  2. 碰撞节点条件路径上每个碰撞点 c 都必须满足 \(c\in\mathcal{Z}\cup\operatorname{Anc}(\mathcal{Z})\)。
    ∀c∈p: c∈Z∪Anc⁡(Z)\forall c\in p:\ c\in\mathcal{Z}\cup\operatorname{Anc}(\mathcal{Z})
  3. 非碰撞节点条件路径上每个非碰撞点 n 都不能出现在 Z 中。
    ∀n∈p: n∉Z\forall n\in p:\ n\notin\mathcal{Z}

实战工具箱(d-分离能做什么)

d-分离不是书斋里的理论玩具,而是工程实践里的“因果听诊器”。第一个用途是混杂因子侦测:如果 X 与 Y 之间存在一条后门路径 \(X\leftarrow C\to Y\),那么 X 和 Y 的观察相关性会被 C 污染。用 d-分离检查 C 是否阻断了所有后门路径,就能决定要不要把 C 放进调节集。

第二个用途是条件独立性检验:如果我们从领域知识画出一张 DAG,d-分离会给出“X 与 Y 在给定 Z 下应当独立”的预测。把这个预测拿到数据里检验,能帮助我们发现图结构是否画错、模型是否漏掉了关键变量。第三个用途是因果特征选择:在大量特征里,优先保留那些与目标变量在给定候选特征后仍然“不 d-分离”的变量,同时剔除只在条件集下才独立的冗余变量。

不过,d-分离给出的结论有一个重要前提——忠实性。在忠实性假设下,图上的 d-分离和概率分布中的条件独立完全等价:

真实数据中可能出现“两段因果路径恰好抵消”的极端情况,让变量看起来独立但图上并不 d-分离。所以使用时,永远要保持对忠实性假设的警觉。

X \perp\!\!\!\perp_{\mathcal{G}} Y\mid Z\iffX \perp\!\!\!\perp_{\mathcal{P}} Y\mid Z
左半边是图世界的判断,右半边是数据世界的判断。两者一致时,我们才敢放心用 d-分离指导数据分析。
  1. 马尔可夫方向由图上 d-分离推出概率条件独立,是因果马尔可夫性质。
    X⊥ ⁣ ⁣ ⁣⊥GY∣Z⇒X⊥ ⁣ ⁣ ⁣⊥PY∣ZX \perp\!\!\!\perp_{\mathcal{G}} Y\mid Z \Rightarrow X \perp\!\!\!\perp_{\mathcal{P}} Y\mid Z
  2. 忠实性方向由概率条件独立推出图上 d-分离,需要假设没有参数巧合抵消。
    X⊥ ⁣ ⁣ ⁣⊥PY∣Z⇒X⊥ ⁣ ⁣ ⁣⊥GY∣ZX \perp\!\!\!\perp_{\mathcal{P}} Y\mid Z \Rightarrow X \perp\!\!\!\perp_{\mathcal{G}} Y\mid Z
  3. 等价结论两个方向同时成立时,图结构才是数据的“忠实”编码。
      ⟺  \iff

AI 应用场景

混杂因子侦测与调节集选择

阶段:数据探索与特征工程

解决的问题:传统相关性分析无法区分相关与因果,建模时容易把混杂变量当成普通特征,或漏掉必须控制的变量。d-分离可以快速检查某一候选变量集合是否阻断了所有后门路径。

具体案例:在电商场景评估“会员等级 → 购买金额”的因果效应时,领域专家画出 DAG,发现“历史消费水平”同时影响会员等级和购买金额。用 d-分离确认:如果不控制历史消费,后门路径 \(会员等级\leftarrow 历史消费\to 购买金额\) 开放;加入历史消费到 Z 后,该后门路径被阻断。

可解释 AI 的因果诊断

阶段:模型评估与解释

解决的问题:深度学习模型经常学到虚假相关,但普通特征重要性无法区分“真的因果证据”与“表象关联”。用 DAG 和 d-分离可以检验模型输入输出关系是否符合领域因果结构。

具体案例:在医疗 AI 中,医生认为“药物 X”与“是否康复 Y”在给定“病情严重度 Z”后应当条件独立,因为 X 不直接影响 Y。数据科学家用 d-分离检查图发现,Z 的确阻断了所有路径,于是可以进一步对比模型是否错误地依赖了这条不该存在的关联。

因果特征选择

阶段:特征工程与模型简化

解决的问题:高维特征里真正有因果价值的变量往往很少,盲目按相关系数筛选会留下大量混杂相关。d-分离可以帮助判断:给定当前特征集后,某个候选特征与目标是否已经独立;若独立,则可安全移除。

具体案例:用户流失预测中,特征“客服投诉次数”与“续费与否”通过“服务质量”产生关联。给定服务质量后,投诉次数与续费结果被 d-分离,说明它对预测没有额外增量信息,可以剔除,从而减少模型复杂度。

Python 演示

python83 行
def descendants(start, children):    seen = set()    stack = [start]    while stack:        node = stack.pop()        for nxt in children.get(node, []):            if nxt not in seen:                seen.add(nxt)                stack.append(nxt)    return seen  def build_index(adj):    children = {n: set() for n in adj}    parents = {n: set() for n in adj}    for p, cs in adj.items():        for c in cs:            children[p].add(c)            parents[c].add(p)    return children, parents  def all_paths(start, end, visited, skeleton):    if start == end:        return [[start]]    result = []    for nxt in skeleton[start]:        if nxt not in visited:            visited.add(nxt)            for p in all_paths(nxt, end, visited, skeleton):                result.append([start] + p)            visited.remove(nxt)    return result  def is_collider(path, i, children):    pv, node, nx = path[i - 1], path[i], path[i + 1]    return node in children.get(pv, set()) and node in children.get(nx, set())  def path_is_open(path, Z, children, desc_cache):    for i in range(1, len(path) - 1):        v = path[i]        if is_collider(path, i, children):            if v not in Z and not (desc_cache[v] & Z):                return False        else:            if v in Z:                return False    return True  def is_d_separated(adj, X, Y, Z):    children, parents = build_index(adj)    skeleton = {n: set(children[n]) | set(parents[n]) for n in adj}    desc_cache = {n: descendants(n, children) for n in adj}    visited = {X}    paths = all_paths(X, Y, visited, skeleton)    return not any(path_is_open(p, Z, children, desc_cache) for p in paths)  def main():    # A -> B -> C, B -> D, C -> E, D -> E    adj = {        "A": ["B"],        "B": ["C", "D"],        "C": ["E"],        "D": ["E"],        "E": []    }    tests = [        (set(), False),        ({"B"}, True),        ({"E"}, False),        ({"B", "E"}, False)    ]    for Z, expected in tests:        got = is_d_separated(adj, "C", "D", Z)        print("Z =", sorted(Z), "d-separated =", got, "expected =", expected)  if __name__ == "__main__":    main()
目的:给定一个 DAG 的邻接表和条件集合 Z,判断 X 与 Y 是否 d-分离。
  1. children, parents = build_index(adj)同时记录每个节点的父节点和子节点,为后续识别碰撞节点做准备。
  2. skeleton = {n: set(children[n]) | set(parents[n]) for n in adj}去掉方向得到无向骨架,用于枚举 X 到 Y 的所有通路。
  3. paths = all_paths(X, Y, visited, skeleton)枚举家族通讯网中从 X 到 Y 的所有简单通路。
  4. if is_collider(path, i, children)检查路径中间节点是不是“两个箭头同时指向它”的碰撞节点。
  5. if v not in Z and not (desc_cache[v] & Z)碰撞节点既不在 Z 中、后代也不在 Z 中时,该路径被阻断。
  6. return not any(path_is_open(p, Z, children, desc_cache) for p in paths)只要存在一条开放路径,X 与 Y 就不 d-分离。

常见误区

误区既然控制变量能消除混杂,那把越多变量放进 Z 越好,条件集越大模型越可靠。

正解Z 不是越多越好。控制非碰撞节点会阻断通路,控制碰撞节点反而会打开通路。就像一个房间里原本没有对话,但你突然喊出某个“共同孩子”的名字,两个原本安静的家长反而开始互相猜疑。

为何常见:人们把“控制变量”简单理解为“多观察总是好的”,忽略了碰撞节点会制造新的依赖。

误区图中 X 到 Y 没有直接箭头,说明 X 不影响 Y,没必要考虑它们的关系。

正解X 可以通过链式路径 \(X\to A\to Y\) 间接影响 Y。d-分离关心的是所有通路是否被阻断,而不是只看有没有直接边。

为何常见:把 DAG 误认成“直线流程图”,只盯着相邻节点,忽略了多跳传播。

误区图上 d-分离了,那数据里 X 和 Y 的相关系数就一定等于 0。

正解因果马尔可夫性质保证 d-分离推出条件独立,但条件独立不是简单的不相关,且反向需要忠实性假设。实际检验时要选择正确的条件独立性检验方法,并考虑样本量影响。

为何常见:混淆了“图世界”和“概率世界”,把定理的适用范围看得太宽。

误区只要找到一条被 Z 阻断的路径,就能说 X 和 Y 独立。

正解d-分离要求所有路径都被阻断。只要还有一条开放的通路,信息和依赖依然可以绕路传递。

为何常见:检查时只看最明显的一条路径,没有枚举全部通路。

面试题

Q1. 在有向无环图 DAG 中,有向边表示什么?

单选题 · easy

  • A.变量之间的血缘亲疏
  • B.直接因果作用的方向← 正确答案
  • C.变量总是同时变化
  • D.变量间的相关系数

答案:B。DAG 中的有向边代表“一个变量对另一个变量的直接因果作用”,相当于家族里“长辈传给晚辈”的箭头。血缘亲疏、同步变化和相关系数都是数据描述,不是图上的因果含义。

Q2. 链式结构 A→B→C 中,在给定 B 的条件下,A 与 C 的关系是?

单选题 · easy

  • A.独立,因为通路被阻断← 正确答案
  • B.不独立,因为有直接因果
  • C.独立,因为路径存在
  • D.不独立,因为观察了 B

答案:A。链式结构中,B 是非碰撞节点。给定 B 后,A 通过 B 传给 C 的额外信息被截断,所以 A 与 C 条件独立。

Q3. 碰撞结构 A→B←C 中,不给定 B 时,A 与 C 之间的关系如何?

单选题 · mid

  • A.路径阻断,d-分离成立← 正确答案
  • B.路径打开,A 与 C 相关
  • C.路径阻断,因为没有共同祖先
  • D.路径打开,因为箭头指向 B

答案:A。碰撞节点 B 没有被观察且后代也没被观察时,通路是阻断的,所以 A 与 C 在不给定 B 时满足 d-分离。碰撞结构是唯一“默认关闭、观察后打开”的特殊结构。

Q4. 在给定碰撞节点 B 之后,原先的 A→B←C 路径会怎样?

单选题 · mid

  • A.仍然阻断,B 吸收所有信息
  • B.仍然阻断,B 与 A、C 矛盾
  • C.通路打开,A 与 C 可能出现依赖← 正确答案
  • D.通路消失,图中边被删除

答案:C。碰撞节点被条件化后,原本关闭的路径会被打开,称为“观察打开”效应。图中边不会改变,改变的是信息能否通过这条路径。

Q5. 若 X 与 Y 在给定 Z 下 d-分离,说明什么?

单选题 · hard

  • A.X 到 Y 的所有路径均被 Z 阻断← 正确答案
  • B.X 到 Y 至少一条路径被阻断
  • C.X 到 Y 所有路径均被打开
  • D.X 到 Y 至少一条路径被打开

答案:A。d-分离是一个全称判断:只有 X 到 Y 的每一条通路都被 Z 阻断时才成立。只要还有一条开放路径,就不能称 d-分离。

Q6. 以下哪些情况会使一条路径被 Z 阻断?

多选题 · mid

  • A.路径上的非碰撞节点属于 Z← 正确答案
  • B.碰撞节点不在 Z 且后代不在 Z← 正确答案
  • C.路径上的碰撞节点属于 Z
  • D.路径上的非碰撞节点不属于 Z

答案:AB。非碰撞节点在 Z 中会阻断;碰撞节点及其后代都不在 Z 中也会阻断。碰撞节点在 Z 中反而打开路径,所以 C 错误;非碰撞节点不在 Z 中会让路径保持开放,所以 D 错误。

Q7. 关于 d-分离与条件独立,正确的是?

多选题 · hard

  • A.d-分离蕴含条件独立← 正确答案
  • B.条件独立一定蕴含 d-分离
  • C.忠实性假设下二者互相等价← 正确答案
  • D.d-分离与概率分布无关

答案:AC。因果马尔可夫性质保证 d-分离推出条件独立,所以 A 正确;反向需要忠实性,所以 B 错误、C 正确。d-分离虽然定义在图结构上,但通过马尔可夫性质与概率分布紧密相连,D 错误。

Q8. 分岔结构 A←B→C 中,要阻断 A 与 C 的路径应?

单选题 · easy

  • A.不观察任何中间节点
  • B.观察共同的祖先 B← 正确答案
  • C.观察 A 的后代节点
  • D.观察 C 的后代节点

答案:B。分岔结构里的 B 是非碰撞节点。给定共同祖先 B 后,A 和 C 之间不再有额外信息流动,路径被阻断。

Q9. 在贝叶斯球算法中,以下规则正确的是?

多选题 · hard

  • A.非碰撞节点在 Z 中,球不能通过← 正确答案
  • B.碰撞节点或其子孙在 Z 中,球能通过← 正确答案
  • C.碰撞节点不在 Z 中,球也能通过
  • D.非碰撞节点不在 Z 中,球能通过← 正确答案

答案:ABD。贝叶斯球算法是 d-分离的运算法则:非碰撞节点在 Z 中挡球,不在 Z 中放行;碰撞节点或其子孙在 Z 中才放行,不在 Z 中则挡球。因此 C 错误。

Q10. 当数据中的参数巧合抵消,使得概率独立但图上并不 d-分离时,说明模型?

单选题 · extreme

  • A.违反有向无环图假设
  • B.违反忠实性条件← 正确答案
  • C.违反马尔可夫性质
  • D.违反 d-分离定义

答案:B。参数恰好抵消产生的“意外独立”是对忠实性条件的违背。马尔可夫性质仍然成立,因为 d-分离推出独立的方向没有反例;忠实性才要求独立反过来也能由 d-分离解释。