想象你是一座百年老宅的族谱保管人。这本族谱记录着每一代人的相貌特征:太爷爷的卷发传给了爷爷,爷爷的卷发传给了父亲,父亲的卷发又传给了你家的新生儿。有一天你想预测这个新生儿会不会继承卷发,你会先问谁?当然是父母。奇怪的事情来了——如果你已经知道了父母的长相,再去翻祖宗十八代的照片,对预测结果几乎没有任何额外帮助。因为祖辈的信息早已完整地“浓缩”在父母那一层,再通过父母传递给下一代。这种“中间层屏蔽远端影响”的规律,就是有向无环图(DAG)中Markov性质的核心思想。 在AI领域,模型常被当作黑箱:输入一堆特征,输出一个预测,中间发生了什么没人说得清。而有向无环图与Markov性质给了我们一把“解剖刀”——把错综复杂的变量关系画成一张清晰的因果图谱,再借助“给定父节点后,节点与非后代条件独立”这条简洁规则,从概率依赖的迷宫中理出一条清晰的因果主线。它不仅是因果推断的基石,更是可解释AI从“拟合相关”走向“理解因果”的关键一跃。

岗位关联

掌握DAG与Markov性质,是AI从业者从“看见数据相关”跃迁到“理解因果机制”的分水岭,也是构建可解释、可干预的智能系统的基础能力。

目录
  1. 可视化演示
  2. DAG基本概念
  3. Markov性质
  4. d-分离准则
  5. 贝叶斯网络
  6. 因果推断
  7. 应用场景
  8. 实践要点
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

三步展示DAG Markov性质:因果马尔可夫条件与条件独立、d-分离三种路径模式、因子分解与忠实性假设。

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

因果马尔可夫条件 每个变量给定父节点后独立于非后代 X1为根节点无父节点 P(X|PA)刻画局部因果机制 X⊥ND(X)|PA(X) 马尔可夫条件连接DAG结构与概率分布的桥梁。

DAG基本概念

要读懂Markov性质,得先学会“画族谱”。假设你是家族史官,要把几代人的关系画成一张图:父亲应该有一条箭头指向儿子,表示“直接遗传影响”。这张图有一个铁律——绝不会出现“某人是自己的祖先”这种时空悖论,否则家族就乱套了。这种“只向前看、绝不回头”的图谱,就是有向无环图(Directed Acyclic Graph,简称DAG)。它的名字已经透露了全部秘密:有方向(Directed)、没有环(Acyclic)。

在AI术语中,DAG里的每个节点(Node,也叫顶点)代表一个变量——可以是身高、基因、天气,也可以是用户的点击行为;每条有向边(Edge)代表“直接影响”的方向。由此生出一套家族术语:如果有一条边从u指向v,那么u是v的父节点(Parent),v是u的子节点(Child);顺着箭头一路向上能到达的节点叫祖先(Ancestor),一路向下能到达的叫后代(Descendant)。这些称呼不是比喻,而是DAG的正式术语——巧合的是,它们本来就是家族词汇。

形式化地,一个DAG可以写成一个二元组:

回到族谱的比喻:DAG就是一本装订精良、逻辑严密的家族族谱。每条边都是“隔代不算,直系有据”的血缘线。明白了这张图的骨架,下一步就是理解它表面之下最深刻的规律——Markov性质。

G=(V,E),E⊆{(u,v)∣u,v∈V,u≠v}G = (V, E), \quad E \subseteq \{(u, v) \mid u, v \in V, u \neq v\}
图中的每个节点来自集合V,每条有向边来自集合E,且不存在一条路径从某节点出发又转回该节点。
  1. G = (V, E)一个图G由两个部分构成——节点集合V和边集合E
    G=(V,E)G = (V, E)
  2. E ⊆ 集合边集合E是V中所有可能的有序对的子集,只保留真实存在的关系
    E⊆{(u,v)∣u,v∈V}E \subseteq \{(u, v) \mid u, v \in V\}
  3. (u, v)一个有序对表示一条从u指向v的有向边,方向意味着影响不是对称的
    (u,v)(u, v)
  4. u ≠ v不允许出现自环——这是“无环”的最低要求
    u≠vu \neq v

