目录
- [1. 概述](#1. 概述)
- [2. 数据科学回顾](#2. 数据科学回顾)
- [2.1 数据科学的目标](#2.1 数据科学的目标)
- [2.2 高维联合建模的困难](#2.2 高维联合建模的困难)
- [2.3 领域知识引入依赖结构](#2.3 领域知识引入依赖结构)
- [3. 概率图模型基础](#3. 概率图模型基础)
- [4. 贝叶斯网络](#4. 贝叶斯网络)
- [4.1 从乘积规则到概率分解](#4.1 从乘积规则到概率分解)
- [4.2 一般贝叶斯网络的联合分布](#4.2 一般贝叶斯网络的联合分布)
- [4.3 回归模型中的贝叶斯视角](#4.3 回归模型中的贝叶斯视角)
- [4.4 后验分布与最大后验估计](#4.4 后验分布与最大后验估计)
- [4.5 预测新样本](#4.5 预测新样本)
- [4.6 实战:使用 pgmpy 构建学生成绩模型](#4.6 实战:使用 pgmpy 构建学生成绩模型)
- [5. 概率图模型中的条件独立](#5. 概率图模型中的条件独立)
- [5.1 条件独立的定义](#5.1 条件独立的定义)
- [5.2 三种基本图结构](#5.2 三种基本图结构)
- [5.3 explaining away 现象](#5.3 explaining away 现象)
- [5.4 有向分离(D-separation)](#5.4 有向分离(D-separation))
- [5.5 马尔可夫毯](#5.5 马尔可夫毯)
- [5.6 独立同分布与朴素贝叶斯](#5.6 独立同分布与朴素贝叶斯)
- [6. 马尔可夫网络简介](#6. 马尔可夫网络简介)
- [6.1 马尔可夫随机场](#6.1 马尔可夫随机场)
- [6.2 无向图中的马尔可夫毯](#6.2 无向图中的马尔可夫毯)
- [6.3 团与最大团](#6.3 团与最大团)
- [6.4 联合分布的因子分解](#6.4 联合分布的因子分解)
- [6.5 能量函数与玻尔兹曼分布](#6.5 能量函数与玻尔兹曼分布)
- [7. 马尔可夫网络应用示例:图像去噪](#7. 马尔可夫网络应用示例:图像去噪)
- [8. 有向图 vs. 无向图](#8. 有向图 vs. 无向图)
- [8.1 有向图转换为无向图:Moralization](#8.1 有向图转换为无向图:Moralization)
- [8.2 表达能力差异](#8.2 表达能力差异)
- [9. 链式模型推断](#9. 链式模型推断)
- [9.1 变量推断与参数估计](#9.1 变量推断与参数估计)
- [9.2 链式模型上的边缘分布](#9.2 链式模型上的边缘分布)
- [9.3 动态规划与消息传递](#9.3 动态规划与消息传递)
- [10. 树图模型推断](#10. 树图模型推断)
- [10.1 树结构](#10.1 树结构)
- [10.2 因子图](#10.2 因子图)
- [10.3 加乘算法(Sum-Product Algorithm)](#10.3 加乘算法(Sum-Product Algorithm))
1. 概述
概率图模型(Probabilistic Graphical Model)是机器学习中用来刻画多个随机变量之间依赖关系、从而高效建模联合概率分布的一类数学框架。本文基于上海交通大学张伟楠老师《机器学习》第 8 节讲义,系统梳理概率图模型的核心内容,包括数据科学视角下的概率建模、贝叶斯网络、条件独立、马尔可夫网络及其应用、链式模型推断与树图模型推断。
本讲涉及的关键知识点如下:
- 数据科学的概率建模思想
- 贝叶斯网络(有向图模型)
- 概率图模型中的条件独立与有向分离
- 马尔可夫网络(无向图模型)
- 图像去噪等马尔可夫网络应用
- 马尔可夫网络与贝叶斯网络的比较
- 链式模型上的高效推断
- 树图模型与加乘(sum-product)算法
概率图模型的价值在于:当变量维度较高时,直接列表式地估计联合分布会遇到指数级复杂度;而图模型利用变量间的条件独立结构,把联合分布分解为若干局部因子,从而既能大幅降低参数量,又能支持高效的推断算法。
2. 数据科学回顾
2.1 数据科学的目标
与物理学通过观测构建世界模型类似,数据科学的目标是从观测数据中发现数据的「基本原理」,即构建数据模型。其核心任务可以概括为两件事:
- 找到联合数据分布 p ( x ) p(x) p(x);
- 找到条件分布 p ( x 2 ∣ x 1 ) p(x_2 \mid x_1) p(x2∣x1)。
例如一个简单的用户行为建模场景中,变量包括 Interest、Gender、Age、Browsing 等。我们希望估计:
p ( Interest = Finance , Gender = Male , Age = 29 , Browsing = BBC Sports , Bloomberg Business ) p(\text{Interest} = \text{Finance},\ \text{Gender} = \text{Male},\ \text{Age} = 29,\ \text{Browsing} = \text{BBC Sports}, \text{Bloomberg Business}) p(Interest=Finance, Gender=Male, Age=29, Browsing=BBC Sports,Bloomberg Business)
以及各种条件分布,例如:
p ( Interest = Finance ∣ Browsing = BBC Sports , Bloomberg Business ) p(\text{Interest} = \text{Finance} \mid \text{Browsing} = \text{BBC Sports}, \text{Bloomberg Business}) p(Interest=Finance∣Browsing=BBC Sports,Bloomberg Business)
常见的基础分布包括高斯分布。一元高斯分布为:
p ( x ) = 1 2 π σ 2 exp ( − ( x − μ ) 2 2 σ 2 ) p(x) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp\!\left(-\frac{(x-\mu)^2}{2\sigma^2}\right) p(x)=2πσ2 1exp(−2σ2(x−μ)2)
多元高斯分布为:
p ( x ) = 1 ∣ 2 π Σ ∣ exp ( − 1 2 ( x − μ ) ⊤ Σ − 1 ( x − μ ) ) p(\mathbf{x}) = \frac{1}{\sqrt{|2\pi\Sigma|}} \exp\!\left(-\frac{1}{2}(\mathbf{x}-\boldsymbol{\mu})^\top \Sigma^{-1} (\mathbf{x}-\boldsymbol{\mu})\right) p(x)=∣2πΣ∣ 1exp(−21(x−μ)⊤Σ−1(x−μ))
2.2 高维联合建模的困难
以「温度」和「穿衣」两个变量为例,直接建表只需维护 2 × 2 = 4 2 \times 2 = 4 2×2=4 个概率值。但当变量增多时,例如 Temperature、Cloth、Gender、Weekday 四个变量,直接建模需要维护 2 × 2 × 2 × 7 = 56 2 \times 2 \times 2 \times 7 = 56 2×2×2×7=56 个概率值,并且随着变量数增加呈指数级增长。因此,直接列表式建模高维联合分布是不可行的,需要寻找更紧凑的表示方式。
2.3 领域知识引入依赖结构
一种自然的思路是利用领域知识引入变量之间的依赖关系。例如在温度与穿衣的例子中,人们根据温度选择穿衣,因此穿衣变量取决于温度变量。于是可以把联合分布写成:
p ( t , c ) = p ( t ) p ( c ∣ t ) p(t, c) = p(t)\, p(c \mid t) p(t,c)=p(t)p(c∣t)
这样只需要估计先验 p ( t ) p(t) p(t) 和条件分布 p ( c ∣ t ) p(c \mid t) p(c∣t),参数规模大幅下降。概率图模型正是把这种领域知识所描述的依赖结构形式化的一种方法。
3. 概率图模型基础
图模型可以分为两大类:
- 贝叶斯网络(Bayesian Network):基于有向无环图(DAG)的模型;
- 马尔可夫网络(Markov Network):基于无向图的模型。
在温度与穿衣的例子中,两种图模型的表示分别为:
p ( t , c ) = p ( t ) p ( c ∣ t ) (贝叶斯网络) p(t, c) = p(t)\, p(c \mid t) \quad \text{(贝叶斯网络)} p(t,c)=p(t)p(c∣t)(贝叶斯网络)
p ( t , c ) = e ϕ ( t , c ) ∑ t ′ , c ′ e ϕ ( t ′ , c ′ ) (马尔可夫网络) p(t, c) = \frac{e^{\phi(t, c)}}{\sum_{t', c'} e^{\phi(t', c')}} \quad \text{(马尔可夫网络)} p(t,c)=∑t′,c′eϕ(t′,c′)eϕ(t,c)(马尔可夫网络)
贝叶斯网络把概率分解为局部条件分布的乘积,而马尔可夫网络则通过势函数定义未归一化的概率分布,再由配分函数归一化。
4. 贝叶斯网络
4.1 从乘积规则到概率分解
考虑任意的三元联合分布 p ( a , b , c ) p(a, b, c) p(a,b,c),运用概率乘积规则可以写成:
p ( a , b , c ) = p ( c ∣ a , b ) p ( a , b ) = p ( c ∣ a , b ) p ( b ∣ a ) p ( a ) p(a, b, c) = p(c \mid a, b)\, p(a, b) = p(c \mid a, b)\, p(b \mid a)\, p(a) p(a,b,c)=p(c∣a,b)p(a,b)=p(c∣a,b)p(b∣a)p(a)
这种分解可以用一张图来表示:节点 a a a、 b b b、 c c c 之间若全连接,则分解对 a , b , c a, b, c a,b,c 不对称。当图结构变稀疏时,联合分布的形式也随之简化。
4.2 一般贝叶斯网络的联合分布
对于一个 7 维分布,可以按照图结构分解为:
p ( x 1 , ... , x 7 ) = p ( x 1 ) p ( x 2 ) p ( x 3 ) p ( x 4 ∣ x 1 , x 2 , x 3 ) p ( x 5 ∣ x 1 , x 3 ) p ( x 6 ∣ x 4 ) p ( x 7 ∣ x 4 , x 5 ) p(x_1, \dots, x_7) = p(x_1)\, p(x_2)\, p(x_3)\, p(x_4 \mid x_1, x_2, x_3)\, p(x_5 \mid x_1, x_3)\, p(x_6 \mid x_4)\, p(x_7 \mid x_4, x_5) p(x1,...,x7)=p(x1)p(x2)p(x3)p(x4∣x1,x2,x3)p(x5∣x1,x3)p(x6∣x4)p(x7∣x4,x5)
更一般地,具有 K K K 个节点的有向图的联合分布为:
p ( x ) = ∏ k = 1 K p ( x k ∣ p a k ) p(\mathbf{x}) = \prod_{k=1}^{K} p(x_k \mid \mathrm{pa}_k) p(x)=k=1∏Kp(xk∣pak)
其中 p a k \mathrm{pa}_k pak 表示节点 x k x_k xk 的父节点集合。一个重要的限制是:贝叶斯网络对应的有向图必须是有向无环图(DAG)。
4.3 回归模型中的贝叶斯视角
以线性回归为例,训练数据 D = { ( x i , t i ) } D = \{(x_i, t_i)\} D={(xi,ti)}。假设模型带有高斯观测噪声,则先验与似然可以写成:
p ( w ∣ α ) = N ( w ∣ 0 , α ) p(\mathbf{w} \mid \alpha) = \mathcal{N}(\mathbf{w} \mid \mathbf{0}, \alpha) p(w∣α)=N(w∣0,α)
p ( t i ∣ x i , w , σ 2 ) = N ( t i ∣ w ⊤ x i , σ 2 ) p(t_i \mid x_i, \mathbf{w}, \sigma^2) = \mathcal{N}(t_i \mid \mathbf{w}^\top x_i, \sigma^2) p(ti∣xi,w,σ2)=N(ti∣w⊤xi,σ2)
联合分布为:
p ( t , w ∣ x , α , σ 2 ) = p ( w ∣ α ) ∏ i = 1 N p ( t i ∣ x i , w , σ 2 ) p(\mathbf{t}, \mathbf{w} \mid \mathbf{x}, \alpha, \sigma^2) = p(\mathbf{w} \mid \alpha) \prod_{i=1}^{N} p(t_i \mid x_i, \mathbf{w}, \sigma^2) p(t,w∣x,α,σ2)=p(w∣α)i=1∏Np(ti∣xi,w,σ2)
4.4 后验分布与最大后验估计
观测到 { t n } \{t_n\} {tn} 后,参数的后验分布为:
p ( w ∣ t ) = p ( w ) p ( t ∣ w ) p ( t ) ∝ p ( w ) ∏ i = 1 N p ( t i ∣ w ) p(\mathbf{w} \mid \mathbf{t}) = \frac{p(\mathbf{w})\, p(\mathbf{t} \mid \mathbf{w})}{p(\mathbf{t})} \propto p(\mathbf{w}) \prod_{i=1}^{N} p(t_i \mid \mathbf{w}) p(w∣t)=p(t)p(w)p(t∣w)∝p(w)i=1∏Np(ti∣w)
对参数 w \mathbf{w} w 做最大后验估计(MAP),即最大化 p ( w ∣ t ) p(\mathbf{w} \mid \mathbf{t}) p(w∣t),等价于最小化:
σ 2 α d ∥ w ∥ 2 + ∑ i = 1 N ( t i − w ⊤ x i ) 2 \frac{\sigma^2}{\alpha_d} \|\mathbf{w}\|^2 + \sum_{i=1}^{N} \left(t_i - \mathbf{w}^\top x_i\right)^2 αdσ2∥w∥2+i=1∑N(ti−w⊤xi)2
这正是平方损失下的岭回归。这说明从贝叶斯角度理解线性回归时,L2 正则项来源于参数的高斯先验。
4.5 预测新样本
给定新输入 x ^ \hat{x} x^,预测标签 t ^ \hat{t} t^ 的分布时,先写出联合分布:
p ( t ^ , t , w ∣ x ^ , x , α , σ 2 ) = ∏ i = 1 N p ( t i ∣ x i , w , σ 2 ) p ( w ∣ α ) p ( t ^ ∣ x ^ , w , σ 2 ) p(\hat{t}, \mathbf{t}, \mathbf{w} \mid \hat{x}, \mathbf{x}, \alpha, \sigma^2) = \prod_{i=1}^{N} p(t_i \mid x_i, \mathbf{w}, \sigma^2)\, p(\mathbf{w} \mid \alpha)\, p(\hat{t} \mid \hat{x}, \mathbf{w}, \sigma^2) p(t^,t,w∣x^,x,α,σ2)=i=1∏Np(ti∣xi,w,σ2)p(w∣α)p(t^∣x^,w,σ2)
然后对参数 w \mathbf{w} w 边缘化:
p ( t ^ ∣ x ^ , x , t , α , σ 2 ) ∝ ∫ p ( t ^ , t , w ∣ x ^ , x , α , σ 2 ) d w p(\hat{t} \mid \hat{x}, \mathbf{x}, \mathbf{t}, \alpha, \sigma^2) \propto \int p(\hat{t}, \mathbf{t}, \mathbf{w} \mid \hat{x}, \mathbf{x}, \alpha, \sigma^2)\, d\mathbf{w} p(t^∣x^,x,t,α,σ2)∝∫p(t^,t,w∣x^,x,α,σ2)dw
这种「边缘化参数」的做法体现了贝叶斯预测的核心思想:不是只用点估计,而是对参数的不确定性进行积分。
4.6 实战:使用 pgmpy 构建学生成绩模型
下面使用 pgmpy 构建一个经典的"课程难度---智力水平---成绩---SAT---推荐信"贝叶斯网络:先定义网络结构与条件概率表,再使用变量消元法完成后验概率推断和最大后验查询。
python
# 安装:pip install pgmpy
from pgmpy.models import BayesianNetwork
from pgmpy.factors.discrete import TabularCPD
from pgmpy.inference import VariableElimination
# 1. 定义网络结构
# Difficulty 和 Intelligence 共同影响 Grade;
# Intelligence 影响 SAT 成绩,Grade 影响推荐信 Letter。
student_model = BayesianNetwork([
("Difficulty", "Grade"),
("Intelligence", "Grade"),
("Intelligence", "SAT"),
("Grade", "Letter")
])
# 2. 定义条件概率表 CPT
# P(Difficulty)
cpd_difficulty = TabularCPD(
variable="Difficulty",
variable_card=2,
values=[[0.6], [0.4]],
state_names={"Difficulty": ["Easy", "Hard"]}
)
# P(Intelligence)
cpd_intelligence = TabularCPD(
variable="Intelligence",
variable_card=2,
values=[[0.7], [0.3]],
state_names={"Intelligence": ["Low", "High"]}
)
# P(SAT | Intelligence)
cpd_sat = TabularCPD(
variable="SAT",
variable_card=2,
values=[
[0.95, 0.2], # P(SAT=Low | Intelligence=Low, High)
[0.05, 0.8] # P(SAT=High | Intelligence=Low, High)
],
evidence=["Intelligence"],
evidence_card=[2],
state_names={"SAT": ["Low", "High"], "Intelligence": ["Low", "High"]}
)
# P(Grade | Difficulty, Intelligence)
# 三行分别对应 Grade = A/B/C
cpd_grade = TabularCPD(
variable="Grade",
variable_card=3,
values=[
[0.3, 0.05, 0.9, 0.5], # P(Grade=A | Easy,Low / Easy,High / Hard,Low / Hard,High)
[0.4, 0.25, 0.08, 0.3], # P(Grade=B | ...)
[0.3, 0.7, 0.02, 0.2] # P(Grade=C | ...)
],
evidence=["Difficulty", "Intelligence"],
evidence_card=[2, 2],
state_names={
"Grade": ["A", "B", "C"],
"Difficulty": ["Easy", "Hard"],
"Intelligence": ["Low", "High"]
}
)
# P(Letter | Grade)
cpd_letter = TabularCPD(
variable="Letter",
variable_card=2,
values=[
[0.1, 0.4, 0.99], # P(Letter=Weak | Grade=A/B/C)
[0.9, 0.6, 0.01] # P(Letter=Strong | Grade=A/B/C)
],
evidence=["Grade"],
evidence_card=[3],
state_names={"Letter": ["Weak", "Strong"], "Grade": ["A", "B", "C"]}
)
# 将 CPD 注册到网络中,并检查模型是否有效
student_model.add_cpds(cpd_difficulty, cpd_intelligence, cpd_sat,
cpd_grade, cpd_letter)
assert student_model.check_model()
# 3. 使用变量消元法进行后验概率推断
infer = VariableElimination(student_model)
# 已知"课程难度高"且"智力水平高",推断成绩等级的后验分布
posterior_grade = infer.query(
variables=["Grade"],
evidence={"Intelligence": "High", "Difficulty": "Hard"}
)
print("P(Grade | Intelligence=High, Difficulty=Hard):")
print(posterior_grade)
# 运行结果:
# P(Grade=A) = 0.5000
# P(Grade=B) = 0.3000
# P(Grade=C) = 0.2000
# 已知 SAT 成绩为高分,反向推断智力水平为高的概率
posterior_intel = infer.query(
variables=["Intelligence"],
evidence={"SAT": "High"}
)
print("P(Intelligence | SAT=High):")
print(posterior_intel)
# 运行结果:
# P(Intelligence=Low) ≈ 0.1273
# P(Intelligence=High) ≈ 0.8727
# 4. 最大后验推断:已知成绩为 A 时,找出最可能的 Difficulty 和 Intelligence 组合
map_query = infer.map_query(
variables=["Difficulty", "Intelligence"],
evidence={"Grade": "A"}
)
print("MAP query, P(Difficulty, Intelligence | Grade=A):")
print(map_query)
# 运行结果:
# {'Difficulty': 'Hard', 'Intelligence': 'Low'}
该示例完整展示了贝叶斯网络的图结构定义、局部条件概率设置以及基于证据的后验推断。相比于逐项列出联合概率表,这种因子化表示能显著减少待估计参数,并且推理过程可以直接由 VariableElimination 等图模型推理算法高效完成。
此外,还可以单独使用 networkx 构建同样的有向图,并借助 matplotlib 把学生成绩贝叶斯网络的结构可视化出来:
python
# 安装:pip install matplotlib networkx
import networkx as nx
import matplotlib.pyplot as plt
# 1. 定义与 pgmpy 学生成绩模型一致的有向边
edges = [
("Difficulty", "Grade"),
("Intelligence", "Grade"),
("Intelligence", "SAT"),
("Grade", "Letter"),
]
# 2. 构建有向图并添加五个节点
G = nx.DiGraph()
G.add_nodes_from(["Difficulty", "Intelligence", "Grade", "SAT", "Letter"])
G.add_edges_from(edges)
# 3. 手工指定节点坐标,便于保持上下层级关系
pos = {
"Difficulty": (0.0, 1.0),
"Intelligence": (1.0, 1.0),
"Grade": (0.5, 0.5),
"SAT": (1.5, 0.5),
"Letter": (0.5, 0.0),
}
# 4. 使用 matplotlib 绘制带箭头的网络结构图
plt.figure(figsize=(8, 6))
nx.draw_networkx(
G,
pos=pos,
arrows=True,
node_color=["#4C72B0", "#55A868", "#C44E52", "#8172B2", "#CCB974"],
node_size=2500,
font_size=10,
font_color="white",
edge_color="gray",
width=1.5,
arrowstyle="->",
arrowsize=20,
alpha=0.9,
)
plt.title("Student Grade Bayesian Network Structure", fontsize=14)
plt.axis("off")
plt.tight_layout()
plt.show()
运行上述代码后,会弹出一张带有箭头的有向图:Difficulty 与 Intelligence 位于上层,二者都指向中部的 Grade;Intelligence 另有一条边指向 SAT;Grade 再指向下层的 Letter。箭头的方向表示条件概率中的生成依赖方向。从图中可以直观看出:Letter 在给定 Grade 后与其他变量条件独立,SAT 只受 Intelligence 影响,而 Difficulty 与 Intelligence 之间没有直接连边;由于二者都指向 Grade,当观测到 Grade 时,Difficulty 与 Intelligence 之间还可能产生 explaining away 现象。
5. 概率图模型中的条件独立
5.1 条件独立的定义
对三个变量 a , b , c a, b, c a,b,c,若给定 c c c 时 a a a 的条件分布不依赖于 b b b,即:
p ( a ∣ b , c ) = p ( a ∣ c ) p(a \mid b, c) = p(a \mid c) p(a∣b,c)=p(a∣c)
则称在给定 c c c 的条件下, a a a 与 b b b 条件独立 ,记作 a ⊥ ⊥ b ∣ c a \perp\!\!\!\perp b \mid c a⊥⊥b∣c。其等价形式为:
p ( a , b ∣ c ) = p ( a ∣ c ) p ( b ∣ c ) p(a, b \mid c) = p(a \mid c)\, p(b \mid c) p(a,b∣c)=p(a∣c)p(b∣c)
5.2 三种基本图结构
图模型最重要的能力之一,是可以直接从图结构读出变量的条件独立性质。三种基本结构如下:
- tail-to-tail(共因结构) : a ← c → b a \leftarrow c \rightarrow b a←c→b。当 c c c 未被观测 时, a a a 与 b b b 一般不 条件独立;当 c c c 被观测 时, a a a 与 b b b 条件独立。
- head-to-tail(链式结构) : a → c → b a \rightarrow c \rightarrow b a→c→b。当 c c c 未被观测时, a a a 与 b b b 不独立;当 c c c 被观测时, a a a 与 b b b 条件独立。
- head-to-head(V 结构) : a → c ← b a \rightarrow c \leftarrow b a→c←b。当 c c c 未被观测 且没有以 c c c 的后代为条件时, a a a 与 b b b 条件独立;一旦 c c c(或其某个后代)被观测 , a a a 与 b b b 反而变得非条件独立。
值得注意的是,head-to-head 结构的条件独立性质与前两种结构相反:观测中间变量会「打开」依赖路径。
5.3 explaining away 现象
一个经典例子是电池、油箱与燃油表:
- B B B:电池是否有电;
- F F F:油箱是否有油;
- G G G:燃油表是否有示数。
三者形成 head-to-head 结构,因为燃油表示数同时受电池和油箱影响。设先验 p ( B = 1 ) = 0.9 p(B=1)=0.9 p(B=1)=0.9、 p ( F = 1 ) = 0.9 p(F=1)=0.9 p(F=1)=0.9。在观测到燃油表读数为空( G = 0 G=0 G=0)时:
p ( F = 0 ∣ G = 0 ) ≈ 0.257 p(F=0 \mid G=0) \approx 0.257 p(F=0∣G=0)≈0.257
这显著高于先验 p ( F = 0 ) = 0.1 p(F=0)=0.1 p(F=0)=0.1,说明「油表为空」使「油箱没油」的概率上升。但若同时观测到电池也没电( B = 0 B=0 B=0):
p ( F = 0 ∣ G = 0 , B = 0 ) ≈ 0.111 p(F=0 \mid G=0, B=0) \approx 0.111 p(F=0∣G=0,B=0)≈0.111
「油箱没油」的概率从 0.257 降到 0.111,但仍略高于先验 0.1。其解释是:电池没电本身就可以解释油表读数为空这一现象,因此削弱了对「油箱没油」的推断,这一现象称为 explaining away。
5.4 有向分离(D-separation)
对一般有向图,设 A , B , C A, B, C A,B,C 为任意不相交节点集。若从 A A A 到 B B B 的路径上存在某个节点,满足以下任一条件,则称这条路径被阻断:
- 路径上的箭头在该节点呈 head-to-tail 或 tail-to-tail 交汇,且该节点在集合 C C C 中;
- 路径上的箭头在该节点呈 head-to-head 交汇,且该节点及其后代节点都不在 集合 C C C 中。
若所有路径都被阻断,则 A A A 与 B B B 关于 C C C 有向分离,图中所有变量的联合分布满足 A ⊥ ⊥ B ∣ C A \perp\!\!\!\perp B \mid C A⊥⊥B∣C。
5.5 马尔可夫毯
节点 x i x_i xi 的马尔可夫毯(Markov Blanket)由它的父节点、子节点以及子节点的其他父节点(共同父母)组成。其性质是: x i x_i xi 以图中所有剩余变量为条件的条件分布,只依赖于马尔可夫毯中的变量。也就是说,给定马尔可夫毯后, x i x_i xi 与图中其他变量条件独立。
5.6 独立同分布与朴素贝叶斯
在参数 μ \mu μ 下,观测数据 D D D 的联合分布为:
p ( μ ∣ D ) ∝ p ( μ ) p ( D ∣ μ ) = p ( μ ) ∏ i = 1 N p ( x i ∣ μ ) p(\mu \mid D) \propto p(\mu)\, p(D \mid \mu) = p(\mu) \prod_{i=1}^{N} p(x_i \mid \mu) p(μ∣D)∝p(μ)p(D∣μ)=p(μ)i=1∏Np(xi∣μ)
如果对 μ \mu μ 积分,则观测样本之间通常是相关的:
p ( D ) = ∫ p ( D ∣ μ ) p ( μ ) d μ ≠ ∏ i = 1 N p ( x i ) p(D) = \int p(D \mid \mu)\, p(\mu)\, d\mu \neq \prod_{i=1}^{N} p(x_i) p(D)=∫p(D∣μ)p(μ)dμ=i=1∏Np(xi)
但若以 μ \mu μ 为给定条件,从 x i x_i xi 到 x j x_j xj 的唯一路径关于 μ \mu μ 是 tail-to-tail,因此被阻断,数据样本关于模型参数是条件独立的。
朴素贝叶斯分类模型是这种思想的典型应用:类别 z \mathbf{z} z 用独热向量表示,先验为多项式分布 p ( z ∣ μ ) p(\mathbf{z} \mid \boldsymbol{\mu}) p(z∣μ);在给定类别的条件下,各特征 x j x_j xj 条件独立:
p ( x ∣ z ) = ∏ j = 1 d p ( x j ∣ z ) p(\mathbf{x} \mid \mathbf{z}) = \prod_{j=1}^{d} p(x_j \mid \mathbf{z}) p(x∣z)=j=1∏dp(xj∣z)
类标签推断为:
p ( z ∣ x ) ∝ p ( x ∣ z ) p ( z ∣ μ ) p(\mathbf{z} \mid \mathbf{x}) \propto p(\mathbf{x} \mid \mathbf{z})\, p(\mathbf{z} \mid \boldsymbol{\mu}) p(z∣x)∝p(x∣z)p(z∣μ)
在多项式朴素贝叶斯中,类别 y y y 被建模为单词的直方图,参数 θ y = ( θ y 1 , ... , θ y n ) \theta_y = (\theta_{y1}, \dots, \theta_{yn}) θy=(θy1,...,θyn),其估计为:
θ ^ y i = N y i + α N y + α d \hat{\theta}{yi} = \frac{N{yi} + \alpha}{N_y + \alpha d} θ^yi=Ny+αdNyi+α
其中 N y i N_{yi} Nyi 是类别 y y y 训练文档中单词 i i i 的出现次数, N y N_y Ny 是类别 y y y 训练文档的总词数, α \alpha α 是平滑系数。
6. 马尔可夫网络简介
6.1 马尔可夫随机场
马尔可夫网络又称马尔可夫随机场(Markov Random Field),是一种无向图模型。相较于贝叶斯网络,马尔可夫网络中条件独立性的判定更加直接:若连接 A A A 与 B B B 中任何节点的所有路径都被 C C C 中的节点阻塞,则 A A A 与 B B B 关于 C C C 条件独立。
6.2 无向图中的马尔可夫毯
对于无向图,节点 x i x_i xi 的马尔可夫毯就是它的相邻节点集合 。其性质与有向图一致:以图中所有剩余变量为条件时, x i x_i xi 的条件分布只依赖于马尔可夫毯中的变量。
6.3 团与最大团
无向图中的**团(clique)**是图中完全连接的节点子集。例如一个包含四个节点 { x 1 , x 2 , x 3 , x 4 } \{x_1, x_2, x_3, x_4\} {x1,x2,x3,x4} 的马尔可夫网络中,可能包含若干双节点团,以及两个最大团 { x 1 , x 2 , x 3 } \{x_1, x_2, x_3\} {x1,x2,x3} 与 { x 2 , x 3 , x 4 } \{x_2, x_3, x_4\} {x2,x3,x4}。注意 { x 1 , x 2 , x 3 , x 4 } \{x_1, x_2, x_3, x_4\} {x1,x2,x3,x4} 并不一定构成团。
6.4 联合分布的因子分解
马尔可夫网络把联合分布分解为团上势函数的乘积:
p ( x ) = 1 Z ∏ C ψ C ( x C ) p(\mathbf{x}) = \frac{1}{Z} \prod_{C} \psi_C(\mathbf{x}_C) p(x)=Z1C∏ψC(xC)
其中 ψ C ( x C ) \psi_C(\mathbf{x}_C) ψC(xC) 是定义在团 C C C 上的势函数 , Z Z Z 是配分函数,用于归一化:
Z = ∑ x ∏ C ψ C ( x C ) Z = \sum_{\mathbf{x}} \prod_{C} \psi_C(\mathbf{x}_C) Z=x∑C∏ψC(xC)
势函数需要满足 ψ C ( x C ) ≥ 0 \psi_C(\mathbf{x}_C) \ge 0 ψC(xC)≥0,以保证概率非负。其具体形式可以通过领域知识来定义。
6.5 能量函数与玻尔兹曼分布
若限定势函数严格为正,即 ψ C ( x C ) > 0 \psi_C(\mathbf{x}_C) > 0 ψC(xC)>0,则可以将其写成指数形式:
ψ C ( x C ) = exp ( − E ( x C ) ) \psi_C(\mathbf{x}_C) = \exp\!\left(-E(\mathbf{x}_C)\right) ψC(xC)=exp(−E(xC))
其中 E ( x C ) E(\mathbf{x}_C) E(xC) 称为能量函数。此时联合分布为:
p ( x ) = 1 Z exp ( − ∑ C E ( x C ) ) p(\mathbf{x}) = \frac{1}{Z} \exp\!\left(-\sum_{C} E(\mathbf{x}_C)\right) p(x)=Z1exp(−C∑E(xC))
这种形式称为玻尔兹曼分布(Boltzmann Distribution)。在物理中,其一般形式为:
p ( s ) = e − E ( s ) / k T ∑ s ′ e − E ( s ′ ) / k T p(s) = \frac{e^{-E(s) / kT}}{\sum_{s'} e^{-E(s') / kT}} p(s)=∑s′e−E(s′)/kTe−E(s)/kT
其中 E ( s ) E(s) E(s) 是状态能量, k k k 是玻尔兹曼常数, T T T 是热力学温度。低能状态更稳定,因此具有更高的存在概率。这一物理直觉也解释了为什么在概率建模中,能量越低的状态越被赋予更高的概率。
7. 马尔可夫网络应用示例:图像去噪
图像去噪是马尔可夫网络的典型应用。设:
- 噪声图像的二进制像素为 y i ∈ { − 1 , + 1 } y_i \in \{-1, +1\} yi∈{−1,+1};
- 真实无噪图像的像素为 x i ∈ { − 1 , + 1 } x_i \in \{-1, +1\} xi∈{−1,+1}。
噪声生成过程以较小概率(例如 10%)随机翻转部分像素符号。建模时有两个关键假设:
- x i x_i xi 与对应观测 y i y_i yi 之间有很强的相关性;
- 相邻像素 x i x_i xi 与 x j x_j xj 之间存在强相关性。
对应的马尔可夫网络中,团 { x i , y i } \{x_i, y_i\} {xi,yi}、相邻像素团 { x i , x j } \{x_i, x_j\} {xi,xj} 以及单节点 { x i } \{x_i\} {xi} 的能量分别定义为:
E ( { x i , y i } ) = − η x i y i E(\{x_i, y_i\}) = -\eta\, x_i y_i E({xi,yi})=−ηxiyi
E ( { x i , x j } ) = − β x i x j E(\{x_i, x_j\}) = -\beta\, x_i x_j E({xi,xj})=−βxixj
E ( { x i } ) = h x i E(\{x_i\}) = h\, x_i E({xi})=hxi
整理后,完整能量函数为:
E ( x , y ) = h ∑ i x i − β ∑ i , j x i x j − η ∑ i x i y i E(\mathbf{x}, \mathbf{y}) = h \sum_i x_i - \beta \sum_{i,j} x_i x_j - \eta \sum_i x_i y_i E(x,y)=hi∑xi−βi,j∑xixj−ηi∑xiyi
对应的联合分布为:
p ( x , y ) = 1 Z exp ( − E ( x , y ) ) p(\mathbf{x}, \mathbf{y}) = \frac{1}{Z} \exp\!\left(-E(\mathbf{x}, \mathbf{y})\right) p(x,y)=Z1exp(−E(x,y))
求解方法常采用迭代条件模式(Iterated Conditional Modes, ICM) 。其目标是在观测到 y \mathbf{y} y 的条件下最大化 p ( x ∣ y ) p(\mathbf{x} \mid \mathbf{y}) p(x∣y),等价于最大化 p ( x , y ) p(\mathbf{x}, \mathbf{y}) p(x,y)。ICM 采用坐标上升:对每个节点 x j x_j xj,分别比较 x j = + 1 x_j = +1 xj=+1 与 x j = − 1 x_j = -1 xj=−1 时能量的大小,选择使能量更低的状态。通过逐节点迭代更新,最终得到去噪后的图像。
下面给出一个完整的 Python 示例:先用能量函数形式定义去噪模型,再通过 ICM 对每个像素做"局部能量更低"的贪心更新。
python
import numpy as np
# 1. 生成一张简单的二值图像
rng = np.random.default_rng(0)
H, W = 60, 60
X_true = np.ones((H, W), dtype=np.int8)
X_true[:, W // 2:] = -1 # 左半边为 +1,右半边为 -1
# 2. 生成噪声图像:以 10% 的概率翻转像素
flip_prob = 0.1
noise_mask = rng.random((H, W)) < flip_prob
Y = np.where(noise_mask, -X_true, X_true).astype(np.int8)
# 3. 能量函数定义
# E(x, y) = h * sum(x) - beta * sum(x_i * x_j) - eta * sum(x_i * y_i)
def energy(x, y, h=0.0, beta=1.0, eta=2.0):
e = h * np.sum(x)
# 相邻像素项:分别统计上下相邻、左右相邻,每条边只计一次
e -= beta * np.sum(x[:-1, :] * x[1:, :])
e -= beta * np.sum(x[:, :-1] * x[:, 1:])
# 观测项:去噪结果 x 应尽量接近观测图像 y
e -= eta * np.sum(x * y)
return e
# 4. ICM 迭代更新:逐像素比较 +1 / -1 两种状态的能量
def icm_denoise(y, h=0.0, beta=1.0, eta=2.0, max_iter=10):
x = y.copy()
H, W = x.shape
for it in range(max_iter):
changed = False
# 对每个像素做坐标上升更新
for i in range(H):
for j in range(W):
energies = {}
# 分别尝试把当前像素设为 -1 和 +1
for val in (-1, 1):
x_test = x.copy()
x_test[i, j] = val
energies[val] = energy(x_test, y, h, beta, eta)
# 选择能量更低的状态,也就是后验概率更高的状态
new_val = -1 if energies[-1] < energies[1] else 1
if new_val != x[i, j]:
x[i, j] = new_val
changed = True
# 如果某一轮没有任何像素发生变化,提前停止迭代
if not changed:
break
return x
# 5. 运行 ICM 去噪并评估准确率
X_icm = icm_denoise(Y)
accuracy = np.mean(X_icm == X_true)
print(f"ICM 去噪准确率: {accuracy:.4f}")
在上述 ICM 代码中,eta 控制观测图像对去噪结果的约束强度,beta 控制相邻像素之间的平滑强度。
下面使用 matplotlib 将原始图像、噪声图像和 ICM 去噪结果并排展示,便于直观对比去噪前后的效果:
python
import matplotlib.pyplot as plt
# 1. 创建 1 行 3 列的子图
fig, axes = plt.subplots(1, 3, figsize=(15, 5))
# 2. 统一使用灰度颜色映射,并固定像素值范围
images = [
(X_true, "原始图像 X_true"),
(Y, "噪声图像 Y"),
(X_icm, "ICM 去噪结果 X_icm")
]
for ax, (img, title) in zip(axes, images):
im = ax.imshow(img, cmap="gray", vmin=-1, vmax=1)
ax.set_title(title)
ax.axis("off")
# 3. 添加颜色条,便于观察 -1/+1 对应的灰度
fig.colorbar(im, ax=axes, shrink=0.6)
plt.tight_layout()
plt.show()
在这段代码中,cmap="gray" 将像素值映射为灰度图像,vmin=-1, vmax=1 保证三张子图使用相同的灰度标尺;axis("off") 隐藏坐标轴,让读者将注意力集中在去噪前后的像素变化上。
运行上述 ICM 去噪代码后,对于这张 60×60、噪声翻转概率为 10% 的二值图像,通常可以看到:噪声图像中随机散布的反色像素会被大量修正,左右两个半区恢复得更加干净,整体准确率一般能达到 95% 以上;尤其是远离边界的大块平滑区域,去噪效果更明显。ICM 收敛后,去噪结果 X i c m X_{icm} Xicm 会显著接近真实图像 X t r u e X_{true} Xtrue,而不会完全保留噪声图像 Y Y Y。
其中,参数 beta 和 eta 对结果有直接调节作用:
beta控制相邻像素平滑项的强度 。增大beta会强化"相邻像素应尽量一致"的先验,使图像更平滑,能够更有效地消除孤立噪点;但beta过大时,真实图像中的边缘也可能被当作噪声而模糊掉,例如左右半区之间的垂直分界线可能变得不再锐利。eta控制观测图像项的强度 。增大eta会使去噪结果更忠实于观测图像 y y y,即更倾向于保留 y y y 中的像素值;当噪声较多时,这样做可能把部分噪声也保留下来。相反,若eta过小,模型会过度依赖邻域平滑先验,结果可能偏离观测图像,甚至丢失原本清晰的区域。
因此,实际使用中需要在数据拟合与先验平滑之间权衡:对于低噪声图像可以适当增大 eta,以保留更多细节;对于高噪声图像则应适当增大 beta 来抑制噪声,同时注意避免过度平滑边缘。ICM 是贪心算法,每轮只保留使能量下降的局部状态,因此在实践中通常需要多轮扫描才能收敛。
8. 有向图 vs. 无向图
8.1 有向图转换为无向图:Moralization
有向图可以转换为无向图。例如有向图:
p ( x ) = p ( x 1 ) p ( x 2 ) p ( x 3 ) p ( x 4 ∣ x 1 , x 2 , x 3 ) p(\mathbf{x}) = p(x_1)\, p(x_2)\, p(x_3)\, p(x_4 \mid x_1, x_2, x_3) p(x)=p(x1)p(x2)p(x3)p(x4∣x1,x2,x3)
转换为无向图后为:
p ( x ) = 1 Z ψ 1 , 2 , 3 , 4 ( x 1 , x 2 , x 3 , x 4 ) p(\mathbf{x}) = \frac{1}{Z}\, \psi_{1,2,3,4}(x_1, x_2, x_3, x_4) p(x)=Z1ψ1,2,3,4(x1,x2,x3,x4)
转换的关键步骤是 moralization(父节点联姻):对于具有共同子节点的父节点,在两两之间添加无向边。
8.2 表达能力差异
虽然每个有向图都可以通过(必要时加强的)moralization 转换为无向图------极端情况下使用全连接无向图------但有向图和无向图所能表达的条件独立性质并不完全相同。记 P P P 为所有可能分布, D D D 为可由有向图表示的分布, U U U 为可由无向图表示的分布,二者存在交集但互不包含。
一个典型例子是:某一有向图的 V 结构(两个父节点指向同一子节点)所产生的条件独立性质,无法用同变量集合的无向图表达;反过来,某些无向图的条件独立性质也无法用相同变量集合的有向图表达。这说明两类图模型在表达能力上各有侧重。
为便于系统比较,两类图模型的核心异同可归纳为下表:
| 对比维度 | 贝叶斯网络(有向图) | 马尔可夫网络(无向图) |
|---|---|---|
| 图结构 | 有向无环图(DAG),边通常表示因果关系或生成依赖 | 无向图,边表示变量之间的相关或兼容关系 |
| 联合分布形式 | 各节点以父节点为条件的局部条件分布乘积: p ( x ) = ∏ k = 1 K p ( x k ∣ p a k ) p(\mathbf{x})=\prod_{k=1}^{K}p(x_k\mid\mathrm{pa}_k) p(x)=∏k=1Kp(xk∣pak) | 团上势函数乘积除以配分函数: p ( x ) = 1 Z ∏ C ψ C ( x C ) p(\mathbf{x})=\frac{1}{Z}\prod_C\psi_C(\mathbf{x}_C) p(x)=Z1∏CψC(xC) |
| 参数含义 | 局部条件概率,参数本身即为归一化条件分布 | 势函数或能量函数,只要求非负,无局部归一化约束 |
| 归一化 | 局部条件概率自动归一化,无需显式配分函数 | 需要全局配分函数 Z Z Z,连续/高维场景下往往难以精确计算 |
| 条件独立判定 | D-separation:需区分 tail-to-tail、head-to-tail、head-to-head 三种结构,并考虑后代节点 | 图分离(graph separation):路径被观测节点集阻塞即可,判定更直观 |
| 马尔可夫毯 | 父节点 + 子节点 + 子节点的其他父节点 | 相邻节点集合 |
| 典型应用场景 | 朴素贝叶斯文本分类、回归/先验后验建模、因果推断等有向生成结构 | 图像去噪、空间统计、社交网络等变量间无方向依赖的建模 |
| 参数估计方法 | 最大似然估计、最大后验估计(如岭回归)、EM 算法等 | 势函数/能量函数学习,常使用极大伪似然、对比散度等方法 |
| 表达能力 | 能表达 V 结构产生的特殊条件独立性质 | 能表达有向图难以表达的对称无向依赖关系 |
9. 链式模型推断
9.1 变量推断与参数估计
概率图模型中的两类基本任务:
- 随机变量推断 :根据观测数据推断随机变量的后验分布,例如 p ( z ∣ x ) ∝ p ( z ∣ μ ) p ( x ∣ z ) p(\mathbf{z} \mid \mathbf{x}) \propto p(\mathbf{z} \mid \boldsymbol{\mu})\, p(\mathbf{x} \mid \mathbf{z}) p(z∣x)∝p(z∣μ)p(x∣z);
- 参数估计:寻找使目标函数最优的参数值,例如最小化损失或最大化似然:
θ ^ = arg min θ L ( D ; θ ) \hat{\theta} = \arg\min_{\theta} \mathcal{L}(D; \theta) θ^=argθminL(D;θ)
9.2 链式模型上的边缘分布
考虑一条链上的联合分布:
p ( x ) = 1 Z ψ 1 , 2 ( x 1 , x 2 ) ψ 2 , 3 ( x 2 , x 3 ) ⋯ ψ N − 1 , N ( x N − 1 , x N ) p(\mathbf{x}) = \frac{1}{Z}\, \psi_{1,2}(x_1, x_2)\, \psi_{2,3}(x_2, x_3) \cdots \psi_{N-1,N}(x_{N-1}, x_N) p(x)=Z1ψ1,2(x1,x2)ψ2,3(x2,x3)⋯ψN−1,N(xN−1,xN)
设 N N N 个节点各自是 K K K 状态的离散变量,每个势函数 ψ n − 1 , n \psi_{n-1,n} ψn−1,n 是一个 K × K K \times K K×K 的表,因此联合分布共有 ( N − 1 ) K 2 (N-1)K^2 (N−1)K2 个参数。
求某个变量 x n x_n xn 的边缘分布时,需要对其余变量求和:
p ( x n ) = ∑ x 1 ⋯ ∑ x n − 1 ∑ x n + 1 ⋯ ∑ x N p ( x ) p(x_n) = \sum_{x_1} \cdots \sum_{x_{n-1}} \sum_{x_{n+1}} \cdots \sum_{x_N} p(\mathbf{x}) p(xn)=x1∑⋯xn−1∑xn+1∑⋯xN∑p(x)
暴力求解需要对 K N − 1 K^{N-1} KN−1 个状态求和,复杂度为 O ( K N − 1 ) O(K^{N-1}) O(KN−1),呈指数级。
9.3 动态规划与消息传递
利用链式结构中的条件独立性,可以采用动态规划思想降低复杂度。关键观察是:只有与 x N x_N xN 相连的势函数 ψ N − 1 , N \psi_{N-1,N} ψN−1,N 才依赖于 x N x_N xN,因此可以先把 x N x_N xN 求和吸收进去,再逐层向前传播。这利用了通用加乘等价关系 a b + a c = a ( b + c ) ab + ac = a(b + c) ab+ac=a(b+c)。
最终, x n x_n xn 的边缘分布可以写成两个「消息」的乘积:
p ( x n ) = 1 Z μ α ( x n ) μ β ( x n ) p(x_n) = \frac{1}{Z}\, \mu_{\alpha}(x_n)\, \mu_{\beta}(x_n) p(xn)=Z1μα(xn)μβ(xn)
其中 μ α ( x n ) \mu_{\alpha}(x_n) μα(xn) 是来自左侧的累加结果, μ β ( x n ) \mu_{\beta}(x_n) μβ(xn) 是来自右侧的累加结果。消息的递归形式为:
μ α ( x n ) = ∑ x n − 1 ψ n − 1 , n ( x n − 1 , x n ) μ α ( x n − 1 ) \mu_{\alpha}(x_n) = \sum_{x_{n-1}} \psi_{n-1,n}(x_{n-1}, x_n)\, \mu_{\alpha}(x_{n-1}) μα(xn)=xn−1∑ψn−1,n(xn−1,xn)μα(xn−1)
递归起点为:
μ α ( x 2 ) = ∑ x 1 ψ 1 , 2 ( x 1 , x 2 ) \mu_{\alpha}(x_2) = \sum_{x_1} \psi_{1,2}(x_1, x_2) μα(x2)=x1∑ψ1,2(x1,x2)
通过这种消息传递(message passing)方式,计算复杂度从指数级降为 O ( N K 2 ) O(NK^2) O(NK2)。其直观理解是:在链状图上从两端向目标节点传递局部消息,每条消息只涉及相邻节点间的求和,而无需重复计算。
10. 树图模型推断
10.1 树结构
- 无向图树:任意节点对之间只有一条路径的图;
- 有向图树:存在一个根节点没有父节点,其余每个节点恰好有一个父节点;
- Polytree:有向图中节点可以有多个父节点,但忽略箭头方向后,任意两个节点之间仍只有一条路径。
在介绍推断算法前,通常先引入更一般的表示形式------因子图。
10.2 因子图
有向图和无向图都可以把若干变量的全局函数表示为这些变量子集上因子的乘积。因子图通过为每个因子引入额外的因子节点,将这种分解显式化。因子图是一类二部图:
p ( x ) = ∏ s f s ( x s ) p(\mathbf{x}) = \prod_{s} f_s(\mathbf{x}_s) p(x)=s∏fs(xs)
例如,无向图中的团势能 ψ ( x 1 , x 2 , x 3 ) \psi(x_1, x_2, x_3) ψ(x1,x2,x3) 可以表示为一个因子 f ( x 1 , x 2 , x 3 ) f(x_1, x_2, x_3) f(x1,x2,x3),也可以进一步拆分为多个因子的乘积。有向图也可以转换为因子图,例如把 p ( x 1 ) p ( x 2 ) p ( x 3 ∣ x 1 , x 2 ) p(x_1)\, p(x_2)\, p(x_3 \mid x_1, x_2) p(x1)p(x2)p(x3∣x1,x2) 表示为若干因子节点的乘积。
10.3 加乘算法(Sum-Product Algorithm)
在因子图树上求特定变量 x x x 的边缘分布,可以写成:
p ( x ) = ∏ s ∈ n e ( x ) ∑ X s F s ( x , X s ) = ∏ s ∈ n e ( x ) μ f s → x ( x ) p(x) = \prod_{s \in \mathrm{ne}(x)} \sum_{X_s} F_s(x, X_s) = \prod_{s \in \mathrm{ne}(x)} \mu_{f_s \to x}(x) p(x)=s∈ne(x)∏Xs∑Fs(x,Xs)=s∈ne(x)∏μfs→x(x)
其中 n e ( x ) \mathrm{ne}(x) ne(x) 是 x x x 的邻居因子集合, X s X_s Xs 是通过因子 f s f_s fs 连接到 x x x 的子树中所有变量的集合, μ f s → x ( x ) \mu_{f_s \to x}(x) μfs→x(x) 表示从因子节点 f s f_s fs 到变量节点 x x x 的消息。
算法中存在两种类型的消息:
- 从因子节点到变量节点:
μ f s → x ( x ) = ∑ x 1 ⋯ ∑ x M f s ( x , x 1 , ... , x M ) ∏ m ∈ n e ( f s ) ∖ x μ x m → f s ( x m ) \mu_{f_s \to x}(x) = \sum_{x_1} \cdots \sum_{x_M} f_s(x, x_1, \dots, x_M) \prod_{m \in \mathrm{ne}(f_s) \setminus x} \mu_{x_m \to f_s}(x_m) μfs→x(x)=x1∑⋯xM∑fs(x,x1,...,xM)m∈ne(fs)∖x∏μxm→fs(xm)
- 从变量节点到因子节点:
μ x m → f s ( x m ) = ∏ l ∈ n e ( x m ) ∖ f s μ f l → x m ( x m ) \mu_{x_m \to f_s}(x_m) = \prod_{l \in \mathrm{ne}(x_m) \setminus f_s} \mu_{f_l \to x_m}(x_m) μxm→fs(xm)=l∈ne(xm)∖fs∏μfl→xm(xm)
对于树结构,递归过程从叶子节点开始:叶变量节点的初始消息为 μ x → f ( x ) = 1 \mu_{x \to f}(x) = 1 μx→f(x)=1,叶因子节点的初始消息为 μ f → x ( x ) = f ( x ) \mu_{f \to x}(x) = f(x) μf→x(x)=f(x)。因子本身包含的变量集合的边缘分布为:
p ( x s ) = f s ( x s ) ∏ i ∈ n e ( f s ) μ x i → f s ( x i ) p(\mathbf{x}s) = f_s(\mathbf{x}s) \prod{i \in \mathrm{ne}(f_s)} \mu{x_i \to f_s}(x_i) p(xs)=fs(xs)i∈ne(fs)∏μxi→fs(xi)
以一个非归一化联合分布 p ~ ( x ) = f a ( x 1 , x 2 ) f b ( x 2 , x 3 ) f c ( x 2 , x 4 ) \tilde{p}(\mathbf{x}) = f_a(x_1, x_2)\, f_b(x_2, x_3)\, f_c(x_2, x_4) p~(x)=fa(x1,x2)fb(x2,x3)fc(x2,x4) 为例,若以 x 3 x_3 x3 为根,消息从叶子向根、再由根向叶子传播,最终可以验证 p ~ ( x 2 ) \tilde{p}(x_2) p~(x2) 等于三条方向消息的乘积,并与直接对 p ~ ( x ) \tilde{p}(\mathbf{x}) p~(x) 求和的结果一致。这一过程体现了加乘算法在树结构上的正确性与高效性。
若将变量划分为隐变量 h \mathbf{h} h 与观测变量 v = v ^ \mathbf{v} = \hat{\mathbf{v}} v=v^,计算条件分布 p ( h ∣ v = v ^ ) p(h \mid \mathbf{v} = \hat{\mathbf{v}}) p(h∣v=v^) 时,只需在联合分布中引入指示因子:
p ( x ) ← p ( x ) ∏ i I ( v i = v ^ i ) p(\mathbf{x}) \leftarrow p(\mathbf{x}) \prod_i \mathbb{I}(v_i = \hat{v}_i) p(x)←p(x)i∏I(vi=v^i)
即可继续使用加乘算法高效求解。
11. 总结
概率图模型是一套有效刻画多个随机变量之间依赖关系、从而高效建模联合概率分布的数学工具。其两大代表是:
- 贝叶斯网络:用有向无环图表示条件依赖,联合分布分解为局部条件分布的乘积:
p ( t , c ) = p ( t ) p ( c ∣ t ) p(t, c) = p(t)\, p(c \mid t) p(t,c)=p(t)p(c∣t)
- 马尔可夫网络:用无向图与团势函数表示变量间的兼容关系:
p ( t , c ) = e ϕ ( t , c ) ∑ t ′ , c ′ e ϕ ( t ′ , c ′ ) p(t, c) = \frac{e^{\phi(t, c)}}{\sum_{t', c'} e^{\phi(t', c')}} p(t,c)=∑t′,c′eϕ(t′,c′)eϕ(t,c)
图模型的核心优势在于:利用条件独立结构对联合分布进行因子分解,从而避免高维情况下的指数级参数化。同时,后验概率正比于先验乘以似然:
p ( w ∣ t ) ∝ p ( w ) p ( t ∣ w ) p(\mathbf{w} \mid \mathbf{t}) \propto p(\mathbf{w})\, p(\mathbf{t} \mid \mathbf{w}) p(w∣t)∝p(w)p(t∣w)
对于链式结构与树结构上的目标变量推断,可以通过消息传递或加乘算法在多项式时间内完成。整体来看,概率图模型为理解条件独立、设计结构化概率模型、以及推导高效推断算法提供了统一的理论框架。
12. 参考资料
- 张伟楠. 机器学习(第 8 节:概率图模型). 上海交通大学,2024(课程讲义).
- Christopher M. Bishop. Pattern Recognition and Machine Learning(第 8 章:Graphical Models). Springer,2006.
- Daphne Koller, Nir Friedman. Probabilistic Graphical Models: Principles and Techniques(第 2--4 章、第 19--21 章等). MIT Press,2009.
- pgmpy Development Team. pgmpy: Probabilistic Graphical Models in Python(官方文档). https://pgmpy.org/ ,2026(在线文档).