09 概率图模型:用结构化方法驾驭不确定性

欢迎来到第9讲

欢迎来到第9讲 图示主题为“欢迎来到第9讲”。主要标签包括:概率图模型 (Probabilistic Graphical Model)、A、观测变量 (Observed)、B、C、隐变量 (Latent)、D、目标变量 (Target);这些元素共同展示该页的关系、比较或流程。 概率图模型 (Probabilistic Graphical Model) A 观测变量 B 观测变量 C 隐变量 D 目标变量 E 观测变量 F 隐变量 G 目标 H 目标

本讲座的议程

本讲座的议程 依次学习动机、有向贝叶斯网络、观测查询与中国公司案例;HMM、无向 MRF、因子图与通用推理可在课后选学。 本讲内容概览 1. 核心内容 动机 为何用图? 2. 核心内容 有向 BN DAG + CPD d-分离 3. 核心内容 观测查询 查询 ≠ do(·) 4. 核心内容 案例 + 回顾 中国公司 返回点 5.拓展内容 (可选) HMM / MRF 因子图 + 推理 选学内容结束 → 4. 真实数据案例与回顾

学习目标

完成本讲后,你能够(核心内容目标由 90 分钟本讲回顾验收):

  • 核心内容:从 DAG 读出指定的条件独立关系,并写出 BN 的局部 CPD 因子分解。
  • 核心内容:区分观测条件概率 \(P(Y\mid X=x)\) 与干预分布 \(P(Y\mid do(X=x))\)
  • 核心内容:pgmpy 中完成观测条件查询,并说明因果解释所需的额外假设。
  • 拓展内容:写出 MRF 的势函数分解,并判断树上置信传播何时精确、有环图上为何只是一种近似。

开始前回顾

  1. 写出 (P(A,B,C)) 的链式法则。
  2. \(A\perp C\mid B\),给定 B 后,A 的信息是否还会改变 C 的分布?
  3. “相关”是否自动意味着“干预 A 会改变 C”?

先独立写下三个答案,再揭示。

揭示与补救

  • \(P(A)P(B\mid A)P(C\mid A,B)\);不会;不意味着,因果结论还需结构因果假设与可识别性。

  • 若第 1 题答错,回到链式法则;若第 2 或 3 题答错,分别回到 d-分离或 conditioning/intervention。

90 分钟学习安排:先理解概率含义

  • 0–12 分钟:联合分布、条件独立与图分解;回顾需要用到的基础知识。
  • 12–40 分钟:概率 DAG、局部 CPD 与 d-分离;做链/分叉/碰撞点检查。
  • 40–65 分钟:观测条件推断,并对照 \(P(Y\mid X)\)\(P(Y\mid do(X))\)
  • 65–82 分钟:本地中国公司数据 前面的案例 与综合练习。
  • 82–90 分钟:本讲回顾与结果解释的限制。

学习顺序

核心问题:如何为复杂经济系统建模?

想象一下预测GDP的增长。这是一个由众多相互关联的变量组成的复杂系统。

核心问题:如何为复杂经济系统建模? 图示主题为“核心问题:如何为复杂经济系统建模?”。主要标签包括:影响GDP增长的关键经济变量 (Key Economic Variables Affecting GDP Growth)、GDP增长、(GDP Growth)、利率、(Interest Rate)、通货膨胀、(Inflation)、失业率;这些元素共同展示该页的关系、比较或流程。 影响 GDP 增长的关键经济变量 GDP增长 利率 通货膨胀 失业率 消费信心

我们如何才能清晰地表示并推理这些变量之间的复杂依赖关系?

传统方法的局限性:联合概率分布

理论上,要完整描述一个系统,我们需要知道所有变量的 联合概率分布 \(P(x_1, x_2, \dots, x_d)\)

但这是一个几乎不可能完成的任务。

指数级增长的“维度灾难”

想象我们有 d 个二元经济指标 (例如:加息/不加息)。

要存储它们的联合概率分布,我们需要一个参数表。

变量数量 (d) 概率单元数 2^d;自由参数数 2^d − 1 类比
2 4 / 3 一张小纸条
10 1,024 / 1,023 一页A4纸
20 1,048,576 / 1,048,575 一本厚书
30 2^30 / (2^30 − 1) 一个小型图书馆
50 2^50 / (2^50 − 1) 规模已极大

这在计算上是完全不可行的。

维度灾难的直观理解

维度灾难的直观理解 图示主题为“维度灾难的直观理解”。主要标签包括:维度灾难:参数数量的指数增长、(Curse of Dimensionality: Exponential Growth in Parameters)、参数数量 (对数尺度)、10³ (1k)、10⁶ (1M)、10⁹ (1G)、变量数量 (d)、10;这些元素共同展示该页的关系、比较或流程。 维度灾难:参数数量的指数增长 (Curse of Dimensionality: Exponential Growth in Parameters) 参数数量(对数) 10³ 10⁶ 10⁹ 变量数量 (d) 10 20 30 2¹⁰ ≈ 1千 2²⁰ ≈ 1百万 2³⁰ ≈ 10亿 计算上不可持续 (Computationally Unsustainable)

解决方案:利用“条件独立”来分解复杂性

解决方案:利用“条件独立”来分解复杂性 图示主题为“解决方案:利用“条件独立”来分解复杂性”。主要标签包括:传统方法:完全连接、(维度灾难)、PGM:稀疏结构、(计算可行)、A、B、C、D;这些元素共同展示该页的关系、比较或流程。 传统方法:完全连接 (维度灾难) PGM:稀疏结构 (计算可行) A B C D

大部分变量之间并不是“万物互联”的。一个变量通常只与少数几个其他变量直接相关。

从“完全连接”到“稀疏连接”

  • 与其存储一个巨大的联合表,我们可借助图结构写出局部因子;

  • 但有向图与无向图的归一化方式不同,不能用同一个“局部概率乘积”公式代替定义。

\[ \begin{aligned} \text{BN: }&p(\mathbf x)=\prod_i p(x_i\mid x_{\mathrm{pa}(i)}),\\ \text{MRF: }&p(\mathbf x)=\frac{1}{Z}\prod_{C\in\mathcal C}\psi_C(x_C). \end{aligned} \]

而“图”结构,正是用来直观地表示哪些变量是“局部”相关的,哪些是条件独立的。

概率图模型:两大主要流派

我们将主要学习两大类概率图模型,它们处理依赖关系的方式不同。

模型类型 图结构 边的含义 核心应用领域
贝叶斯网络 有向无环图 (DAG) 编码因子分解与条件独立;满足额外假设时可赋予因果语义 专家系统、时序分析、因果模型
马尔可夫网络 无向图 编码势函数分解与条件独立 图像处理、社交网络分析、物理系统

我们今天的旅程

今天,我们将从有向图——贝叶斯网络——开始我们的探索之旅。

我们将学习它的:

  1. 表示 (如何用图来编码独立性)
  2. 推理 (如何在给定证据的情况下回答问题)
  3. 学习 (如何从数据中估计模型)

9.1 联合概率表示

回顾:表示联合概率的三种方式

三种表示 \(d\) 维随机向量 \(\mathbf{x} = (x_1, \dots, x_d)\) 联合概率 \(P(\mathbf{x})\) 的方法:

  1. 完全独立假设
  2. 链式法则
  3. 概率图模型(PGM)