Markov性质

族谱里藏着一个神秘的规律:孩子只直接继承父母的基因。一旦你知道了父母的身高,再去打听祖父母、叔伯姑姨的身高,对预测这个孩子的身高几乎没有额外帮助。祖辈的信息已经完完整整地“写入”了父母的基因里,再由父母传给孩子。换句话说,父母这个“中间层”把远端祖先的影响完全屏蔽了。

这个规律在DAG中被称为Markov性质(马尔可夫性质)。它有局部和全局两种表述。局部Markov性质是最常用的形式:给定节点X的所有父节点Pa(X),X与所有“非后代节点”条件独立。什么叫条件独立?直观地说,就是“一旦我知道了父节点的取值,其他非后代节点(比如祖辈、旁支)的信息对我来说就是多余的噪音”。上面这个性质写成数学公式:

Markov性质还有一个“总纲”式的推论——全局Markov性质:如果两个变量集合X和Y在给定第三个集合Z时被d-分离(下节会讲),那么X和Y条件独立。更重要的是,Markov性质让联合分布可以被“拆解”成局部的条件概率乘积:

这个分解公式是贝叶斯网络的基石,也是Markov性质最漂亮的“果实”。在族谱的世界里,这意味着:整个家族的联合长相分布,可以拆成一代代人“在父母条件下”的局部规律。下节要讲的d-分离,则回答了另一个问题:信息在族谱里什么时候能传、什么时候会被墙挡住。

Xi⊥NonDesc(Xi)∣Pa(Xi)X_i \perp \mathrm{NonDesc}(X_i) \mid \mathrm{Pa}(X_i)
X_i在给定其父节点后,与所有非后代节点条件独立——父节点“屏蔽”了远端的间接影响。
  1. P(X_1, ……, X_n)所有变量的联合概率分布——全家族同时取某组长相的概率
    P(X1,X2,…,Xn)P(X_1, X_2, \ldots, X_n)
  2. ∏_{i=1}^{n}连乘符号,从第1个节点乘到第n个节点
    ∏i=1n\prod_{i=1}^{n}
  3. P(X_i | Pa(X_i))每个节点在其父节点条件下的条件概率——每个孩子只按父母的特征“掷骰子”
    P(Xi∣Pa(Xi))P(X_i \mid \mathrm{Pa}(X_i))

d-分离准则

家族聚餐时小道消息的传播是有规律的。信息从A传给B再传给C,这是链式结构;爸妈的零花钱分别给了两个孩子,这是分叉结构;两个孩子分别向爷爷汇报消息,这是汇合结构。这三种“路口”决定了信息能否在族谱中通行。d-分离(d-separation)就是用图论语言描述“信息通道被切断”的精确准则。

先看链式结构:A→B→C。A的信息经过B传到C。如果B被观察(相当于我们知道了B的取值),那么A的额外信息对预测C不再有价值——通道被B阻塞了。再看分叉结构:A←B→C。B是A和C的共同原因。如同“父母的身高同时影响两个孩子”——一旦已知父母B,兄弟姐妹A和C之间的相似性就完全由B解释了,A和C条件独立。最后是汇合结构:A→B←C。这是最反直觉的:两个独立的原因共同产生一个结果。A和C在无条件下是独立的(两个原因本身不相关),但一旦观察到了结果B,A和C反而“变相关”了——比如两人都是爷爷的报告来源,发现爷爷知道了某件事,则A和C中至少有一人告密,知道A没告密就提升了C告密的概率。这称为解释消除(explaining away),B在这里叫做碰撞器(Collider)。

对于汇合结构,情况完全反转:

d-分离告诉我们:如果给定变量集合Z后,图中所有连接X和Y的“活动路径”都被阻断,那么X和Y在给定Z下d-分离,必然条件独立。这正是判断Markov性质是否成立的一套“交通规则”。有了这套规则,我们就能把DAG变成一个可以做概率计算的机器——贝叶斯网络。

