D-分离#

测试有向无环图 (DAG) 中 D-分离的算法。

D-分离是用于测试可以使用有向无环图 (DAG) 分解的概率分布中的条件独立性的测试。它是一种纯粹的图形测试,使用基础图而不涉及实际的分布参数。有关形式定义,请参阅[1]

该实现基于[2]中提出的概念简单的线性时间算法。有关其他几种算法,请参阅[3][4]

NetworkX 中的功能接口包含三个函数

D-分隔集#

在这里,我们简要概述了 D-分离及与其理解相关的概念

D-分离和 D-连接的概念与路径是开放还是阻塞有关。

  • “路径”是按顺序由边连接的节点序列。与大多数图论分析不同,边的方向被忽略。因此,路径可以被视为图的无向版本上的传统路径。

  • “候选 D-分隔集” z 是一个节点集合,被认为是可能阻塞两个指定节点集合 xy 之间所有路径的集合。我们将候选 D-分隔集中的每个节点称为“已知”。

  • 路径上的“碰撞点”(collider)节点是指其在路径上的两个相邻节点的后继节点。也就是说,如果路径上的边的方向看起来像 ... u -> c <- v ...,则 c 是一个碰撞点。

  • 如果碰撞点节点或其任何后代节点是“已知”的,则该碰撞点称为“开放碰撞点”。否则,它是“阻塞碰撞点”。

  • 任何路径都可以通过两种方式“阻塞”。如果路径包含一个不是碰撞点的“已知”节点,则该路径被阻塞。此外,如果路径包含一个不是“已知”节点的碰撞点,则该路径也被阻塞。

  • 如果路径未被阻塞,则该路径是“开放的”。也就是说,如果路径中的每个节点要么是开放碰撞点,要么不是“已知”的,则路径是开放的。换句话说,路径中每一个“已知”的节点都是碰撞点,并且每一个碰撞点都是开放的(包含一个“已知”的后代,包括自身)。“开放路径”的概念旨在证明给定预设知识(“已知”节点)下两个节点之间存在概率上的条件依赖性。

  • 如果节点集 z 阻塞了 x 中的节点与 y 中的节点之间的所有路径,则称集合 xyz “D-分离”。也就是说,如果从 x 中的任何节点到 y 中的任何节点都没有开放路径,则称它们被 D-分离。这样的集合 zxy 的一个“D-分隔集”。

  • “最小 D-分隔集”是指一个 D-分隔集 z,从中移除任何节点或节点子集后,它就不再是 D-分隔集。

D-分隔集阻塞了 xy 之间的某些路径,但可能开放其他路径。如果 D-分隔集中的节点不是碰撞点,它们会阻塞路径。但是,如果碰撞点或其后代节点在 D-分隔集中,则这些碰撞点是开放的,允许路径通过该碰撞点。

D-分离的例子说明#

如果从节点 uv 存在一条未被阻塞的路径,则称节点对 uv 是 D-连接的。这意味着从 uv 存在一条开放路径。

例如,如果 D-分隔集是空集,则 uv 之间的以下路径是开放的

  • u <- n -> v

  • u -> w -> … -> n -> v

另一方面,如果 n 在 D-分隔集中,则 n 会阻塞 uv 之间的那些路径。

如果碰撞点及其后代不包含在 D-分隔集中,它们会阻塞路径。当 D-分隔集为空时被阻塞的路径示例是

  • u -> w -> … -> n <- v

节点 n 是此路径中的一个碰撞点,并且不在 D-分隔集中。因此 n 阻塞此路径。然而,如果 n 或其后代被包含在 D-分隔集中,那么通过 n 处的碰撞点(… -> n <- …)的路径是“开放的”。

D-分离关注的是阻塞从 xy 之间所有节点的路径。 xy 之间的 D-分隔集是指所有路径都被阻塞的集合。

D-分离及其在概率中的应用#

D-分离常用于概率因果图模型。D-分离将概率“依赖性”的概念与图中的分离联系起来。如果假设因果马尔可夫条件 [5](每个节点在其父节点已知的情况下,条件独立于其非后代节点),那么 D-分离意味着概率分布中的条件独立性。对称地,D-连接意味着依赖性。

直觉如下。因果图上的边表示哪些节点直接影响其他节点的结果。从 u 到 v 的边意味着事件 u 的结果影响事件 v 结果的概率。当然,知道 u 会改变对 v 的预测。但知道 v 也会改变对 u 的预测。结果是相互依赖的。此外,从 vw 的边意味着 wv 是依赖的,因此 u 可以间接影响 w

