马尔可夫链模拟器 — 两状态的稳态分布与混合时间 返回
随机过程模拟器

马尔可夫链模拟器 — 两状态的稳态分布与混合时间

由两状态马尔可夫链的转移概率 p, q 实时计算稳态分布 π、t 步后的状态概率 P_1(t) 与 99% 混合时间 t_mix。直观感受 Perron-Frobenius 定理与特征值带来的指数收敛。

参数设置
P 1 to 2
P 2 to 1
初始 P state 1
观测步数 t

p = P(1→2)、q = P(2→1)。点击播放可将 t 从 0 扫到 50,观察从初始分布到稳态 π 的指数收敛过程。

计算结果
稳态 π_1
稳态 π_2
P_1(t)
t_mix (99%)
状态转移图

两个圆代表状态 1 与 2,圆的大小与当前步 t 时该状态的概率成正比。箭头表示转移概率 p (1→2) 与 q (2→1),自环表示停留概率 (1−p) 与 (1−q)。

P_1(t) 的指数收敛

横轴是步数 t (0–50),纵轴是状态 1 的概率 P_1(t)。虚线为稳态值 π_1,黄色标记为当前 t。|1−p−q| 即特征值 λ_2,决定收敛速度。

理论与主要公式

设两状态马尔可夫链的转移矩阵为 $P = \begin{pmatrix} 1-p & p \\ q & 1-q \end{pmatrix}$。其特征值为 $\lambda_1 = 1$ 与 $\lambda_2 = 1-p-q$,稳态分布为

$$\pi_1 = \frac{q}{p+q}, \qquad \pi_2 = \frac{p}{p+q}$$

$t$ 步后状态 1 的概率由特征值分解给出

$$P_1(t) = \pi_1 + (P_1(0) - \pi_1)\,(1-p-q)^t$$

99% 混合时间由 $|P_1(t)-\pi_1| / |P_1(0)-\pi_1| = 0.01$ 推得 $t_{\text{mix}} = \ln(0.01) / \ln|1-p-q|$。当 $p+q \to 0$ 或 $\to 2$ 时 $|\lambda_2| \to 1$,混合时间发散——链趋近周期或近似吸收态。

马尔可夫链模拟器是什么

🙋
马尔可夫链不就是「未来只取决于现在」吗?仅用两个状态有什么意思呢?
🎓
问得好。两状态是最小的非平凡链,并且它是唯一能让稳态分布、特征值、混合时间这些核心量都拥有简洁闭式解的规模。例如取 p=0.30、q=0.40 时,可手算 $\pi_1 = q/(p+q) = 0.5714$。本工具的目的是把这些公式变成动态画面,让你「看见」它们。
🙋
把 p+q 调到接近 1 时,收敛曲线立刻变平了,这是为什么?
🎓
$\lambda_2 = 1-p-q$ 是控制衰减的特征值。当 $\lambda_2 \approx 0$,$\lambda_2^t$ 一步就归零。如果改成 p=q=0.01,则 $\lambda_2 \approx 0.98$,$0.98^{50} \approx 0.36$,初始分布几乎没变化。公式 $t_{\text{mix}} = \ln(0.01)/\ln|\lambda_2|$ 可以直接看出:当 $|\lambda_2| \to 1$ 时分母趋零,混合时间发散。
🙋
如果把 p 和 q 都调到 0.99,$\lambda_2$ 就变成负数了。会发生什么?
🎓
负特征值会带来「振荡收敛」。$P_1(t)$ 在 $\pi_1$ 上下交替跳动,并慢慢衰减。点击播放就能看到锯齿状的曲线。这种链接近周期 2(二部)马尔可夫链——若严格周期则不会收敛。在实际中,延迟更新、信号每个时钟翻转的系统都会出现这种行为。
🙋
听说 PageRank 也是马尔可夫链,它和这里的有什么不同?
🎓
本质完全相同,只是规模差天地。PageRank 是数百亿网页构成的巨型马尔可夫链,每个网页是一个状态,每个链接是一个转移概率。求解的目标就是稳态分布 $\pi$,它就是网页的「重要度」。可以把本工具的 2×2 矩阵想象成扩展到 $10^9 \times 10^9$。实现就是幂迭代 $\pi^{(t+1)} = \pi^{(t)} P$——和本工具的 $P_1(t) = \pi_1 + (P_1(0)-\pi_1)\lambda^t$ 是同一件事在高维下的版本。

常见问题