链式 X→Z→Y,分叉 X←Z→Y:X⊥Y∣Z\text{链式 } X \to Z \to Y, \quad \text{分叉 } X \leftarrow Z \to Y: \quad X \perp Y \mid Z
在链式和分叉结构中,给定中间节点Z后,X与Y条件独立。
  1. 汇合 X→Z←Y两条边“撞”进同一个节点Z,Z是碰撞器
    X→Z←YX \to Z \leftarrow Y
  2. X ⊥ Y(无条件)在不知道Z时,X和Y相互独立——两个原因互不相干
    X⊥YX \perp Y
  3. X ⊥̸ Y | Z一旦观察Z,X和Y变得相关——解释消除效应启动
    X⊥̸Y∣ZX \not\perp Y \mid Z

贝叶斯网络

如果族谱只记录关系而不记录概率,那它只是一幅静态的家谱。贝叶斯网络(Bayesian Network)给每个“家族成员”配了一张“行为概率表”——比如某种特征(卷发)的出现概率,取决于其父节点的特征组合。这样,族谱就从“图”升级成了“概率模型”。

具体来说,贝叶斯网络 = 一个DAG + 每个节点一张条件概率表(CPT, Conditional Probability Table)。DAG负责编码“谁影响谁”的结构,CPT负责编码“影响有多强”的数字。二者合在一起,就能通过上节介绍过的分解公式,精确计算出任意联合事件的概率。

以最简单的链式网络A→B→C为例:

贝叶斯网络的强大之处在于:它把“全宇宙联合分布”的巨大表格压缩成了一组局部小表格。要做推断(比如看到C的取值,反推A的后验概率),只需要沿着图的结构做乘法和求和。而且,网络本身就是可解释的——任意两个节点的依赖关系都能从图中读出来。然而,贝叶斯网络描述的是“观察世界”的规则;当我们想改变世界时,需要更强的工具——do算子。

P(A,B,C)=P(A)⋅P(B∣A)⋅P(C∣B)P(A, B, C) = P(A) \cdot P(B \mid A) \cdot P(C \mid B)
链式结构A→B→C的联合分布,被分解为三个条件概率的乘积,中间不出现A对C的直接项。
  1. P(A, B, C)A、B、C同时取某组值的联合概率
    P(A,B,C)P(A, B, C)
  2. P(A)根节点A的边缘概率——没有父节点,只写它自己的概率
    P(A)P(A)
  3. P(B | A)B在给定A的条件概率——B只“听”父节点A的
    P(B∣A)P(B \mid A)
  4. P(C | B)C只依赖B,公式里根本没有A——这正是Markov性质在分布上的体现
    P(C∣B)P(C \mid B)

因果推断

观察族谱只能“看”,不能“动”。如果你想知道“让全家族的人都卷发,会导致下一代身高更高吗?”光是翻族谱无法回答——因为卷发和身高可能都受同一个祖先基因影响。这时你需要干预:人为地把某个成员的特征改掉,观察后果。在DAG语言中,干预用do算子表示。

do(X=x)与观察X=x有着本质区别。 观察只是“看一眼”X的现有值,而干预是“动手把X设为x”。从图结构上看,do(X=x)会切断所有指向X的边——因为当我们强制设定X时,它的自然原因就不再起作用了。这就好比基因编辑:人为让一个人长出卷发后,他祖先的毛囊基因(原本指向X的边)就被“废掉”了。

如果存在混杂变量Z同时影响X和Y,观察数据中的P(Y|X=x)是混杂的;而因果效应P(Y|do(X=x))则要用后门准则来估计:

回到族谱场景:如果直接比较“卷发的孩子”和“不卷发的孩子”的身高,会看到卷发孩子普遍更高——但这可能因为他们的祖辈本来就有优势基因(混杂)。用后门公式按祖辈基因分层加权后,得到的才是“卷发本身”对身高的真实因果效应。这正是因果推断与普通相关性分析的分水岭。理解了干预,我们就能把Markov性质与DAG真正应用到现实世界的AI系统中。