方法1:完全独立假设

假设所有变量相互独立。

\(P(x_1, \dots, x_d) = P(x_1)P(x_2)\dots P(x_d)\)

  • 优点:极度简化,计算成本最低。
  • 缺点:过于简单,完全忽略了变量间的相互作用,现实中几乎不存在。

方法2:链式法则 (Chain Rule)

利用条件概率的定义,可以精确地分解任何联合概率。

\(P(x_1, \dots, x_d) = P(x_1)P(x_2|x_1)\dots P(x_d|x_1, \dots, x_{d-1})\)

  • 优点:完全通用,没有任何假设,是精确的。
  • 缺点:没有简化任何东西。最后一项 \(P(x_d|x_1, \dots, x_{d-1})\) 的参数数量与原始联合概率一样多,同样面临维度灾难。

方法3:概率图模型 (PGM) 的中间道路

PGM 提供一种可检验的折中:稀疏结构可能降低参数量与推理成本,但效果取决于图、变量基数和推理算法,并不保证“完美平衡”。

方法3:概率图模型 (PGM) 的中间道路 图示主题为“方法3:概率图模型 (PGM) 的中间道路”。主要标签包括:概率图模型 (PGM) 的中间道路、方法1: 完全独立、(Completely Independent)、优点: 计算成本低、缺点: 过于简化、方法2: 链式法则、(Chain Rule)、优点: 完全精确;这些元素共同展示该页的关系、比较或流程。 完全独立 优点: 计算成本低 缺点: 过于简化 链式法则 优点: 完全精确 缺点: 过于复杂 PGM PGM 折中 简化与表达能力的权衡

PGM的本质:链式法则的“智能”简化版

PGM的本质:链式法则的“智能”简化版 图示主题为“PGM的本质:链式法则的“智能”简化版”。主要标签包括:概率图模型:链式法则简化、1. 图结构 (Graph Structure)、X₁、X₂、X₃、模型假设:X₃ 在给定 X₂ 的条件下与 X₁ 条件独立。、(X₃ ⊥ X₁ | X₂)、➔;这些元素共同展示该页的关系、比较或流程。 概率图模型:链式法则简化 1. 图结构 (Graph Structure) X₁ X₂ X₃ 给定 X₂ 时,X₃ 与 X₁ 条件独立。 (X₃ ⊥ X₁ | X₂) 2. 数学简化 (Simplification) P(X₃ | X₁, X₂) = P(X₃ | X₂)

这就是概率图模型降低计算复杂度的秘密。

图的基本语言:节点与边

图的基本语言:节点与边 图示主题为“图的基本语言:节点与边”。主要标签包括:概率图模型 G = (V, E)、Probabilistic Graphical Model: G = (Vertices, Edges)、智商 (I)、难度 (D)、成绩 (G)、节点 V (Vertices)、代表随机变量、边 E (Edges);这些元素共同展示该页的关系、比较或流程。 概率图模型 G = (V, E) Probabilistic Graphical Model: G = (Vertices, Edges) 智商 I 难度 D 成绩 G 节点 V (Vertices) 代表随机变量 边 E (Edges) 代表概率依赖

9.2 有向图:贝叶斯网络

什么是贝叶斯网络 (BN)?

贝叶斯网络 (Bayesian Networks, BN),也称为概率有向图模型 (PDGM),使用 有向无环图 (Directed Acyclic Graph, DAG) 来编码变量间的依赖关系。

它由两部分组成:

  1. 图结构 (Qualitative): 一个DAG,描述变量间的条件独立关系。
  2. 参数 (Quantitative): 一系列局部条件概率分布(CPDs),量化这些依赖关系的强度。

核心结构:有向无环图 (DAG)

  • 有向 (Directed):箭头规定局部条件概率的父子顺序,例如 \(A\rightarrow B\) 使 B 的局部分布写作 \(P(B\mid A)\)。普通概率 BN 并不由此自动证明 A 导致 B。
  • 无环 (Acyclic):沿箭头不能回到起点,因此联合分布可按拓扑顺序分解。只有结构另有因果依据时,“无环”才同时具有因果含义。

概率 DAG 与因果 DAG:同一图形,不同承诺

  • 概率 BN 只承诺: 联合分布的因子分解、局部 Markov 性与可由 d-分离读取的条件独立。

  • 赋予因果语义所需:

    • 结构方程/干预语义与因果 Markov 条件。

    • Faithfulness 是结构学习或由独立性反推图时常另加的分布假设,并非因果 DAG 本身的定义。

    • 可识别性则针对具体 estimand/query;例如后门调整还需对应的混杂控制与正值性。

    • 箭头方向本身不能从观测数据证明这些条件。

因此本讲 pgmpyquery 都是观测条件推断,除非另行建立结构因果模型。

DAG 示例:合法的 vs. 非法的

DAG 示例:合法的 vs. 非法的 图示主题为“DAG 示例:合法的 vs. 非法的”。主要标签包括:图结构对比:有向无环 vs. 循环、合法的有向无环图 (DAG)、A、B、C、非法的循环图 (Cycle)、X、Y;这些元素共同展示该页的关系、比较或流程。 图结构对比:有向无环 vs. 循环 合法的有向无环图 (DAG) A B C 非法的循环图 (Cycle) X Y Z

案例引入:一个简化的学生模型

让我们用图结构来构建一个关于学生表现的简化模型。

案例引入:一个简化的学生模型 图示主题为“案例引入:一个简化的学生模型”。主要标签包括:有向无环图 (Directed Acyclic Graph)、X₁、X₂、X₃、X₄、X₅、X₆;这些元素共同展示该页的关系、比较或流程。 有向无环图 (Directed Acyclic Graph) X₁ X₂ X₃ X₄ X₅ X₆

解读图的语言:家族关系

在有向图中,我们使用家族关系来描述节点间的关系:

  • 父节点 (Parents): 一个节点的父节点是指所有直接指向该节点的节点集合。
    • parents(X3){X1, X2}
    • parents(X6){X4, X5}
  • 子节点 (Children): 一个节点的子节点是指所有被该节点直接指向的节点集合。
    • children(X1){X3, X5}
  • 没有父节点的节点(如 X1, X2)只是该因子分解中的根节点;只有另有结构因果解释时,才能称为外生原因。

贝叶斯网络的基石:局部马尔可夫性质

DAG的结构直接定义了一个核心的条件独立假设: 局部马尔可夫性质

一个节点在给定其父节点的情况下,条件独立于其所有的非后代节点。

贝叶斯网络的基石:局部马尔可夫性质 图示主题为“贝叶斯网络的基石:局部马尔可夫性质”。主要标签包括:局部马尔可夫性质 (Local Markov Property)、X₁、X₂、X₃、X₄、X₅、X₆、父节点 (Parents);这些元素共同展示该页的关系、比较或流程。 局部马尔可夫性质 (Local Markov Property) X₁ X₂ X₃ X₄ X₅ X₆ 父节点 (Parents) 非后代 X₅
Figure 1

案例分析:从图中读取条件独立性

让我们再次审视图 Figure 1

  • 节点 X3:
    • 父节点: {X1, X2}
    • 后代: {X4, X6}
    • 非后代: {X5} (注意X1,X2是它的祖先,也算非后代)
  • 应用性质: 根据局部马尔可夫性质,我们可以断言:在给定 X1X2 的条件下,X3X5 是条件独立的。
  • 数学表达: \(P(X_3 | X_1, X_2, X_5) = P(X_3 | X_1, X_2)\)

