概述

马尔可夫链(Markov Chain)是一种特殊的随机过程,具有无记忆性(Memorylessness)的特点——当前状态只与上一状态有关,与更早的历史无关。1

马尔可夫链在搜索引擎(PageRank)、语音识别、自然语言处理、推荐系统、金融建模、统计物理等领域都有广泛应用。


马尔可夫性质

条件独立性

为一个离散时间随机过程,若对任意时刻 和任意状态序列 ,满足:

则称该过程具有马尔可夫性质(Markov Property)。

严格表述

更一般地,马尔可夫性质可以表述为:

其中 是到时刻 为止的自然 -代数。

直观理解

未来只与现在有关,与过去无关。

这意味着,如果我们知道当前状态 ,那么关于过去的任何信息都不会帮助我们更好地预测


离散时间马尔可夫链的严格定义

概率论框架

一个离散时间马尔可夫链(Discrete-Time Markov Chain, DTMC)是一个三元组 ,其中:

要素符号说明
状态空间可数集合(有限或可数无限),包含所有可能状态
-代数 上的 Borel -代数
转移核满足 Kolmogorov 不等式的转移概率族

转移核的定义

转移核(Transition Kernel)是一个映射 ,满足:

  1. 对任意 ,映射 上的概率测度
  2. 对任意 ,映射 -可测函数

对于离散状态空间 ,转移核退化为转移概率矩阵

转移矩阵的性质

转移概率矩阵 是一个 (若 )或 (若 )的行随机矩阵

其中

初始分布

初始分布(Initial Distribution) 是一个概率向量:

有限维分布

给定初始分布 和转移核 ,马尔可夫链的所有有限维分布由以下公式给出:

这一性质称为马尔可夫链的链法则,它表明联合分布完全由初始分布和转移概率决定。


n步转移概率

Chapman-Kolmogorov方程

从状态 经过 步到达状态 的概率记为 。根据Chapman-Kolmogorov方程

用矩阵形式表示:

特别地, 步转移概率矩阵:

计算示例(Python)

import numpy as np
 
# 天气模型的转移矩阵
P = np.array([[0.7, 0.3],
              [0.4, 0.6]])
 
# 计算10步后的转移概率
P_10 = np.linalg.matrix_power(P, 10)
print("10步转移矩阵:")
print(P_10)
# 输出将接近平稳分布的行
 
# 验证Chapman-Kolmogorov方程: P^5 = P^2 @ P^3
P_2 = np.linalg.matrix_power(P, 2)
P_3 = np.linalg.matrix_power(P, 3)
P_5 = np.linalg.matrix_power(P, 5)
print("\n验证 C-K 方程 (P^2 @ P^3 - P^5):")
print(P_2 @ P_3 - P_5)  # 接近零矩阵

马尔可夫链的收敛理论

不可约性

一个马尔可夫链称为不可约的(Irreducible),如果对任意两个状态 ,存在 使得 。这意味着:

不可约性保证了链可以从任意状态到达任意其他状态。

周期性

状态 周期(Period) 定义为:

  • ,状态是非周期的(Aperiodic)
  • ,状态是周期的(Periodic)

周期性质:若马尔可夫链不可约,则所有状态具有相同的周期。

遍历性

状态 称为:

  • 常返的(Recurrent),如果从 出发返回 的概率为1:

    其中 是首次返回时间。

  • 正常返的(Positive Recurrent),如果它是常返的且平均返回时间有限:

  • 零常返的(Null Recurrent),如果它是常返的但平均返回时间无限。

  • 瞬态的(Transient),如果从 出发存在正概率永不返回

平稳分布的存在性与唯一性

定理(平稳分布存在性):每个不可约、非周期、正常返的有限马尔可夫链都有唯一的平稳分布。

对于一般状态空间,刘维尔-弗罗贝尼乌斯定理给出:

定理(不动点定理):设 是不可约转移矩阵,则存在唯一的概率向量 满足:

称为平稳分布(Stationary Distribution),其分量:

对所有 都相同(与初始状态无关)。

细致平衡方程

若存在分布 满足细致平衡条件(Detailed Balance Equation):