P(Y∣do(X=x))=∑zP(Y∣X=x,Z=z)⋅P(Z=z)P(Y \mid do(X=x)) = \sum_{z} P(Y \mid X=x, Z=z) \cdot P(Z=z)
通过混杂变量Z的每个取值分层,加权平均得到干预后的因果效应——这是从观察数据中“剥离”混杂影响的核心公式。
  1. do(X=x)干预算子,表示强制将X设为x,同时切断指向X的所有边
    do(X=x)do(X=x)
  2. P(Y | do(X=x))干预后Y的概率分布——这是“如果全世界都这样做”的因果答案
    P(Y∣do(X=x))P(Y \mid do(X=x))
  3. Σ_z对混杂变量Z的所有可能取值求和——相当于按Z的每一层分别统计再汇总
    ∑z\sum_{z}
  4. P(Y | X=x, Z=z)在固定X和Z时的条件概率——每个子层内的相关关系
    P(Y∣X=x,Z=z)P(Y \mid X=x, Z=z)
  5. P(Z=z)Z取该层的概率,作为加权权重——层越大,贡献越多
    P(Z=z)P(Z=z)

应用场景

现在,你已经握着“族谱+Markov性质”这套工具箱,该走向现实世界了。从拆解AI黑箱到辅助医疗决策,DAG与Markov性质正在多个AI领域落地生根。

可解释AI是最大的受益者。深度学习模型是典型的黑箱,但我们可以用DAG对“输入→中间特征→输出”的决策路径建模。利用Markov性质,如果某个中间特征已经充分解释了输出(相当于“父节点”),那么更底层的原始特征就是冗余的——这为特征筛选和模型解释提供了理论依据。医学诊断则把症状、检查结果、疾病画成一张因果图,给定观测到的症状(证据),用贝叶斯网络推断各种疾病的后验概率;而用do算子可以回答“如果用药,治愈率会变成多少”这类干预性问题。推荐系统通过构建“浏览→收藏→购买→复购”的行为因果链,既能预测下一步行为,又能向用户解释“因为你看了相机,所以推荐镜头”。风险识别在金融风控中辨识“收入稳定性→还款能力→违约”的因果链,把真正的风险驱动因素从噪音中剥离出来。

无论哪个场景,最终都要量化“干预带来的改变”。最常用的量化指标是平均因果效应(ATE, Average Treatment Effect):

在族谱语境里,ATE问的是:“如果强行让所有新生儿都变成卷发,他们平均身高会高出多少?” 从应用到工程落地,中间还隔着一段路——在真实数据上画出正确的DAG并算出可靠的参数,需要一套严谨的实践方法论。

ATE=E[Y∣do(X=1)]−E[Y∣do(X=0)]\mathrm{ATE} = E[Y \mid do(X=1)] - E[Y \mid do(X=0)]
平均因果效应 = 所有人接受干预时的期望结果 − 所有人不干预时的期望结果。
  1. ATEAverage Treatment Effect,平均因果效应——干预带来的平均净改变
    ATE\mathrm{ATE}
  2. E[Y | do(X=1)]全体样本都被干预(X=1)时的期望Y——想象“全员用药”的世界
    E[Y∣do(X=1)]E[Y \mid do(X=1)]
  3. E[Y | do(X=0)]全体样本都不干预(X=0)时的期望Y——“全员安慰剂”的世界
    E[Y∣do(X=0)]E[Y \mid do(X=0)]
  4. 两者相减两个平行世界的差距,就是X对Y的纯因果贡献
    E[Y∣do(X=1)]−E[Y∣do(X=0)]E[Y \mid do(X=1)] - E[Y \mid do(X=0)]

实践要点

要画出一张可信赖的“族谱”,光靠拍脑袋不行,得让数据和图结构互相印证。实际工程中通常经历四条路径:结构学习定图、参数估计配概率、验证方法把关、防陷阱避坑。