联合概率的因子分解:BN的魔力所在

基于局部马尔可夫性质,任何一个符合DAG的联合概率分布都可以被分解为所有节点关于其父节点的条件概率的乘积。

\[ \large{P(x_1, \dots, x_d) = \prod_{i=1}^d P(x_i | \text{parents}(x_i))} \tag{1}\]

  • 这个公式是整个贝叶斯网络的核心。

  • 它将一个庞大、复杂的联合概率分布,分解成了一系列小规模、易于处理的 局部概率模型 (也称作条件概率分布, CPD)。

案例计算:分解图9.1的联合概率

应用 Equation 1 公式到 Figure 1 的图结构上:

\[ \large{ \begin{aligned} & P(X_1, X_2, X_3, X_4, X_5, X_6) \\ & = P(X_1) \cdot P(X_2) \cdot P(X_3|X_1, X_2) \cdot P(X_4|X_3) \\ & \quad \cdot P(X_5|X_1) \cdot P(X_6|X_4, X_5) \end{aligned} } \]

  • 对比: 如果使用标准的链式法则,最后一项会是 \(P(X_6|X_1, X_2, X_3, X_4, X_5)\),计算它需要巨大的参数空间。
  • 优势: 因子分解大大减少了我们需要估计的参数数量,使模型学习成为可能。

参数化:用条件概率表(CPT)填充模型

现在我们有了结构,还需要为每个局部概率模型提供具体的参数。对于离散变量,这通常通过 条件概率表 (Conditional Probability Table, CPT) 来完成。

  • 一个CPT列出了在一个节点的所有父节点取值的每一种组合下,该节点取不同值的概率。
  • 对于根节点 (如 \(X_1\)),CPT就是一个简单的先验概率分布 \(P(X_1)\)
  • 对于有父节点的节点 (如 \(X_3\)),CPT就是 \(P(X_3 | X_1, X_2)\)

9.2.2 有向分离 (D-Separation)

我们为何需要一套通用规则?

局部马尔可夫性质告诉我们一个节点与其“非后代”的独立性。但我们经常需要回答更一般性的问题:

任意两个不相干的节点集合 AB,在给定第三个集合 E 的条件下,是否独立?

D-分离 (Directed Separation) 就是一套完整的、通用的规则,让我们能从图结构中直接“读取”任意条件独立性。

D-分离的核心思想

D-分离的核心思想是检查两组节点之间的所有路径是否被“阻断 (blocked)”。

  • 如果 AB所有 路径都被观测变量集合 E 所阻断,那么 AB 就是条件独立的。

  • 若至少有 一条 路径是通的 (unblocked),图结构就不能保证 AB 条件独立;

  • 只有再假设分布对图忠实(不存在参数抵消)时,才能把 d-连接解释为条件依赖。

D-分离的三种基本结构

任何复杂的DAG中的路径都可以被分解为三种基本连接结构。理解这三种结构是掌握D-分离的关键。

D-分离的三种基本结构 图示主题为“D-分离的三种基本结构”。主要标签包括:D-分离的三种基本结构 (D-Separation Structures)、1. 共同原因 (Fork)、A、B、C、观察 A, 路径 阻断、2. 链式结构 (Chain)、3. V型结构 (Collider);这些元素共同展示该页的关系、比较或流程。 D-分离的三种基本结构 (D-Separation Structures) 1 · 共同原因 A B C 观察 A路径阻断 2 · 链式结构 A B C 观察 A路径阻断 3 · 碰撞点 A B C 观察 A路径打通

结构1: Tail-to-Tail (共同原因)

b <- a -> c

  • 路径: bc 通过它们的共同父节点 a 连接。
  • 规则: 当 a 被观测到 (给定) 时,从 bc 的路径被 阻断
  • 例子: 冰淇淋销量 \(\leftarrow\) 天气炎热 \(\rightarrow\) 中暑人数
  • 解释:
    • 如果我们已经知道了今天天气炎热,那么观察到冰淇淋销量很高并不会让我们对中暑人数的判断产生任何新的改变。

    • 天气信息已经“解释”了两者之间的关联。

    • 反之,如果天气未知,那么冰淇淋销量高确实会增加我们对中暑人数多的判断。

结构2: Head-to-Tail (链式结构)

b -> a -> c

  • 路径: b 通过中间节点 a 影响 c
  • 规则: 当 a 被观测到 (给定) 时,从 bc 的路径被 阻断
  • 例子: 美联储政策 \(\rightarrow\) 市场利率 \(\rightarrow\) 房地产价格
  • 解释:
    • 一旦我们直接观测到了市场利率,那么美联储的具体政策是如何导致这个利率的就不再重要了。

    • 市场利率本身已经包含了所有预测房地产价格所需的信息。

结构3: Head-to-Head (V型结构)

b -> a <- c

  • 路径: bc 都是 a 的父节点。a 是它们的共同效应。
  • 规则 (注意! 这是反的!):
    • a (或a的任何后代) 未被观测到 时,路径是 阻断 的。
    • a (或a的任何后代) 被观测到 时,路径被 打通
  • 例子: 学术才华 \(\rightarrow\) 获得终身教职 \(\leftarrow\) 学术政治手腕
  • 解释:
    • 这个现象被称为 “解释得通 (explaining away)”

    • 知道一个教授有才华并不能告诉我们任何关于他政治手腕的信息(两者先验独立)。

    • 但是,如果我们知道他获得了终身教职,然后又发现他其实没什么才华,这就强烈暗示他一定非常有政治手腕。

D-分离总结:路径是否被阻断?

一条从节点集合 AB 的路径被一个节点集合 E (我们观测到的变量) 阻断,如果路径上存在一个节点 v 满足以下任一条件:

  1. vtail-to-tailhead-to-tail 结构,并且 v 观测集 E 中。
  2. vhead-to-head 结构,并且 v 以及它的所有后代不在 观测集 E 中。

如果 AB所有路径 都被 E 阻断,那么我们就说 AB 在给定 E 的条件下是 D-分离 的,即条件独立: A \(\perp\) B | E

转折检查:观测碰撞点会发生什么?

  • 先作答:\(A\rightarrow B\leftarrow C\) 中,未观测 B 时 A 与 C 是否独立?观测 B 后呢?
  • 揭示与补救:
    • 未观测 B 及其后代时,碰撞路径被阻断;观测 B 后路径打开,A 与 C 通常相关。

    • 若认为“控制越多越好”,回到三种基本结构并重新标出碰撞点。

9.2.3案例研究:一个更完整的学生模型

现在,我们把这些概念应用到教材第8页的经典“学生”贝叶斯网络中。这个网络模拟了影响学生最终获得推荐信(Letter)的各个因素。

  • 变量:
    • D (Difficulty): 课程难度 (0=低, 1=高)
    • I (Intelligence): 学生智商 (0=不高, 1=高)
    • G (Grade): 学生成绩 (0=C, 1=B, 2=A)
    • S (SAT): SAT分数 (0=低, 1=高)
    • L (Letter): 推荐信质量 (0=差, 1=好)

学生模型之图结构

这个图的结构编码了我们关于学生表现的先验信念。