则该链是可逆的,且 是其平稳分布。

收敛速率与谱分析

马尔可夫链的收敛速率与转移矩阵的谱性质密切相关。

谱分解:设 是有限状态空间马尔可夫链的转移矩阵,则 可以分解为:

其中 是特征值对角矩阵。

谱隙(Spectral Gap):

其中 是第二大特征值(按绝对值)。

收敛界:对于不可约、非周期、正常返的马尔可夫链:

其中 是全变差距离, 是第二大特征值的绝对值。

import numpy as np
 
# 分析转移矩阵的谱性质
P = np.array([[0.7, 0.3],
              [0.4, 0.6]])
 
eigenvalues, eigenvectors = np.linalg.eig(P.T)  # 注意转置
eigenvalues = np.real(eigenvalues)
idx = np.argsort(eigenvalues)[::-1]
eigenvalues = eigenvalues[idx]
 
print("特征值:", eigenvalues)
print("谱隙 (1 - |λ₂|):", 1 - abs(eigenvalues[1]))
 
# 验证平稳分布
pi = np.array([4/7, 3/7])
print("平稳分布:", pi)
print("πP =", pi @ P)

连续时间马尔可夫链

基本定义

连续时间马尔可夫链(Continuous-Time Markov Chain, CTMC) 满足:

连续时间链的特征是:在状态 停留的时间是指数分布的随机变量。

Kolmogorov微分方程

,则满足Kolmogorov向前方程

矩阵形式:

其中 生成元(Infinitesimal Generator):

这里 是离开状态 的总率, 是从 转移到 的条件概率。

出生-死亡过程

出生-死亡过程(Birth-Death Process)是一种特殊的连续时间马尔可夫链,状态空间为 ,转移只发生在相邻状态之间。