结构学习是从数据中反推DAG拓扑结构:常用两大类方法——基于约束的方法(对每对变量做条件独立检验,用d-分离规则搭结构)和基于评分的方法(给候选图打分,如BIC分数,搜索得分最高的图)。结构定下来后,参数估计就是给每张条件概率表填数字,最主流的是最大似然估计(MLE):

参数填好后,还要用验证方法把关:在留出集上比较网络的预测对数似然、用条件独立检验(如卡方检验)验证图中声称的独立性是否与数据吻合。最后是常见陷阱:隐藏变量(没有纳入图的共同原因会让Markov性质失真)、数据噪声(小样本下的频率估计偏差大)、以及采样偏差(数据不满足“无偏观测”假设时,后门公式也不灵)。

族谱画好了,数字填上了,验证也通过了——恭喜你,你已经从“只会看相关性的数据分析师”进化成了“能讲因果故事的AI工程师”。

θ^ijk=NijkNij\hat{\theta}_{ijk} = \frac{N_{ijk}}{N_{ij}}
条件概率θ的最大似然估计 = 满足条件的样本数 ÷ 父节点组合的总样本数。
  1. N_{ijk}当父节点组合为第j种情况时,节点X_i取第k个值的样本数
    NijkN_{ijk}
  2. N_{ij}父节点组合为第j种情况时的总样本数
    NijN_{ij}
  3. θ̂_{ijk}条件概率P(X_i=k | Pa(X_i)=j)的最大似然估计
    θ^ijk\hat{\theta}_{ijk}
  4. 公式含义用频率估计概率——样本量越大,估计越逼近真实值
    NijkNij\frac{N_{ijk}}{N_{ij}}

AI 应用场景

医学诊断中的因果效应评估

阶段:因果推断

解决的问题:医生想评估新药X对患者康复率Y的真实因果效应,但患者年龄Z同时影响“是否用药”和“康复率”。传统方法直接对比用药组与对照组的康复率,会因为混杂而产生严重偏差——年纪大的患者更容易生病也更容易用药,直接比较会把年龄的影响误算成药效。

具体案例:某三甲医院临床科研团队构建了包含“年龄Z→用药X→康复Y”与“年龄Z→康复Y”的DAG模型,利用后门准则按年龄分层加权,得到药物的净效应估计:ATE = 0.12,即用药可使康复率平均提升12个百分点。这个数字比朴素对比的28%低得多,避免了过度乐观的结论。

电商推荐系统的可解释推荐

阶段:可解释AI

解决的问题:用户为什么买了这款相机?传统协同过滤只能给出“猜你喜欢”的黑箱结果,无法回答用户的追问。更严重的是,它把“看了A就推荐A”的相关性误当成购买驱动因素。

具体案例:某电商平台构建用户行为DAG:“浏览相机→收藏镜头→加购三脚架→购买相机”,利用Markov性质判断“收藏镜头”是“购买相机”的直接父节点,而“浏览相机”的远端影响已经被收藏行为屏蔽。推荐系统在向用户展示推荐结果时,附上因果解释:“因为你收藏了镜头,所以推荐这款相机”,解释点击率提升了23%。

金融风控中的违约风险归因

阶段:风险识别 / 因果推断

解决的问题:信贷风控模型判断“谁可能违约”,但银行更想知道“什么因素真正驱动违约”。某些特征(如借贷次数)与违约强相关,却可能是果而不是因;直接入模会导致模型在策略变化后失效。

具体案例:某消费金融公司用DAG建模“收入稳定性→还款能力→违约状态”和“历史借贷次数→还款能力”的因果结构,通过d-分离分析发现“历史借贷次数”在给定收入稳定性后对违约无直接贡献。于是把该特征从模型中去掉,改用真正有因果效应的“收入稳定性”特征,模型在新增客群上的AUC提升了4个百分点,且决策可解释性显著增强。

Python 演示