学生模型之图结构 图示主题为“学生模型之图结构”。主要标签包括:学生贝叶斯网络 (Student Bayesian Network)、I、智商 (Intelligence)、D、难度 (Difficulty)、S、SAT、G;这些元素共同展示该页的关系、比较或流程。 学生贝叶斯网络 (Student Bayesian Network) I 智商 D 难度 (Difficulty) S SAT G 成绩 (Grade) L 推荐信 (Letter)

学生模型之因子分解

核心内容任务

先按“每个节点只条件于其父节点”写出 \(P(I,D,G,S,L)\),再揭示。

. . .

根据上页的图结构和 Equation 1,联合概率分解为:

\[ \large{P(I, D, G, S, L) = P(I) \cdot P(D) \cdot P(S|I) \cdot P(G|I, D) \cdot P(L|G)} \]

请注意,我们大大简化了问题!例如,我们只需要 \(P(L|G)\),而不是 \(P(L|I, D, G, S)\)

学生模型之参数化 (CPTs)

现在我们需要为每个因子填充CPT。这些概率通常从领域专家或历史数据中估计得到。

1. 根节点 (先验概率)

  • \(P(I)\): P(I=0) = 0.7, P(I=1) = 0.3
  • \(P(D)\): P(D=0) = 0.6, P(D=1) = 0.4

2. 条件概率

  • \(P(S|I)\): 智商如何影响SAT分数
  • \(P(G|I,D)\): 智商和课程难度如何共同影响成绩
  • \(P(L|G)\): 成绩如何影响推荐信质量

CPT 示例: P(G | I, D)

这张表展示了在不同智商和课程难度组合下,学生取得A/B/C三种成绩的概率。

I (智商) D (难度) P(G=A) P(G=B) P(G=C)
0 (不高) 0 (低) 0.30 0.40 0.30
0 (不高) 1 (高) 0.05 0.25 0.70
1 (高) 0 (低) 0.90 0.08 0.02
1 (高) 1 (高) 0.50 0.30 0.20

贝叶斯网络推理:回答“观测到以后”

  • 拥有一个完整的贝叶斯网络后,我们就可以进行 推理(Inference)

  • 这意味着,在观测到某些变量(证据, Evidence)后,我们可以计算其他未观测变量的后验概率分布。

这回答的是 \(P(Y\mid X=x)\):在样本中观察到 \(X=x\) 后,Y 如何分布;它不是“把 X 强制设为 x 会怎样”。

Conditioning 与 Intervention:一个混杂例子

设市场情绪 \(U\) 同时影响融资约束 \(X\) 与投资 \(Y\)\(U\rightarrow X, U\rightarrow Y\),且 \(X\rightarrow Y\)

  • 观测条件:\(P(Y\mid X=x)\) 同时包含 X 的路径与共同原因 U 带来的选择差异。

  • 干预:\(P(Y\mid do(X=x))\) 切断指向 X 的箭头,再比较强制设定 X 后的 Y。

  • 结论:若 U 未观测且没有其他识别策略,普通 BN 查询不能把前者替代为后者。

  • 检查 2: 删除指向 X 的箭头属于 conditioning 还是 intervention?普通 pgmpy 查询做了这一步吗?先回答。

  • 揭示与补救: 删入箭头是 intervention;普通查询只做 conditioning。若混淆,回到“共同原因 U”并分别画出观察与干预两张图。

  • 核心问题: 计算 \(P(\text{查询变量} | \text{证据变量})\)

推理问题示例

  • 一个学生拿到了一封很好的推荐信(L=1),那么他很聪明的概率是多少?
    • \(P(I=1 | L=1) = ?\)
  • 一个很聪明的学生(I=1)在一门很难的课(D=1)上,他拿到A的概率是多少?
    • \(P(G=A | I=1, D=1) = ?\) (这个可以直接查CPT)
  • 一个学生SAT成绩很高(S=1),但他成绩很差(G=C),那么课程很难的概率是多少?
    • \(P(D=1 | S=1, G=C) = ?\)

实战:用 Python pgmpy 库构建并查询学生模型

理论讲完了,让我们用代码把它变成现实。我们将使用一个强大的Python库 pgmpy 来实现学生模型。

核心内容任务

运行并检查模型验证与 \(P(D=1\mid I=1,L=1)\) 的观测查询输出;说明普通查询没有删除任何入边,因此不等于干预。

步骤:

  1. 定义模型结构 (添加节点和边)
  2. 定义CPTs
  3. 将CPTs与结构关联,形成完整模型
  4. 创建推理引擎
  5. 进行查询

pgmpy 实战:构建并验证模型

首先,我们用一个完整的代码块来构建学生模型。

Code
# 导入所需的库
from pgmpy.models import DiscreteBayesianNetwork
# 导入依赖以支持本页的数据处理、建模或可视化。
from pgmpy.factors.discrete import TabularCPD
# 1. 定义模型结构 (边)
student_model = DiscreteBayesianNetwork([('D', 'G'), ('I', 'G'), ('I', 'S'), ('G', 'L')])
# 2. 定义CPDs
# 根节点
cpd_d = TabularCPD('D', 2, [[0.6], [0.4]])
cpd_i = TabularCPD('I', 2, [[0.7], [0.3]])
# 条件节点
cpd_s = TabularCPD('S', 2,
                   values=[[0.95, 0.2], [0.05, 0.8]],
                   evidence=['I'], evidence_card=[2])

再补齐其余条件概率表并验证各列归一化与图结构一致。

Code
# 状态约定:D=0简单/1困难,I=0低/1高,G=0为C、1为B、2为A,L=0弱/1强。
# evidence=['D','I'] 的列顺序是 (D=0,I=0), (D=0,I=1), (D=1,I=0), (D=1,I=1)。
cpd_g = TabularCPD('G', 3,
                   values=[[0.30, 0.02, 0.70, 0.20],   # G=0:C。
                           [0.40, 0.08, 0.25, 0.30],   # G=1:B。
                           [0.30, 0.90, 0.05, 0.50]],  # G=2:A。
                   evidence=['D', 'I'], evidence_card=[2, 2])
# 注意:pgmpy的CPT中,变量状态默认从0开始。
# 推荐信表按 G=C、B、A 的列顺序给出弱/强概率。
cpd_l = TabularCPD('L', 2,
                   values=[[0.9, 0.4, 0.01], [0.1, 0.6, 0.99]], # 教学说明:L=0, L=1。
                   evidence=['G'], evidence_card=[3])
# 3. 添加CPDs到模型中
student_model.add_cpds(cpd_d, cpd_i, cpd_s, cpd_g, cpd_l)
# 4. 验证模型是否有效
assert student_model.check_model()  # 确认概率表与网络结构一致。
# 执行 `print`,生成当前步骤需要的结果或可视化。
print('模型构建成功并通过验证!')  # 展示当前步骤的结果。
模型构建成功并通过验证!

pgmpy 实战:创建推理引擎并查询

最激动人心的部分来了!我们创建一个推理引擎(这里使用变量消除法),然后提出我们的问题。

问题

  • 假设我们观察到一个学生智商很高 (I=1),并且拿到了一封很好的推荐信 (L=1)。

  • 那么,这门课程很难 (D=1) 的概率是多少?

  • 即计算 \(P(D=1 | I=1, L=1)\)

Code
# 这是一个完整的、可运行的代码块 (接上页)
from pgmpy.inference import VariableElimination
# (模型构建代码已在上页运行,这里不再重复)

