目录
14.1 隐马尔可夫模型
概率围棋型是一类用图来表达变量相关关系的概率模型.它以图为表示工具,最常见的是用一个结点表示一个或一组随机变量,结点之间的边表示变量间的概率相关关系,即"变量关系图”。
![](https://i-blog.csdnimg.cn/direct/7f26833567e94b7ca680dccdc72fe00c.png)
1. 状态转移概率矩阵:
记作 ,其中
。
表示从状态 转移到状态
的概率。矩阵的每个元素
描述了状态转移的可能性。
2. 观测概率矩阵:
记作 ,其中
。
描述在状态 下观测到观测值
的概率。每个元素
指定了在某个隐状态下生成某个观测值的概率。
3. 初始状态概率向量:
记作,其中
。
表示在初始时刻系统处于状态的概率。这个向量定义了模型开始时各状态的分布。
14.2马尔科夫随机场
马尔可夫随机场(Markov Random Field ,简称 MRF)是典型的马尔可夫网, 这是一种著名的无向圈模型,圈中每个结点表示一个或一组变量,结点之间 的边表示两个变量之间的依赖关系。
- 全局马尔可夫性:给定两个变量子集的分离集,则这两个变量子集条件独立。
- 局部马尔可夫性:给定某变量的邻接变量,则该变量与其它变量条件独立。
- 成对马尔可夫性:给定所有其他变量,两个非邻接变量条件独立。
14.3条件随机场
条件随机场(Conditional Random Field ,简称 CRF) 是一种判别式无向图模型。条件随机场试图对多个变量在给定观测值后 的条件概率进行建模.
![](https://i-blog.csdnimg.cn/direct/b678a54958814578aa57265c4eeca5d9.png)
14.4学习与推断
14.4.1变量消去
变量消去法是最直观的精确推断算法,以下的有向图模型为例来介绍其工作流程:
import numpy as np
# 定义增广矩阵
A = np.array([[2, -1, 1, 4],
[1, 2, 1, 5],
[3, -2, 2, 8]], dtype=float)
def elimination(A):
n = len(A)
for i in range(n):
# 主元归一化
A[i] = A[i] / A[i, i]
# 消去当前列的其他元素
for j in range(i + 1, n):
factor = A[j, i]
A[j] = A[j] - factor * A[i]
return A
def back_substitution(A):
n = len(A)
x = np.zeros(n)
for i in range(n-1, -1, -1):
x[i] = A[i, -1]
for j in range(i+1, n):
x[i] -= A[i, j] * x[j]
return x
# 执行变量消去法
A_eliminated = elimination(A.copy())
solution = back_substitution(A_eliminated)
print("经过消去后的增广矩阵:")
print(A_eliminated)
print("\n方程组的解:")
print(solution)
分析:
- 增广矩阵处理:代码首先定义了一个增广矩阵
A
,其最后一列为常数项。elimination
函数对增广矩阵进行消元操作,逐步将其转化为上三角形式。 - 消元过程:在
elimination
函数中,首先对每一行进行主元归一化,然后对每一列的其他元素进行消去,从而简化矩阵。 - 回代过程:
back_substitution
函数从上三角矩阵的最后一行开始,逐步计算未知数的值,得到方程组的解。
结果:
14.4.2信念传播
信念传播算法将变量消去法中的求和操作看作一个消息传递过程,具体来说,变量消去法通过求和操作:
下面是关于信念传播算法的实验代码及分析于结果:
下面实验是关于一个简单的二值马尔可夫随机场(MRF)模型上的信念传播。将使用一个4x4的网格模型,其中每个节点代表一个二值变量。
import numpy as np
def initialize_messages(n):
return np.zeros((n, n, 2, 2)) # Message array for 4 neighbors: Up, Down, Left, Right
def belief_propagation(grid, max_iters=10):
n = len(grid)
messages = initialize_messages(n)
# Helper functions
def compute_message(node, direction, messages):
# Compute the message from the node to the neighbor in the specified direction
pass
def update_beliefs(grid, messages):
# Update the belief of each node based on incoming messages
beliefs = np.zeros((n, n, 2))
for i in range(n):
for j in range(n):
# Update beliefs based on messages from neighbors
beliefs[i, j] = grid[i, j] # Placeholder for actual belief calculation
return beliefs
for _ in range(max_iters):
for i in range(n):
for j in range(n):
# Compute messages in all directions
for direction in ['Up', 'Down', 'Left', 'Right']:
messages[i, j] = compute_message((i, j), direction, messages)
# Update beliefs
beliefs = update_beliefs(grid, messages)
return beliefs
# Define a grid with initial values (prior probabilities)
grid = np.random.rand(4, 4, 2) # Random initial values for simplicity
# Normalize grid values to sum to 1
grid /= grid.sum(axis=2, keepdims=True)
# Run belief propagation
beliefs = belief_propagation(grid)
print("最终的信念分布:")
print(beliefs)
-
初始化消息和信念:
initialize_messages
函数初始化了用于消息传递的数组,belief_propagation
函数则开始信念传播过程。初始信念是随机的,并且需要归一化以确保每个节点的信念总和为1。 -
消息计算:
compute_message
是一个占位函数,实际实现会计算从一个节点向邻居节点传递的消息。在实际应用中,这个函数需要根据具体的模型和边缘条件进行实现。 -
信念更新:
update_beliefs
函数根据传入的消息更新每个节点的信念。在这个示例中,信念更新的实现被简化为直接使用初始值。实际中,这个步骤需要结合消息传递结果进行信念计算。 -
迭代过程:信念传播算法通过迭代来更新消息和信念。在每次迭代中,节点之间的消息会被计算并更新,最终收敛到一个稳定的信念分布。
结果:
14.5近似推断
14.5.1 MCMC采样
概率图模型中最常用的采样技术是马尔可夫链蒙特卡罗(简称 MCMC) 方法.给定连续变量 的概率密度函数 p(x) ,x在区间A中的概率可计算为:
下面是MCMC算法流程:
下面是关于MCMC算法的实验代码及分析于结果:
import numpy as np
import matplotlib.pyplot as plt
# 目标分布(标准正态分布)
def target_distribution(x):
return np.exp(-0.5 * x**2) / np.sqrt(2 * np.pi)
# 提议分布(正态分布)
def proposal_distribution(x, sigma):
return np.random.normal(x, sigma)
# Metropolis-Hastings 算法
def metropolis_hastings(num_samples, proposal_std):
samples = np.zeros(num_samples)
x = 0 # 初始值
for i in range(num_samples):
x_new = proposal_distribution(x, proposal_std)
acceptance_ratio = target_distribution(x_new) / target_distribution(x)
if np.random.rand() < acceptance_ratio:
x = x_new
samples[i] = x
return samples
# 参数设置
num_samples = 10000
proposal_std = 1.0
# 生成样本
samples = metropolis_hastings(num_samples, proposal_std)
# 绘制结果
plt.figure(figsize=(12, 6))
# 绘制样本直方图
plt.subplot(1, 2, 1)
plt.hist(samples, bins=30, density=True, alpha=0.6, color='g')
plt.title('样本直方图')
# 绘制目标分布
x = np.linspace(-4, 4, 100)
plt.subplot(1, 2, 2)
plt.plot(x, target_distribution(x), 'r', lw=2)
plt.title('目标分布')
plt.show()
分析:
-
目标分布:
target_distribution
函数定义了我们想要采样的目标分布,这里选择的是标准正态分布。 -
提议分布:
proposal_distribution
函数定义了提议分布,这里使用的是以当前样本为均值的正态分布。 -
Metropolis-Hastings 算法:
metropolis_hastings
函数实现了 Metropolis-Hastings 算法。算法首先生成一个提议样本,然后根据接受概率决定是否接受该样本。最终生成的样本数组用于估计目标分布。 -
结果可视化:
- 样本直方图:左侧图显示了生成的样本的直方图。应该接近目标分布的形状。
- 目标分布:右侧图显示了目标分布的理论曲线。通过对比样本直方图和目标分布,可以验证 MCMC 算法的效果。
结果:
14.5.2 变分推断
变分推断通过使用己知简单分布来逼近需推断的复杂分布,并通过限制近似分布的类型,从而得到 种局部最优、但具有确定解的近似后验分布.概率图模型一种简洁的表示方法一一盘式记法:
14.6 话题模型
话题模型(topic model) 是一族生成式有向图模型,主要用于处理离散型的数据(如文本集合) ,在信息检索、自然语言处理等领域有广泛应用.隐狄利克雷分配模型(简称 LDA) 是话题模型的典型代表.在话题模型中,有以下几个基本概念:词(word)、文档(document)、话题(topic)。