python62 行
# 验证DAG中两种结构的Markov性质差异# 链式 A->B->C:给定B后 A 与 C 条件独立# 汇合 A->B<-C:无条件时 A 与 C 独立,给定B后相关import itertools  def joint_prob_chain(a, b, c):    """链式结构 A->B->C 的联合概率"""    p_a = 0.5    p_b_given_a = 0.8 if b == a else 0.2    p_c_given_b = 0.7 if c == b else 0.3    return p_a * p_b_given_a * p_c_given_b  def joint_prob_collider(a, b, c):    """汇合结构 A->B<-C 的联合概率"""    p_a = 0.5    p_c = 0.5    p_b_given_ac = 0.9 if a == c else 0.1    return p_a * p_c * p_b_given_ac  def marginal(joint_fn, query, given=None):    """在给定条件下计算边缘概率(暴力枚举所有样本)"""    given = given or {}    total, norm = 0.0, 0.0    for a, b, c in itertools.product([0, 1], repeat=3):        vals = {'A': a, 'B': b, 'C': c}        if any(vals[k] != v for k, v in given.items()):            continue        p = joint_fn(a, b, c)        if all(vals[k] == v for k, v in query.items()):            total += p        norm += p    return total / norm if norm > 0 else 0 # ---- 链式结构验证 ----p_c_b = marginal(joint_prob_chain, {'C': 1}, {'B': 0})p_c_ab = marginal(joint_prob_chain, {'C': 1}, {'A': 0, 'B': 0})p_c_bb = marginal(joint_prob_chain, {'C': 1}, {'A': 1, 'B': 0})print('链式: P(C=1|B=0)     = %.4f' % p_c_b)print('链式: P(C=1|A=0,B=0) = %.4f' % p_c_ab)print('链式: P(C=1|A=1,B=0) = %.4f' % p_c_bb)assert abs(p_c_b - p_c_ab) < 1e-9 and abs(p_c_b - p_c_bb) < 1e-9print('验证通过:给定B后 A 与 C 条件独立') # ---- 汇合结构验证 ----p_ac = marginal(joint_prob_collider, {'A': 1, 'C': 1})p_a = marginal(joint_prob_collider, {'A': 1})p_c = marginal(joint_prob_collider, {'C': 1})print('汇合: P(A=1,C=1)           = %.4f' % p_ac)print('汇合: P(A=1)*P(C=1)        = %.4f' % (p_a * p_c))assert abs(p_ac - p_a * p_c) < 1e-9print('验证通过:无条件时 A 与 C 独立') p_ac_b = marginal(joint_prob_collider, {'A': 1, 'C': 1}, {'B': 1})p_a_b = marginal(joint_prob_collider, {'A': 1}, {'B': 1})p_c_b = marginal(joint_prob_collider, {'C': 1}, {'B': 1})print('汇合: P(A=1,C=1|B=1)       = %.4f' % p_ac_b)print('汇合: P(A=1|B=1)*P(C=1|B=1)= %.4f' % (p_a_b * p_c_b))assert abs(p_ac_b - p_a_b * p_c_b) > 1e-3print('验证通过:给定B后 A 与 C 不再独立(解释消除)')
目的:用暴力枚举精确计算三种结构下的条件概率,定量验证“链式结构满足Markov性质、汇合结构触发解释消除”这两个DAG核心结论。
  1. def joint_prob_chain(a, b, c):定义链式结构A→B→C的联合概率函数,每个变量的条件关系一目了然
  2. def marginal(joint_fn, query, given=None):通用边缘概率计算器,枚举所有8种取值组合,按given过滤、按query累加
  3. if any(vals[k] != v for k, v in given.items()):跳过不满足给定条件的样本,这是条件概率的“分母”逻辑
  4. p_c_b = marginal(joint_prob_chain, {'C': 1}, {'B': 0})计算P(C=1|B=0),作为基准概率
  5. assert abs(p_c_b - p_c_ab) < 1e-9断言P(C|B=0)与P(C|A=0,B=0)相等,即A不提供额外信息
  6. assert abs(p_ac_b - p_a_b * p_c_b) > 1e-3断言给定B后A与C不再独立,验证汇合结构的“解释消除”效应

常见误区