# 5. 创建推理引擎
inference = VariableElimination(student_model)
# 6. 进行查询
query_result = inference.query(variables=['D'], evidence={'I': 1, 'L': 1})
# 执行 `print`,生成当前步骤需要的结果或可视化。
print(query_result)  # 展示当前步骤的结果。
+------+----------+
| D    |   phi(D) |
+======+==========+
| D(0) |   0.6701 |
+------+----------+
| D(1) |   0.3299 |
+------+----------+

结果解读与经济直觉

查询结果显示 \(P(D=1 | I=1, L=1) \approx 0.3299\)

  • 先验概率: 在没有任何信息的情况下,课程很难的概率是 \(P(D=1)=0.4\)
  • 后验概率: 当我们得知这个聪明的学生拿到了一封好信,我们对课程很难的信念下降到约33.0%。
  • 直觉:
    • 聪明学生即使在难课上也可能取得好成绩并拿到好信。
    • 但在简单课程中,取得好成绩的概率更高。
    • 因而“好信”会略微提高我们对“课程简单”的后验信念。
    • 贝叶斯推理把这种信念更新定量化。

9.2.4 动态贝叶斯网络:当BN遇到时间

课后选学:以下内容包括 HMM、无向图模型与一般推断;学习核心内容时可先跳到真实数据练习本讲回顾

如果我们将贝叶斯网络在时间维度上“展开”,就得到了 动态贝叶斯网络 (Dynamic Bayesian Network, DBN)

最简单也最著名的DBN就是 隐马尔可夫模型 (Hidden Markov Model, HMM)

HMM的直观理解:洞穴中的天气预报

想象你被困在一个洞穴里,无法看到外面的天气。但洞穴里每天都会渗水。

  • 你的观测 (可见): 今天洞穴里是 “干燥”、“潮湿” 还是 “滴水”。
  • 真实状态 (隐): 外面的天气是 “晴天”、“多云” 还是 “雨天”。

你的任务是,根据连续几天的渗水情况,推断出外面最可能的天气变化序列。

HMM的核心应用

对时间序列数据建模,其中系统的真实状态是不可见的 (隐),我们只能通过一些可见的观测来推断它。

  • 经济学应用:
    • 真实状态 (隐): 经济处于“扩张期”还是“衰退期”。
    • 观测 (可见): 每季度的GDP增长率、失业率数据。

HMM 的两个核心假设

HMM建立在两个关键的简化假设之上,这使得模型变得 tractable。

  1. 马尔可夫假设 (状态转移)
  2. 观测独立性假设 (发射概率)

假设1:马尔可夫假设 (状态转移)

当前的真实状态 \(z_t\) 取决于前一个时刻的真实状态 \(z_{t-1}\)

\[ \large{P(z_t | z_{t-1}, z_{t-2}, \dots, z_1) = P(z_t | z_{t-1})} \]

  • 经济学解释: 经济是处于衰退还是扩张,主要取决于上一个季度是衰退还是扩张,而与更早之前的历史无关(在一阶模型中)。

假设2:观测独立(发射概率)

当前的观测值 \(x_t\) 取决于当前的真实状态 \(z_t\)

\[ \large{P(x_t | z_t, x_{t-1}, z_{t-1}, \dots) = P(x_t | z_t)} \]

  • 经济学解释: 本季度的GDP增长率,只取决于本季度经济是处于衰退还是扩张,而与之前的状态和观测都无关。

HMM 的图结构

这两个假设共同定义了一个非常简洁的链式图结构。

HMM 的图结构 图示主题为“HMM 的图结构”。主要标签包括:隐马尔可夫模型 (Hidden Markov Model)、隐状态序列Z (Hidden States)、观测序列X (Observations)、Z₁、Z₂、...、Zₜ、X₁;这些元素共同展示该页的关系、比较或流程。 隐马尔可夫模型 (Hidden Markov Model) 隐状态序列Z (Hidden States) 观测序列X (Observations) Z₁ Z₂ ... Zₜ X₁ X₂ ... Xₜ

HMM 的三要素

要完全定义一个HMM,我们需要三个参数,通常记为 \(\lambda = (A, B, \pi)\)

  1. 状态转移矩阵 A: \(A_{ij} = P(z_t = j | z_{t-1} = i)\)
    • 描述了从一个隐状态转移到另一个隐状态的概率。
  2. 观测发射矩阵 B: \(B_{jk} = P(x_t = k | z_t = j)\)
    • 描述了在某个隐状态下,生成特定观测值的概率。
  3. 初始状态分布 \(\pi\): \(\pi_i = P(z_1 = i)\)
    • 描述了系统在第一个时刻处于各个隐状态的概率。

经济学案例:用HMM识别商业周期

让我们用一个简化的模型来识别经济是处于 扩张(Expansion) 还是 衰退(Recession)

  • 隐状态 Z: {0: 扩张, 1: 衰退}
  • 观测 X: 我们观察每个季度的GDP增长率,并将其简化为三个等级:{0: 负增长, 1: 低增长(0-2%), 2: 高增长(>2%)}

我们的任务是

根据观测到的GDP增长序列,推断出最可能的经济状态(扩张/衰退)序列。

HMM 参数设置: 转移矩阵 A

矩阵 A 代表了经济周期的“惯性”。

\[ \begin{aligned} A&=\begin{pmatrix} P(\text{扩}|\text{扩}) & P(\text{衰}|\text{扩}) \\ P(\text{扩}|\text{衰}) & P(\text{衰}|\text{衰}) \end{pmatrix}\\[4pt] &=\begin{pmatrix} 0.9 & 0.1 \\ 0.3 & 0.7 \end{pmatrix}. \end{aligned} \]

  • 解读:
    • 如果本季度是扩张,那么下个季度有90%的概率继续扩张。
    • 如果本季度是衰退,那么下个季度有70%的概率继续衰退(衰退比扩张更“不稳定”)。

HMM 参数设置: 发射矩阵 B

矩阵 B 代表了不同经济状态下的典型产出表现。

\[ \begin{aligned} B_{jk}&=P(x_t=k\mid z_t=j),\\[2pt] B&=\begin{pmatrix}0.05&0.45&0.50\\0.60&0.35&0.05\end{pmatrix}. \end{aligned} \]

  • 解读:
    • 在扩张期,最可能出现高增长(50%);在衰退期,最可能出现负增长(60%)。

HMM 参数设置: 初始分布 \(\pi\)

\(\pi\) 代表我们对 t=1 时刻经济状态的先验信念。

\[ \large{\pi = \begin{pmatrix} P(z_1=\text{扩}) \\ P(z_1=\text{衰}) \end{pmatrix} = \begin{pmatrix} 0.8 \\ 0.2 \end{pmatrix}} \]

  • 解读: 我们认为在序列开始时,经济有80%的可能处于扩张期。

HMM 要解决的三个核心问题

有了模型 \(\lambda = (A, B, \pi)\) 后,HMM理论主要解决三个问题。