转移率

  • 出生率:(从状态
  • 死亡率:(从状态

Kolmogorov平衡方程

平稳分布(通过递归可得):

Poisson过程

Poisson过程是连续时间马尔可夫链的经典例子。

定义:计数过程 称为参数为 Poisson过程,如果:

  1. 独立增量: 独立(
  2. 平稳增量:
  3. 轨道右连续且为阶梯函数

转移率矩阵

import numpy as np
import matplotlib.pyplot as plt
 
def poisson_process(lam, T):
    """模拟参数为λ的Poisson过程"""
    times = [0]
    counts = [0]
    t = 0
    n = 0
    
    while t < T:
        # 指数分布的等待时间
        wait = np.random.exponential(1 / lam)
        t += wait
        if t > T:
            break
        n += 1
        times.append(t)
        counts.append(n)
    
    # 阶梯函数需要水平部分
    times_full = times + [T]
    counts_full = counts + [n]
    
    return times_full, counts_full
 
# 模拟并绘图
lam = 5
T = 2
times, counts = poisson_process(lam, T)
 
plt.figure(figsize=(10, 4))
plt.step(times, counts, where='post', linewidth=2)
plt.xlabel('时间 t')
plt.ylabel('计数 N(t)')
plt.title(f'Poisson过程 (λ = {lam})')
plt.grid(True, alpha=0.3)
plt.savefig('/tmp/poisson_process.png', dpi=150)

稳态分布

平稳分布的定义

若一个概率分布 满足:

则称 为该马尔可夫链的平稳分布(Stationary Distribution)。

极限分布

对于许多马尔可夫链,当 时, 步转移概率 趋向于一个与初始状态无关的极限分布

遍历定理

遍历定理(Ergodic Theorem)指出:对于不可约、非周期、正常返的马尔可夫链,时间平均趋向于空间平均。

即对任意函数


状态分类

可达与互通

  • 可达:若存在 使得 ,则称 可从 可达,记为
  • 互通:若 ,则称 互通,记为

周期性

状态 周期 定义为:

  • ,则状态是非周期的
  • ,则状态是周期的

常返与瞬态

  • 常返(Recurrent):从状态 出发,以概率1返回
  • 瞬态(Transient):从状态 出发,存在正概率永不返回

马尔可夫链蒙特卡洛方法(MCMC)

马尔可夫链的一个强大应用是马尔可夫链蒙特卡洛方法(Markov Chain Monte Carlo),用于从复杂分布中采样。

Metropolis-Hastings算法

Metropolis-Hastings算法的核心思想是构造一个以目标分布 为平稳分布的马尔可夫链。

算法步骤

  1. 初始化 ,设置提议分布
    • 采样候选状态
    • 计算接受率:
    • 以概率 接受:,否则拒绝:
import numpy as np
 
def metropolis_hastings_mcmc(pdf, proposal_std, n_samples, dim=2):
    """
    Metropolis-Hastings算法采样
    
    Args:
        pdf: 目标分布(未归一化)
        proposal_std: 提议分布的标准差
        n_samples: 采样数量
        dim: 维度
    
    Returns:
        samples: 采样序列
    """
    samples = np.zeros((n_samples, dim))
    current = np.random.randn(dim) * 0.5  # 初始点
    
    for i in range(n_samples):
        # 提议分布:各向同性正态分布
        proposal = current + np.random.randn(dim) * proposal_std
        
        # 计算接受率
        alpha = min(1, pdf(proposal) / pdf(current))
        
        # 接受/拒绝
        if np.random.random() < alpha:
            current = proposal
        
        samples[i] = current
    
    return samples
 
# 示例:采样二元正态分布
def bivariate_normal_pdf(x):
    mean = [0, 0]
    cov = [[1, 0.6], [0.6, 1]]
    det = np.linalg.det(cov)
    inv_cov = np.linalg.inv(cov)
    diff = x - mean
    return np.exp(-0.5 * diff @ inv_cov @ diff) / (2 * np.pi * np.sqrt(det))
 
samples = metropolis_hastings_mcmc(bivariate_normal_pdf, 0.5, 10000)
print(f"采样均值: {samples.mean(axis=0)}")
print(f"采样协方差:\n{np.cov(samples.T)}")

Gibbs采样

Gibbs采样是Metropolis-Hastings的特殊情况,当提议分布为条件分布时,接受率为1。

全条件分布:给定其他变量时单个变量的条件分布:

def gibbs_sampling_gaussian(mean, cov, n_samples):
    """
    对多元高斯分布进行Gibbs采样
    使用坐标交替更新
    """
    d = len(mean)
    samples = np.zeros((n_samples, d))
    x = np.zeros(d)  # 初始值
    
    for i in range(n_samples):
        for j in range(d):
            # 计算条件分布的均值和方差
            sigma_j_sq = 1.0 / cov[j, j]
            mu_j = mean[j] + sigma_j_sq * sum(
                cov[j, k] * (x[k] - mean[k]) for k in range(d) if k != j
            )
            x[j] = np.random.normal(mu_j, np.sqrt(sigma_j_sq))
        samples[i] = x
    
    return samples

收敛诊断

MCMC链的收敛诊断是一个重要但困难的问题。

常用方法

  1. Trace Plot(迹图):观察链是否”平稳”
  2. Geweke诊断:比较链前后部分的均值是否一致
  3. Gelman-Rubin统计量):比较多个链的方差
def gelman_rubin(chains):
    """
    Gelman-Rubin诊断
    
    Args:
        chains: list of arrays, 每个chain是独立的马尔可夫链
    
    Returns:
        R_hat: 潜在尺度缩减因子,接近1表示收敛
    """
    m = len(chains)  # 链的数量
    n = chains[0].shape[0]  # 每个链的样本数
    
    # 计算每个链的均值和方差
    chain_means = np.array([np.mean(chain, axis=0) for chain in chains])
    chain_vars = np.array([np.var(chain, axis=0, ddof=1) for chain in chains])
    
    # 链间方差
    B = n / (m - 1) * np.sum((chain_means - np.mean(chain_means, axis=0))**2, axis=0)
    
    # 链内方差
    W = np.mean(chain_vars, axis=0)
    
    # 总体方差估计
    var_hat = (n - 1) / n * W + B / n
    
    # R_hat
    R_hat = np.sqrt(var_hat / W)
    
    return R_hat
 
def trace_plot(samples, name="Chain"):
    """绘制迹图"""
    plt.figure(figsize=(12, 4))
    plt.plot(samples, alpha=0.7)
    plt.axhline(np.mean(samples), color='red', linestyle='--', label='Mean')
    plt.xlabel('Iteration')
    plt.ylabel('Value')
    plt.title(f'{name} Trace Plot')
    plt.legend()
    plt.grid(True, alpha=0.3)

收敛标准

  • :通常认为链已收敛
  • :更严格的标准

应用实例:PageRank

Google的PageRank算法本质上就是一个马尔可夫链。

基本思想

  • 网页的重要性取决于指向它的网页数量和质量
  • 用户随机浏览网页的行为可以用马尔可夫链建模
  • PageRank值就是该马尔可夫链的平稳分布

数学表述

设网页 的PageRank为 为页面 的出链数,则:

其中 是阻尼因子(通常取0.85), 是指向 的页面集合。

PageRank与马尔可夫链

PageRank等价于随机冲浪者(Random Surfer)模型的平稳分布:

  1. 以概率 随机跳转到任意页面
  2. 以概率 按链接随机跳转
def pagerank(adjacency_matrix, d=0.85, tol=1e-6):
    """
    计算PageRank
    
    Args:
        adjacency_matrix: 邻接矩阵 (N x N)
        d: 阻尼因子
        tol: 收敛阈值
    
    Returns:
        pagerank_scores: PageRank分数
    """
    n = adjacency_matrix.shape[0]
    
    # 归一化为转移矩阵
    out_degree = adjacency_matrix.sum(axis=1, keepdims=True)
    out_degree[out_degree == 0] = 1  # 处理悬挂节点
    P = adjacency_matrix / out_degree
    
    # 初始分布
    pi = np.ones(n) / n
    
    # 幂迭代
    while True:
        pi_new = (1 - d) / n + d * (pi @ P)
        if np.linalg.norm(pi_new - pi, 1) < tol:
            break
        pi = pi_new
    
    return pi

应用实例:天气模型

考虑一个简化的天气模型:

状态
0.70.3
0.40.6

转移概率矩阵:

稳态分布计算

设稳态分布为 ,满足:

解得:

这意味着长期来看,约57.1%的时间是晴天,42.9%的时间是雨天。

模拟验证

import numpy as np
 
def simulate_weather(n_steps, transition_matrix, initial_state=0):
    """
    模拟天气马尔可夫链
    
    Args:
        n_steps: 模拟步数
        transition_matrix: 转移概率矩阵
        initial_state: 初始状态 (0=晴, 1=雨)
    
    Returns:
        states: 状态序列
    """
    states = [initial_state]
    current = initial_state
    
    for _ in range(n_steps - 1):
        probs = transition_matrix[current]
        current = np.random.choice(len(probs), p=probs)
        states.append(current)
    
    return np.array(states)
 
# 参数
P = np.array([[0.7, 0.3],
              [0.4, 0.6]])
 
# 模拟10000步
np.random.seed(42)
states = simulate_weather(10000, P)
 
# 计算经验频率
sunny_freq = np.mean(states == 0)
rainy_freq = np.mean(states == 1)
 
print(f"晴天频率: {sunny_freq:.4f}")
print(f"雨天频率: {rainy_freq:.4f}")
print(f"理论晴天概率: {4/7:.4f}")
print(f"理论雨天概率: {3/7:.4f}")

与其他模型的关系

隐马尔可夫模型(HMM)

隐马尔可夫模型是马尔可夫链的扩展,其中状态是”隐藏”的,只能通过观测序列来推断。详见 隐马尔可夫模型

条件随机场(CRF)

条件随机场是一种判别式模型,用于序列标注任务。相比HMM,CRF可以建模更复杂的依赖关系。详见后续的概率图模型文档。

强化学习中的马尔可夫决策过程

马尔可夫决策过程(MDP)是马尔可夫链的决策扩展,加入了动作和奖励。详见 MDP


参考

Footnotes

  1. 本文档参考了《概率论与数理统计》相关章节和斯坦福CS228课程材料