在对系统没有任何了解的情况下(候选 D-分隔集为空),因果图 u -> v -> w 使得所有三个节点都可能相互依赖。但是,如果我们知道 v 的结果,那么 uw 结果的条件概率彼此独立。也就是说,一旦我们知道 v 的结果,w 的概率就不再依赖于 u 的结果。这就是当 v 是“已知”的(在候选 D-分隔集中)时,v 阻塞路径背后的思想。

同样的论点适用于边的方向都向左,以及两条箭头都从中点向外发出。路径上的“已知”节点会阻塞非碰撞点的路径,因为这些关系使得条件概率相互独立。

因果边的方向确实会影响依赖性,尤其是在碰撞点的情况下,例如 u -> v <- w。在这种情况下,uw 都影响 v。但它们之间没有直接影响。因此,在不知道任何结果的情况下,uw 是相互独立的。这就是碰撞点阻塞路径背后的思想。但是,如果 v 是已知(观测到)的,则 uw 的条件概率可能变得依赖。这就是伯克森悖论 [6] 的核心。例如,假设 uw 是布尔事件(它们发生或不发生),并且 v 表示“至少一个 uw 发生”的结果。那么,知道 v 为真会使得 uw 的条件概率变得依赖。本质上,知道其中至少一个发生会提高各自的概率。但进一步知道 w 为真(或为假)会将 u 的条件概率改变为原始值或 1。因此,尽管 uw 之间没有因果关系,但 u 的条件概率依赖于 w 的结果。当碰撞点已知时,通过该碰撞点的路径可能会产生依赖性。这就是开放碰撞点不阻塞路径的原因。

此外,即使 v 不是“已知”的,如果它的后代之一是“已知”的,我们可以利用该信息更多地了解 v,这再次使得 uw 可能相互依赖。假设当 v 发生时(即“至少一个 uw 发生”),n 发生的概率要高得多。那么,如果我们知道 n 发生了,那么 v 发生的可能性就更大,这使得 uw 相互依赖的概率增加。这就是为什么如果碰撞点的任何后代是“已知”的,碰撞点不会阻塞路径背后的思想。

当两个节点集合 xy 被集合 z D-分离时,这意味着在给定 z 中节点结果的条件下,x 中节点结果的概率独立于 y 中节点结果的概率,反之亦然。

示例#

一个包含 5 个观测状态和 5 个隐藏状态的隐马尔可夫模型,其中隐藏状态存在因果关系形成路径,从而得到以下因果网络。我们检查路径上的早期状态是否被中间隐藏状态的 D-分隔集与路径上的晚期状态分离。因此,如果我们以中间隐藏状态为条件,早期状态的概率独立于晚期状态的结果。

>>> G = nx.DiGraph()
>>> G.add_edges_from(
...     [
...         ("H1", "H2"),
...         ("H2", "H3"),
...         ("H3", "H4"),
...         ("H4", "H5"),
...         ("H1", "O1"),
...         ("H2", "O2"),
...         ("H3", "O3"),
...         ("H4", "O4"),
...         ("H5", "O5"),
...     ]
... )
>>> x, y, z = ({"H1", "O1"}, {"H5", "O5"}, {"H3"})
>>> nx.is_d_separator(G, x, y, z)
True
>>> nx.is_minimal_d_separator(G, x, y, z)
True
>>> nx.is_minimal_d_separator(G, x, y, z | {"O3"})
False
>>> z = nx.find_minimal_d_separator(G, x | y, {"O2", "O3", "O4"})
>>> z == {"H2", "H4"}
True

如果不存在最小 D-分隔集,则返回 None

>>> other_z = nx.find_minimal_d_separator(G, x | y, {"H2", "H3"})
>>> other_z is None
True

参考文献#

[1]

Pearl, J. (2009). Causality. Cambridge: Cambridge University Press.

[2]

Darwiche, A. (2009). Modeling and reasoning with Bayesian networks. Cambridge: Cambridge University Press.

[3]

Shachter, Ross D. “Bayes-ball: The rational pastime (for determining irrelevance and requisite information in belief networks and influence diagrams).” In Proceedings of the Fourteenth Conference on Uncertainty in Artificial Intelligence (UAI), (pp. 480–487). 1998.

[4]

Koller, D., & Friedman, N. (2009). Probabilistic graphical models: principles and techniques. The MIT Press.

is_d_separator(G, x, y, z)

返回节点集 xy 是否被 z D-分离。

is_minimal_d_separator(G, x, y, z, *[, ...])

判断 z 是否是 xy 的最小 D-分隔集。

find_minimal_d_separator(G, x, y, *[, ...])

如果可能,返回 xy 之间的最小 D-分隔集。