HMM 要解决的三个核心问题 图示主题为“HMM 要解决的三个核心问题”。主要标签包括:隐马尔可夫模型 (HMM) 的三个核心问题、给定: 模型 λ=(A,B,π) & 观测序列 X、1. 评估 (Evaluation)、模型与数据有多匹配?、计算 P(X|λ)、前向算法 (Forward Algorithm)、2. 解码 (Decoding)、发生了什么?;这些元素共同展示该页的关系、比较或流程。 隐马尔可夫模型 (HMM) 的三个核心问题 给定: 模型 λ=(A,B,π) & 观测序列 X 1. 评估 模型匹配度 计算 P(X|λ) 前向算法 2. 解码 发生了什么? 寻找最可能的 隐状态序列 Z Viterbi 3. 学习 估计参数 最大化 P(X|λ) Baum-Welch

HMM 总结

  • HMM是分析时间序列的强大工具,是DBN的一个重要特例。
  • 它通过区分“隐状态”和“观测”来对复杂系统建模。
  • 其核心是三个参数 \((A, B, \pi)\) 和解决三个核心问题(评估、解码、学习)的经典算法。
  • 在经济学中,它被广泛用于识别商业周期、金融市场状态切换(牛市/熊市)等。

9.3 无向图:马尔可夫网络

从有向分解到无向分解

  • 贝叶斯网络的箭头适合表示有向的条件概率分解;当相互作用是对称的,或者我们不愿指定有向父子顺序时,无向图更自然。

  • 因果语义是另一层建模承诺,不能由“有向/无向”二分替代。

  • 社交网络: 我是你的朋友,你也是我的朋友。

  • 图像像素: 一个像素的颜色和它周围的像素颜色高度相关,但谁也不是谁的“原因”。

  • 空间经济学: 一个地区的房价与邻近地区的房价相互影响。

什么是马尔可夫随机场 (MRF)?

对于这类问题,马尔可夫随机场 (Markov Random Field, MRF) 或称为 概率无向图模型 (PUGM) 是更自然的选择。

一个MRF由两部分定义:

  1. 一个 无向图 \(G=(\mathcal{V}, \mathcal{E})\),节点代表随机变量,边代表它们之间的直接依赖关系。
  2. 一组 势函数 (Potential Functions) \(\phi_C(\mathbf{x}_C)\),定义在图的“团 (clique)”上,用于量化变量间的“相容性”。

无向图中的条件独立性:简单得多!

与D-分离的复杂规则不同,无向图中的条件独立性非常直观:

如果从节点集合 A 到节点集合 B 的所有路径都必须经过节点集合 C,那么 A 和 B 在给定 C 的条件下是条件独立的。

换句话说,C 分隔 (separates) 了 A 和 B

案例:从无向图中读取独立性

案例:从无向图中读取独立性 图示主题为“案例:从无向图中读取独立性”。主要标签包括:马尔可夫随机场中的分离 (Separation in MRFs)、给定观测节点B (绿色),节点A与节点{C, D}之间的路径被阻断。、结论: A ⊥ {C, D} | B、A、B、C、D;这些元素共同展示该页的关系、比较或流程。 马尔可夫随机场中的分离 (Separation in MRFs) 给定观测节点B (绿色),节点A与节点{C, D}之间的路径被阻断。 结论: A ⊥ {C, D} | B A B C D

MRF 条件独立性:三种马尔可夫性质

  1. 全局马尔可夫性:
    • \(A \perp B | C\) 如果 C 分隔了 A 和 B。 (刚才讲的)
  2. 局部马尔可夫性:
    • 一个节点在给定其所有 邻居 的条件下,与其所有其他节点条件独立。
    • 邻居 (Neighbors) 或 马尔可夫毯 (Markov Blanket) 是指直接与该节点有边相连的节点集合。
  3. 成对马尔可夫性:
    • 任何两个 不直接相连 的节点,在给定所有其他节点的条件下,是条件独立的。
  • 对任意分布,全局性质推出局部性质,局部性质再推出成对性质;

  • 只有当联合分布在完整乘积状态空间的每一个联合配置 \(\mathbf{x}\) 上都满足 \(p(\mathbf{x})>0\)(不存在结构零)时,反向推论也成立,三者才等价。

联合概率分解:团与势函数

无向图的联合概率如何分解?答案是通过 团 (Clique)

  • 团 (Clique): 图中的一个节点子集,其中任意两个节点之间都有一条边。它们是图中的“全连接”子图。
  • 极大团 (Maximal Clique): 一个团,如果再加入任何一个节点,它就不再是团了。

MRF的联合概率分布可以被分解为定义在 极大团 上的势函数的乘积。

案例:识别极大团

案例:识别极大团 图示主题为“案例:识别极大团”。主要标签包括:无向图中的极大团 (Maximal Cliques)、A、B、C、D、E、极大团、{A, B, E};这些元素共同展示该页的关系、比较或流程。 无向图中的极大团 (Maximal Cliques) A B C D E 极大团 {A, B, E} {B, C} {D, E}

势函数 (Potential Function)

  • 对于图中的每个极大团 \(C\),我们定义一个 势函数 \(\psi_C(\mathbf{x}_C)\)
  • 这个函数输入该团中所有变量的一种特定取值组合 \(\mathbf{x}_C\),输出一个 非负的实数
  • 直观意义:
    • 这个数值代表了该团内的变量处于这种特定状态的“相容性”或“偏好度”。

    • 数值越大,意味着这种状态组合越“和谐”,其出现的概率也越高。

  • 重要: 它不是概率!它只是一个分数。

Hammersley-Clifford 定理

这个重要的定理建立了MRF的联合概率分布与势函数之间的桥梁:

  • 正性条件: 联合分布必须在完整状态空间上严格为正,即 \(P(\mathbf{x})>0\)

  • 图结构条件: 该分布满足无向图 \(G\) 编码的条件独立性。

  • 分解结论: 联合概率可写成所有极大团 \(C\) 上势函数 \(\psi_C\) 的乘积:

\[ \large{P(\mathbf{x}) = \frac{1}{Z} \prod_{C \in \mathcal{C}} \psi_C(\mathbf{x}_C)} \]

其中 \(\mathcal{C}\) 是所有极大团的集合。

归一化常数 (Partition Function) Z

公式中的 \(Z\) 被称为 配分函数 (Partition Function) 或归一化常数。

\[ \large{Z = \sum_{\mathbf{x}} \prod_{C \in \mathcal{C}} \psi_C(\mathbf{x}_C)} \]

  • 它的作用:
    • 保证所有可能状态的概率之和为1。

    • 因为势函数的乘积本身不保证这一点,所以需要除以所有可能状态的势函数乘积之和,进行归一化。

  • 计算的挑战:
    • 计算 \(Z\) 通常是MRF中最困难的部分。

    • 因为它需要对所有变量的所有可能取值组合进行求和,这是一个指数级的计算量。

    • 这是MRF推理和学习的主要障碍。

BN vs. MRF 总结

特征 贝叶斯网络 (有向) 马尔可夫网络 (无向)
图结构 有向无环图 (DAG) 无向图
核心思想 条件概率因子分解 势函数/能量函数因子分解
参数化 条件概率分布 (CPDs) 极大团上的势函数
归一化 自动满足 (局部归一化) 需要全局的配分函数 Z
适用场景 有向生成模型;加上因果假设后可表达因果模型 对称相互作用、空间或判别模型
可解释性 强,易于理解 较弱,势函数不直观

9.3.3 条件随机场 (CRF)