两状态马尔可夫链「不可约 (irreducible)」要求 p>0 且 q>0,本工具的滑块范围 0.01–0.99 已保证。如果自环 1−p、1−q 中至少一个为正,链就「非周期 (aperiodic)」,由 Perron-Frobenius 定理可知特征值 1 是单根,对应的左特征向量即为唯一的稳态分布 π。p+q=2 的极限对应周期 2,链不收敛——本工具的滑块上限 p+q≤1.98 避开了这一病态情况。
弛豫时间定义为 $\tau_{\text{rel}} = 1/(1-|\lambda_2|)$,是概率与 π 之差衰减到 $1/e \approx 0.368$ 所需的特征时间。混合时间是衰减到指定阈值(本工具 1%)所需的步数,二者关系约为 $t_{\text{mix}} \approx \tau_{\text{rel}} \ln(1/\epsilon)$。本工具的 $t_{\text{mix}} = \ln(0.01)/\ln|\lambda_2|$ 给出 ε=0.01 的精确离散步数;不同文献使用不同阈值或全变差距离时,会得到接近但不同的数值。
马尔可夫可靠性分析根据冗余系统的故障率 λ 与修复率 μ 构造「正常⇄故障」链,由稳态分布得到可用性 A = μ/(λ+μ)——与本工具的 π_1 = q/(p+q) 完全相同(p ↔ λ、q ↔ μ)。FMEA 和 FTA 用静态树结构组合概率,而马尔可夫模型补充了「从瞬态到稳态」的时间演化。该数学框架在离散事件仿真 (DES) 与可靠性框图求解器中也广泛出现。
N 状态时转移矩阵为 N×N,特征值有 N 个(其中一个总是 λ_1=1)。稳态分布通过求解线性方程组 $\pi P = \pi$ 得到,但 N≥3 时一般没有闭式解。标准实现是幂迭代 $\pi^{(t+1)} = \pi^{(t)} P$,Google PageRank 就是该方法。混合时间由次大特征值幅度 $|\lambda_2|$(谱隙)决定,$t_{\text{mix}} \approx \ln(1/\epsilon)/(1-|\lambda_2|)$。本工具的 2×2 是最小规模,所有概念都能手算验证。

实际应用

可靠性工程与维护计划:生产线设备「正常 (Up)⇄故障 (Down)」的简单模型中,由平均故障时间 MTTF = 1/p、平均修复时间 MTTR = 1/q 可得稳态可用性 A = q/(p+q)。本工具中取 p=0.05、q=0.50 可得 A=0.909,即 90.9% 可用率,是工厂维护部门常用的 KPI。扩展到三个状态(运行、退化、故障)可用于预防性维护优化。

网络搜索与 PageRank:Google PageRank 是数千亿网页超大规模马尔可夫链的稳态分布,使用阻尼系数 0.85 的幂迭代计算。链接结构对应转移矩阵,稳态概率即页面重要度排名——相当于把本工具的 $\pi P = \pi$ 解到 $10^{11}$ 维。推荐系统(YouTube/Amazon 关联视频和商品、Spotify 个性化电台)也使用相同的随机游走稳态框架。

强化学习与 MDP:马尔可夫决策过程在马尔可夫链基础上引入动作 a,由 Bellman 方程 V(s) = max_a [r(s,a) + γ Σ P(s'|s,a) V(s')] 求解最优策略。Q-learning、SARSA、Deep Q-Network (DQN) 都假设马尔可夫性;AlphaGo、自动驾驶、ChatGPT 的 RLHF 阶段都建立在 MDP 之上。本工具是「无动作、无奖励」的基础马尔可夫链,可作为先建立特征值直觉的入门工具。

自然语言处理与隐马尔可夫模型 (HMM):语音识别、词性标注、基因序列分析都使用 HMM——由隐藏的马尔可夫链与状态相关的观测概率组成。训练用 Baum-Welch (EM)、解码用 Viterbi 算法,但底层转移矩阵的特征值分析与本工具完全相同。手机 T9 输入预测、DNA 甲基化分析也是该框架的日常应用。

常见误解与注意事项

最常见的错误是「一旦链收敛到 π,状态就不再变化」。事实上每一步转移仍按概率 p、q 随机发生;正确解读是:长时间内停留在状态 1 的时间比例收敛到 π_1。当 π_1=0.5714 时,可期望每 100 步中约有 57 步处于状态 1。本工具绘制的概率曲线 P_1(t) 是「无限多条样本路径的集合平均」,不是单条样本路径。

常见混淆是把「无记忆性」误读为「不携带任何历史信息」。马尔可夫性 P(X_{t+1}|X_t,X_{t-1},...) = P(X_{t+1}|X_t) 的真正含义是:所有有用的历史信息都必须被编码到当前状态 X_t 中。简单的股价随机游走是马尔可夫的,但若把状态重新定义为 (股价, 昨日涨跌幅),则新链具有更高阶的「带前一日涨跌幅的马尔可夫性」。状态空间的设计是建模成败的关键。

最后,不要把混合时间当作硬性数值。本工具的 $t_{\text{mix}} = \ln(0.01)/\ln|\lambda_2|$ 依赖于阈值 ε=0.01 的选择。若改为 ε=0.05 数值会缩小约 35%,若改为 ε=0.001 则会扩大约 50%。在 MCMC 实践中对应的概念是 burn-in 长度,严格的收敛保证常用全变差距离而非 L^∞ 距离。任何报告都应同时给出阈值。