误区我看到两个节点在DAG图中有边相连,那它们一定存在因果关系。既然图都画出来了,边就是因果铁证。

正解DAG中的边代表建模者假设的因果方向,不等同于数据中已被验证的因果。要真正推断因果,还需要满足可识别性条件(比如后门准则)并处理隐藏的混淆变量。类比族谱:图上画了“父亲→儿子”,但这只是家族记录,要确认血缘还得靠DNA鉴定(数据验证)。DAG只是把假设摆到了台面上,让验证成为可能。

为何常见:因为DAG常出现在因果建模的语境中,初学者容易把“图中的箭头”直接等同于“已证明的因果”。

误区A和C在给定B的条件下条件独立,那它们在任何情况下都完全独立,两两之间不会有任何统计关联。

正解条件独立是在“给定某变量集合后”才成立的。链式结构A→B→C中,无条件时A和C是相关的(A的信息通过B传播到C),只有给定B后A⊥C才成立。用族谱说:孙子确实长得像爷爷(整体相关),但一旦知道父亲的长相,爷爷的长相对预测孙子没有额外帮助(条件独立)。

为何常见:人们容易忽略“条件”二字的分量,把课堂上的条件概率直觉带到了因果推理中。

误区P(Y|do(X=x)) 不就是 P(Y|X=x) 吗?从数据里筛出X=x的样本统计一下Y不就行了?

正解do(X=x)是干预,会切断所有指向X的边(消除混杂路径);而P(Y|X=x)只是观察条件化,混杂路径仍然畅通。以药物为例:观察数据中“吃药的人”往往病情更重(混杂),直接用P(康复|吃药)会严重低估药效。后门公式正是用来从观察数据中还原真实因果效应的。

为何常见:初学因果推断时,条件概率“筛数据求平均”的思维惯性过于强大,难以接受“观察≠干预”的差别。

误区DAG里的Markov性质,不就是时间序列里“下一时刻只依赖当前时刻”的一阶马尔可夫链吗?两者是一回事。

正解两者有关联但不是一回事。DAG中的Markov性质是“给定父节点后,节点与非后代条件独立”,是图结构上的性质,与时间顺序无关。时间序列的马尔可夫链只是Markov性质在链式DAG中的一个特例。并且,马尔可夫链通常假设所有历史影响都被当前状态吸收,而DAG的父节点可以是多个非时间顺序的变量。

为何常见:Markov这个词容易让人联想到最常见的马尔可夫链,从而忽略DAG中它的图论本质。

面试题

Q1. 有向无环图(DAG)中“无环”指的是?

单选题 · easy

  • A.不存在任何有向循环路径← 正确答案
  • B.不能出现重复的节点
  • C.边的数量不能超过节点
  • D.每个节点只能有一条出边

答案:A。“无环”指图中不存在一条从某节点出发、沿着箭头方向又能回到该节点的有向路径。这正是族谱不会出现“我生了我”的保证。B“重复节点”是集合的基本要求;C是树的性质不是DAG的;D更是错误限制了DAG的表达力。

Q2. 在DAG中,若节点X满足局部Markov性质,给定父节点Pa(X)后,X与谁条件独立?

单选题 · easy

  • A.所有后代节点
  • B.所有非后代节点← 正确答案
  • C.所有祖先节点
  • D.所有兄弟节点

答案:B。局部Markov性质的标准表述是“给定父节点后,X与所有非后代节点条件独立”。注意范围是“非后代”,它包含了祖先、兄弟和无关分支,比“只与祖先独立”(选项C)宽得多。后代节点是X影响的下游,不在此列。

Q3. 链式结构 A→B→C 中,当B被观察时,A和C的关系是?

单选题 · mid

  • A.A和C相互独立← 正确答案
  • B.A和C不再独立
  • C.A和C总是相同
  • D.B和C条件独立

答案:A。在链式结构中,B是信息中继站。当B被观察后,A的信息无法绕过B到达C,因此A⊥C|B,即A和C条件独立。这就像知道了父亲B的长相后,爷爷A的长相对预测孩子C没有额外帮助——这正是Markov性质的核心体现。