生成模型 vs. 判别模型

  • 生成模型 (Generative): 对联合概率 \(P(X, Z)\) 建模。它学习数据是如何“生成”的。
    • 例子: HMM, 贝叶斯网络。
    • 能力: 可以用来生成新的样本数据。
  • 判别模型 (Discriminative): 直接对我们更关心的条件概率 \(P(Z|X)\) 建模。它学习如何“区分”不同的Z。
    • 例子: 逻辑回归, CRF
    • 能力: 通常在分类和预测任务上表现更好。

CRF 的核心优势

条件随机场 (Conditional Random Field, CRF) 是一种特殊的MRF,它是一个判别模型。

  • 与HMM的比较:
    • CRF可以放宽HMM的观测独立性假设。

    • 在CRF中,当前状态 \(z_t\) 的概率可以依赖于整个观测序列 \(X\) 中的任何特征,这使得模型更加强大和灵活。

线性链CRF (Linear-Chain CRF)

最常见的CRF是线性链CRF,专门用于处理序列数据。

它的条件概率 \(P(Z|X)\) 的形式为:

\[ \large{P(Z|X) = \frac{1}{Z(X)} \exp\left( \sum_{t,k} \lambda_k f_k(z_{t-1}, z_t, X, t) \right)} \]

  • \(f_k\) 称为 特征函数,它可以是关于状态和观测的任何函数 (例如,“如果当前词是’银行’,且前一个词是’国家’”)。
  • \(\lambda_k\) 是每个特征的权重,需要从数据中学习。
  • \(Z(X)\) 是依赖于观测序列 \(X\) 的配分函数。

9.4 因子图与和积算法

为何需要一个统一的框架?

我们已经学习了有向图和无向图,它们都表示了联合概率的因子分解,但方式不同。

  • 有向图: \(P(\mathbf{x}) = \prod_i P(x_i | \text{parents}(x_i))\)
  • 无向图: \(P(\mathbf{x}) = \frac{1}{Z} \prod_C \psi_C(\mathbf{x}_C)\)

有没有一种更通用的表示法,能够统一这两种模型,并为通用推理算法提供基础?

答案是 因子图 (Factor Graph)

因子图:一种更精细的表示

因子图是一种二部图,它显式地表示了全局函数(如联合概率)是如何分解成一系列局部函数(因子)的乘积的。

  • 两类节点:
    1. 变量节点 (Variable Nodes): 通常画成圆形,代表随机变量。
    2. 因子节点 (Factor Nodes): 通常画成方形,代表全局函数中的一个因子。
  • : 一条边只存在于变量节点和因子节点之间。一个变量节点与一个因子节点相连,当且仅当该变量出现在该因子中。

案例:将贝叶斯网络转换为因子图

回顾学生BN的分解:\(P(\cdot) = P(I) P(D) P(S|I) P(G|I,D) P(L|G)\)

案例:将贝叶斯网络转换为因子图 图示主题为“案例:将贝叶斯网络转换为因子图”。主要标签包括:贝叶斯网络到因子图的转换 (BN to Factor Graph)、I、D、S、G、L、P(S|I)、P(G|I,D);这些元素共同展示该页的关系、比较或流程。 贝叶斯网络到因子图的转换 (BN to Factor Graph) I D S G L P(S|I) P(G|I,D) P(L|G) P(I) P(D)

案例:MRF 转换为因子图

回顾MRF的分解:\(P(\mathbf{x}) \propto \psi_1(A,B,E) \psi_2(B,C) \psi_3(E,D)\)

案例:将马尔可夫网络转换为因子图 图示主题为“案例:将马尔可夫网络转换为因子图”。主要标签包括:马尔可夫网络到因子图的转换 (MRF to Factor Graph)、P(x) ∝ ψ₁(A,B,E) ψ₂(B,C) ψ₃(E,D)、A、B、E、C、D、ψ₁;这些元素共同展示该页的关系、比较或流程。 马尔可夫网络到因子图(MRF → Factor Graph) P(x) ∝ ψ₁(A,B,E) ψ₂(B,C) ψ₃(E,D) A B E C D ψ₁ ψ₂ ψ₃

因子图的优势

  • 显式展示一种分解:
    • 给定所选因子集合后,因子图把每个局部函数与所含变量画清楚;

    • 但同一全局函数仍可通过合并、拆分或重新参数化因子得到不同因子图,因此表示并不唯一。

  • 通用算法: 许多重要的推理算法,如 置信传播,在因子图上定义最为清晰和通用。

通用推理算法:置信传播 (Belief Propagation)

置信传播 (Belief Propagation, BP),也称为 和积算法 (Sum-Product Algorithm),是一种在图模型上进行高效精确推理的通用算法。

  • 目标: 计算每个单变量的 边际概率 (Marginal Probability) \(P(x_i)\)
  • 核心思想: 算法通过在因子图的边上传递“消息 (messages)”来工作。这可以看作是节点之间相互“告知”它们对变量状态的“信念”。
  • 收敛:
    • 没有环的图(即树结构)上,该算法传递有限次消息后会收敛,并得到精确的边际概率。

    • 在有环的图上(Loopy BP),算法不保证收敛或得到精确解,但常常在实践中效果很好。

和积算法的直觉:分配律

为什么这个算法高效?因为它巧妙地利用了分配律来避免重复计算。

考虑计算边际概率 \(P(x_1) = \sum_{x_2, x_3, x_4} P(x_1,x_2,x_3,x_4)\) 假设 \(P(\mathbf{x}) \propto f_1(x_1,x_2) f_2(x_2,x_3) f_3(x_3,x_4)\)

暴力计算

对每个 \(x_1\) 的取值,遍历所有 \(x_2, x_3, x_4\) 的组合。

和积算法 (智能计算):

\[ \large{P(x_1) \propto \sum_{x_2} f_1(x_1, x_2) \left( \sum_{x_3} f_2(x_2, x_3) \left( \sum_{x_4} f_3(x_3, x_4) \right) \right)} \]

我们把求和符号尽可能地向内推,先对最里面的变量求和,然后将结果作为一个“消息”传递出去。这正是和积算法消息传递的数学本质。

本地真实数据小练习:观测条件概率,不是干预效应

使用江苏恒瑞医药 600276.XSHG 的本地前复权日行情,估计“今天下跌且成交量偏高”条件下“下一交易日下跌”的经验概率。

Code
from pathlib import Path  # 使用统一路径对象定位数据文件
import pandas as pd  # 读取HDF5并计算离散条件概率表

# 公网下载:https://assets.qiufei.site/data/stock/stock_price_pre_adjusted.h5
# 下载后把下一行改为本机文件位置;按课程结构存放时可用 Path("data/stock/stock_price_pre_adjusted.h5")。
# Windows:Path(r"C:\qiufei\data\stock\stock_price_pre_adjusted.h5")
# macOS:Path("/Users/你的用户名/data/stock/stock_price_pre_adjusted.h5")
# Linux:Path("/home/你的用户名/data/stock/stock_price_pre_adjusted.h5")
price_path = Path("/home/ubuntu/r2_data_mount/data/stock/stock_price_pre_adjusted.h5")
price_columns = ['close', 'volume']  # 只选择本练习所需字段以减少内存
hengrui_prices = pd.read_hdf(price_path, key='data', where='order_book_id == "600276.XSHG"', columns=price_columns).reset_index()  # 选择长三角代表公司
hengrui_prices['date'] = pd.to_datetime(hengrui_prices['date'])  # 统一交易日类型
hengrui_prices = hengrui_prices.query("'2015-01-01' <= date <= '2024-12-31'").sort_values('date')  # 固定样本期并保持时序
today_return = hengrui_prices['close'].pct_change()  # 先保留首日不可得收益为缺失
rolling_volume_median = hengrui_prices['volume'].rolling(20).median()  # 先保留热身窗口为缺失
next_return = today_return.shift(-1)  # 直接对齐下一交易日收益并保留末日缺失
hengrui_prices['today_down'] = today_return.lt(0).where(today_return.notna()).astype('Int64')  # 仅在收益可得时离散化
hengrui_prices['volume_high'] = hengrui_prices['volume'].gt(rolling_volume_median).where(rolling_volume_median.notna()).astype('Int64')  # 仅在20日窗口完整时离散化
hengrui_prices['next_day_down'] = next_return.lt(0).where(next_return.notna()).astype('Int64')  # 仅在下一日收益可得时构造结果
observational_table = hengrui_prices.dropna().groupby(['today_down', 'volume_high'])['next_day_down'].agg(['mean', 'size'])  # 计算经验条件概率与样本量
display(observational_table)  # 展示所有条件组合而不预填运行数值
mean size
today_down volume_high
0 0 0.505942 589
1 0.496933 652
1 0 0.465008 643
1 0.472486 527
  • 解释答案:
    • 表中 mean\(P(\text{next down}\mid\text{today state, volume state})\) 的样本估计。

    • 它不等于强制改变成交量后的 \(P(\text{next down}\mid do(\text{volume high}))\),因为消息、波动和流动性等共同原因未被识别。

  • 真实输出: 四格 (today_down, volume_high)=(0,0),(0,1),(1,0),(1,1) 的下一日下跌率为 0.5059、0.4969、0.4650、0.4725,样本量为 589、652、643、527。

本讲回顾:先作答再揭示

  1. 在链 \(A\rightarrow B\rightarrow C\) 中,给定 B 后 A 与 C 是否 d-分离?
  2. 在碰撞点 \(A\rightarrow B\leftarrow C\) 中,不给定 B 与给定 B 时分别如何?

揭示与补救

第 1 题是;第 2 题是不观测时分离、观测 B 或其后代时路径打开。任一题错时回到“三种基本结构”,逐路径标记非碰撞点与碰撞点。

综合练习:另一家长三角公司

  • 综合练习:
    • 把公司改为另一家长三角非金融公司。

    • 数据:说明文件、key 和日期,不使用未来信息构造状态。

    • 证据:报告四个条件单元的样本量与概率,并正确解释 d-分离。

    • 边界:说明为何公司间差异不能直接归因于成交量。

Code
from pathlib import Path  # 使用统一路径对象定位数据文件
transfer_code = '600104.XSHG'  # 选择上海汽车集团作为长三角非金融迁移公司
# 公网下载:https://assets.qiufei.site/data/stock/stock_price_pre_adjusted.h5
# 下载后把下一行改为本机文件位置;按课程结构存放时可用 Path("data/stock/stock_price_pre_adjusted.h5")。
# Windows:Path(r"C:\qiufei\data\stock\stock_price_pre_adjusted.h5")
# macOS:Path("/Users/你的用户名/data/stock/stock_price_pre_adjusted.h5")
# Linux:Path("/home/你的用户名/data/stock/stock_price_pre_adjusted.h5")
price_path = Path("/home/ubuntu/r2_data_mount/data/stock/stock_price_pre_adjusted.h5")
transfer_prices = pd.read_hdf(price_path, key='data', where=f'order_book_id == "{transfer_code}"', columns=price_columns).reset_index()  # 选择性读取同一最小字段
transfer_prices['date'] = pd.to_datetime(transfer_prices['date'])  # 统一交易日类型
transfer_prices = transfer_prices.query("'2015-01-01' <= date <= '2024-12-31'").sort_values('date')  # 固定与示范相同样本期
transfer_return = transfer_prices['close'].pct_change()  # 保留首日不可得收益为缺失
transfer_volume_median = transfer_prices['volume'].rolling(20).median()  # 保留热身窗口为缺失
transfer_next_return = transfer_return.shift(-1)  # 对齐下一交易日收益并保留末日缺失
transfer_prices['today_down'] = transfer_return.lt(0).where(transfer_return.notna()).astype('Int64')  # 只离散化可得当日收益
transfer_prices['volume_high'] = transfer_prices['volume'].gt(transfer_volume_median).where(transfer_volume_median.notna()).astype('Int64')  # 只离散化完整滚动窗口
transfer_prices['next_day_down'] = transfer_next_return.lt(0).where(transfer_next_return.notna()).astype('Int64')  # 只离散化可得下一日收益
transfer_table = transfer_prices.dropna().groupby(['today_down', 'volume_high'])['next_day_down'].agg(['mean', 'size'])  # 计算四个经验条件单元
display(transfer_table.round(4))  # 展示完整参考输出
mean size
today_down volume_high
0 0 0.5044 563
1 0.5046 656
1 0 0.4817 683
1 0.4872 509

综合练习:结果与解释

  • 完整参考输出:
    • 四格 (today_down, volume_high)=(0,0),(0,1),(1,0),(1,1) 的下一日下跌率分别为 0.5044、0.5046、0.4817、0.4872,样本量为 563、656、683、509。

    • 高成交量组与低成交量组差异都很小;

    • 即使差异较大,也只能解释为观测关联,因为消息、波动和流动性可能同时影响成交量与下一日收益。

  • 答题提示: 若写成“提高成交量导致次日下跌”,回到 conditioning/intervention;若未报告四格样本量,回到经验条件概率的支持度。

来源与延伸阅读

  • Koller, D. and Friedman, N. (2009), Probabilistic Graphical Models, MIT Press。
  • Pearl, J. (2009), Causality, 2nd ed., Cambridge University Press;邻近支持 conditioning 与 intervention 的区分。
  • Lauritzen, S. L. (1996), Graphical Models, Oxford University Press。
  • 数据:本地 stock_price_pre_adjusted.h5 / data;本页经验表由代码生成。

核心内容总结:有向概率图模型

  • 维度灾难 促使我们寻找简化联合概率分布的方法。
  • 概率图模型 利用 条件独立性 将复杂分布分解为局部函数的乘积;d-分离保证图蕴含的独立性,而 d-连接本身不证明统计或因果依赖。
  • 贝叶斯网络 (有向图) 使用条件概率编码因子分解;只有额外结构因果假设成立时才可解释为因果 DAG。

拓展内容 总结:无向图与通用推理

  • 马尔可夫网络 (无向图) 使用势函数,适合建模对称关系,其联合概率由极大团上的势函数乘积给出(Hammersley-Clifford定理)。
  • 因子图 为两种模型提供了统一的、更精细的表示,是通用推理算法的基础。
  • 置信传播 (和积算法) 是在图模型上进行高效推理的核心算法,其本质是利用分配律避免重复计算。

本章关键要点

  1. 结构就是假设:图中的每一个节点和每一条边(或缺失的边)都是一个关于世界如何运作的假设。
  2. 分解是关键:将一个大的、棘手的问题分解成许多小的、可管理的问题。
  3. 推理先分语义:普通 BN 查询回答“观察到以后”,干预问题需要 do(·) 与因果可识别性。

谢谢!

问题与讨论