Q4. 汇合结构 A→B←C 中,当B未被观察时,A和C的关系是?

单选题 · mid

  • A.A和C相互独立← 正确答案
  • B.A和C强相关
  • C.A和C总是相反
  • D.无法判断独立性

答案:A。汇合结构(碰撞器)中,A和C是两个独立的原因,它们共同指向B。在未观察B时,A和C之间没有信息通道,因此相互独立。但一旦B被观察,A和C就会产生相关,这称为“解释消除”——两个独立原因在共同结果已知后反而互相提供信息。

Q5. 贝叶斯网络中,联合分布可以分解为?

单选题 · mid

  • A.每个节点边缘概率的乘积
  • B.给定父节点的条件概率乘积← 正确答案
  • C.所有节点概率的加和
  • D.只有根节点的概率乘积

答案:B。贝叶斯网络的核心分解公式是 P(X₁,…,Xₙ) = ∏P(Xᵢ|Pa(Xᵢ)),即每个节点在其父节点条件下的条件概率的乘积。选项A只适用于完全独立的变量;选项C的求和没有概率意义;选项D只考虑了根节点,遗漏了非根节点。

Q6. 下列哪些属于d-分离的三种基本结构?

多选题 · mid

  • A.链式结构← 正确答案
  • B.分叉结构← 正确答案
  • C.汇合结构← 正确答案
  • D.闭环结构

答案:ABC。d-分离的三种基本结构是链式(X→Z→Y)、分叉(X←Z→Y)和汇合(X→Z←Y)。链式和分叉在给定Z后阻断信息流,汇合则在给定Z后打开信息流(解释消除)。DAG中不允许闭环结构,选项D本身就是无效的。

Q7. 关于 do(X=x) 算子,以下说法正确的是?

单选题 · hard

  • A.等价于筛选观测数据中X=x
  • B.表示干预并切断指向X的边← 正确答案
  • C.等价于计算P(X=x)的值
  • D.只能用于随机对照实验

答案:B。do(X=x)表示主动干预,在图中会切断所有指向X的边,从而消除混杂路径的影响。选项A描述的是观察条件化P(Y|X=x),它与干预有本质区别——观察不切断混杂路径。选项C只是X的边缘概率,与Y无关。选项D错误,do算子也可以在观测数据中通过后门准则识别。

Q8. 后门准则中,调整变量集合Z需要满足哪些条件?

多选题 · hard

  • A.Z中不能包含X的后代节点← 正确答案
  • B.Z阻断X到Y的所有后门路径← 正确答案
  • C.Z必须包含Y的祖先节点
  • D.Z不能包含任何混淆变量

答案:AB。后门准则要求:①Z中不含X的后代节点(避免引入X受干预影响的路径);②Z阻断所有从X到Y的后门路径(即那些不经过X的、指向X的混杂路径)。选项C并非必要条件;选项D错误——Z的作用恰恰是要包含混淆变量并对其调整,才能剥离混杂。

Q9. 从数据中学习DAG的拓扑结构,属于?

单选题 · easy

  • A.从数据中学习图拓扑结构← 正确答案
  • B.从数据中学习概率参数
  • C.计算条件概率表内容
  • D.绘制清晰的可视化图

答案:A。结构学习的目标是从观测数据中推断DAG的边和方向,即“图长什么样”。选项B和C描述的是参数估计——在结构已知后为CPT填数字。选项D是可视化工具,与结构学习无关。

Q10. 贝叶斯网络的特点包括?

多选题 · mid

  • A.图结构必须是有向无环← 正确答案
  • B.每个节点附条件概率表← 正确答案
  • C.支持基于图的概率推断← 正确答案
  • D.只能处理离散型变量

答案:ABC。贝叶斯网络 = DAG + 条件概率表,支持沿图做概率推断(如变量消元、置信传播)。选项D错误:贝叶斯网络可以处理连续变量(采用高斯分布等参数化形式),并非只能处理离散型变量。