一、什么是马尔可夫模型
马尔可夫在研究概率论时候发现:现实世界中,很多事情的未来只取决于现在,而与过去无关!
具体来说就是——很多系统转换到一个新状态的概率,只由当前状态决定,与历史路径无关!
如果一个系统的动态变化符合这个假设,我们就会说它具备马尔可夫性。
比如,若我们认为短期天气变化是具备马尔科夫性的—即明天的天气是什么只取决于今天的天气状况,和昨天以及更久的以前无关。
那么基于这个模型我们来看看怎样进行天气预测——
假设长期观察后发现某一个地区天气变化有以下规律:
某一天天气是晴,那么它接下来一天的天气是晴的概率是80%,是雨的概率是20%;
某一天天气是雨,那么它接下来一天的天气是晴的概率是40%,是雨的概率是60%;
做成表格形式如下:
| 当前天气\下一天天气 | 晴 | 雨 |
|---|---|---|
| 晴 | 80% | 20% |
| 雨 | 40% | 60% |
问题来了——
已知今天天气是晴天
那明天天气状态如何?
很明显明天天气是晴天的概率是80%,雨天的概率是20%。
后天呢?
该根据马尔可夫模型,后天天气只跟明天天气有关。
那么后天天气是晴天的概率是:
P(后天=晴)=P(明天=晴)×0.8+P(明天=雨)×0.4=0.8×0.8+0.2×0.4=0.72
P(后天=雨)= P(明天=晴)×0.2+P(明天=雨)×0.6=0.8×0.2+0.2×0.6=0.28
其中P(后天=晴)代表后天是雨天的概率。
这就是马尔可夫可夫模型最基础的应用。
小结下
马尔可夫模型最初出现是为了预测未来或者说推断一个系统动态变化的规律,
利用马尔可夫模型需要知道三个条件:
- 状态集合 : 系统可能出现的所有状态,比如 {晴、雨}
- 初始状态分布:系统一开始在哪个状态的概率,比如上文中 已知今天晴天(可以认为是今天晴天概率100%);
- 转移概率矩阵:当前状态到下一个状态转换概率矩阵,比如上文中当前天气到下一天天气的转换表格就是转移概率。
讲到这里,我们有了第一个疑问:怎么判断一个系统的动态变化规律能够利用马尔可夫模型进行推断?
接下来,我们就开始探讨这件事——
二、马尔可夫模型的适用范围
首先要声明
“没有完全马尔可夫的世界,只有足够接近的马尔可夫模型的场景
在现实世界中一个事件的发生涉及到的因素太多、太复杂,很难全部建模和分析。
但是我们发现很多场景和系统中
只考虑上一时刻的影响,其它忽略,也可以推断出未来趋势!
就是说在这种场景下可以用马尔可夫模型来推算未来趋势。
那怎么判断一个系统或者某个场景可以使用马尔可夫模型进行推断呢?
目前主要有三种方法:
① 经验观察(数据统计法)
拿历史数据看看:
比如天气序列:
昨天 晴 → 今天 晴
昨天 雨 → 今天 晴
我们可以统计:
| 昨天天气 | 今天晴的概率 |
|---|---|
| 晴 | 0.8 |
| 雨 | 0.4 |
再进一步看:
如果我们考虑前天呢?比如:
- 前天晴、昨天天晴 → 今天晴 的概率
- 前天雨、昨天天晴 → 今天晴 的概率
如果这两者几乎相等,说明“前天”对预测没啥额外信息;
此时我们可以说:这个系统“近似满足马尔可夫性”。
② 物理或逻辑判断(理论依据法)
有些系统天然地具有“当前决定未来”的特征。
比如:
- 一个粒子的运动,只要知道当前位置和速度(即当前状态),下一步就能算出它的位置;
- 某机器设备只要知道当前状态(开/关、温度、压力),就能预测下一个状态。
在这种情况下,系统物理上就符合马尔可夫性。
这是从上帝视角看的:世界是马尔可夫的,因为此刻的一切决定了下一刻。
但从人类建模视角看:世界不是马尔可夫的,因为我们永远拿不到“此刻的一切”。
③ 实验验证(建模后检验法)
即便一开始不能确定,也可以:
- 用马尔可夫模型建模;
- 再用更复杂的“高阶模型”或“带记忆的模型”建模;
- 比较它们在预测上的效果。
如果马尔可夫一阶模型(只看当前)和二阶模型(看当前+上一个)效果差不多,
那就说明一阶马尔可夫假设足够用了。
如果通过以上验证后系统变换还是不符合马尔可夫性怎么办?
可以有几种改进方向👇
| 情况 | 处理方法 |
|---|---|
| 需要考虑更早的状态 | 使用 高阶马尔可夫模型(如二阶:考虑上两个时刻) |
| 状态信息不完整 | 扩充“状态定义”,让状态本身携带更多历史信息 |
| 系统太复杂 | 使用 隐马尔可夫模型 (HMM) 或 循环神经网络 (RNN) 来建模时间依赖 |
例如:
如果“今天的天气”受“昨天+前天”影响,我们可以把“昨天+前天”合并定义成一个复合状态:
状态 = (前天天气, 昨天天气)
这样又能“恢复”马尔可夫性。
那是否是说所有系统最后都可以利用马尔可夫模型进行推断?
非也!
马尔可夫模型(HMM)本质上是一种基于(时间)序列的概率模型,就是说它必须满足:
- 系统状态是离散或可离散化的、或可以用有限个隐状态表示(隐马尔可夫模型);
- 系统是基于时间序列/序列演化的,有明确的顺序;
- 状态随时间变化具有局部依赖性,过去的影响可以被“当前状态”压缩表示。
典型例子:
- 语音识别(音素状态序列)
- 导航系统中的轨迹预测
- 用户行为建模(点击序列、行为序列)
那不适合直接用 HMM 的情况有哪些呢?
一些系统虽然有序列,但历史依赖很强、状态空间庞大、状态非离散,HMM 很难直接建模:
- 自然语言长句子生成(长距离依赖非常明显)
- 股市价格预测(价格受长期趋势影响,非一阶马尔可夫)
- 高维连续控制系统(机器人控制、物理仿真)
在这些系统里,用 HMM 可能会丢失重要历史信息或者状态信息,需要用 RNN、Transformer、LSTM、强化学习等方法。
所以不能说“所有系统都可以用马尔可夫模型推断”,只能说“很多序列化、短期相关的系统可以用马尔可夫模型进行有效推断”,而对于更复杂的系统,需要改进或用更强大的模型。
三、马尔可夫模型怎么使用?
ok,在了解了马尔可夫模型的适用范围后,我们来谈谈马尔可夫模型怎么使用?
在第一章最后,我们谈到利用马尔可夫模型需要知道三个条件:
- 状态集合 : 系统可能出现的所有状态,比如 {晴、雨}
- 初始状态分布:系统一开始在哪个状态的概率,比如上文中 已知今天晴天(可以认为是今天晴天概率100%);
- 转移概率矩阵:当前状态到下一个状态转换概率矩阵,比如上文中当前天气到下一天天气的转换表格就是转移概率。
我们对一个系统进行马尔可夫建模,关键就获取这三个条件,这三者一旦确定,整个马尔可夫过程就被完全定义。
接下来我们就来讨论下这三项是怎么获取的
3.1 状态集合(State Set)怎么定义?
📘 含义
状态是在某一时刻下,能够描述系统当前行为特征、并决定其未来演化规律的变量或变量集合。
状态是系统的核心内部变量,它决定系统的演化与输出;而观测值只是状态投射到外部世界后的一个“影子”。
比如:我们说一个人的有一个状态是勇敢或者怯懦,这个状态能够决定他面对真正困难的具体行为是迎难而上还是躲避,但是我们从他外貌和日常生活中很难直接观测出来,只能通过无数个小事去推断他的这个状态。
状态集合是系统中可能出现的所有“状态”取值集合。
比如:
- 天气模型:{晴,阴,雨}
- 用户行为模型:{浏览,点击,购买,离开}
- 导航模型:{路段A,路段B,路段C}
- 语音识别:{音素b, a, t, ...}
🧩 定义方法
-
已知定义:
如果系统本身就是离散的(如天气、用户行为、交通路段),我们直接采用原来的定义。
例:天气模型,我们人为决定状态集合为 {晴, 阴, 雨}。
- 数据驱动划分并定义:
- 我们没有直接的状态标签,只有观测数据(比如气压、温度、股价特征等)。
- 通过聚类,把这些观测样本分成几组,每组的统计特征相似。
- 每一组就代表一种状态(比如晴天、雨天、震荡期、下跌期)。
-
新的观测数据出现时,只要看看它最像哪一类(例如通过距离或概率),
就能判断它“当前处于哪个状态”。 - 然后再用状态序列统计转移频率,得到转移概率矩阵
例:在语音识别中,我们先提取音频特征,然后用聚类算法(如K-Means)把声学特征划成若干类,每一类对应一个“隐藏状态”。
-
理论建模确定:
对于一些控制系统或物理系统,状态就是系统变量的组合。
例:机器人状态 = [位置x, 速度v, 姿态θ]。
3.2、初始状态分布(Initial State Distribution)怎么获取?
📘 含义
初始状态分布(通常记作 π)表示系统在起始时刻各状态出现的概率:
- 当前状态已知:设为 100%(确定状态)
- 当前状态未知:用历史统计分布
比如在某一个地区的📍 天气模型,根据历史统计,假设:
P(晴)=0.6, P(阴)=0.3, P(雨)=0.1
若如你只是想预测“明天天气”,而今天确实知道是晴天,
那就直接设定:
——这时候马尔可夫链的第一步是从“晴天”出发,完全确定。
但如果你想做“未来 30 天的天气序列仿真”,而你不知道今天的天气,
就只能用过去经验分布(比如平均气候统计):
这更符合随机仿真的设定。
🧩 获取方法
- 直接设定:适合有明确起点,且知道起点明确状态的场景
- 从数据统计:无明确起点,直接统计样本中初始状态出现的频率;
- 假设均匀分布:如果缺乏先验知识,可认为所有状态等可能;
- 由其他模型估计:有时初始状态分布来自上一个系统的输出结果(例如语音上下文、导航预测)。
3.3、转移概率矩阵(Transition Probability Matrix)怎么获取?
📘 含义
描述系统从一个状态转移到另一个状态的概率:
比如天气模型:
| 当前→次日 | 晴 | 阴 | 雨 |
|---|---|---|---|
| 晴 | 0.7 | 0.2 | 0.1 |
| 阴 | 0.3 | 0.4 | 0.3 |
| 雨 | 0.2 | 0.5 | 0.3 |
🧩 获取方法
1️⃣ 监督学习(直接从标注数据计算)
如果我们有大量的状态序列样本(每一天的真实状态),
那就可以直接统计:
例:天气序列
晴 → 晴 → 阴 → 晴 → 雨 → 晴 ...
统计转移次数即可。
这种方法最直接、最可靠,但需要“状态可见”——也就是每一步的状态必须能观测到。
2️⃣ 无监督学习(隐藏状态,用算法推断,隐马尔可夫模型)
如果状态不可直接观测(例如语音识别中的“音素”),
我们就需要用 EM算法(期望最大化) 或 Baum-Welch算法 来训练。
思想:
- 假设一组随机转移概率;
- 计算在这些概率下,出现观测序列的可能性;
- 调整参数,使得观测序列的出现概率增加;
- 不断迭代,直到收敛。
换句话说,我们在“反向推理”:
找出那组转移概率矩阵,最有可能解释我们观测到的数据。
3️⃣ 先验经验 + 数据修正
有时我们没有足够数据,只能靠经验设定一个初始矩阵,然后用数据进行微调。
比如导航系统:
- 经验:直行概率高、掉头概率低;
- 实测数据:根据实际路口通过情况再修正。
小结
使用马尔可夫模型的关键,就是找到合适的状态定义,并通过观测数据(或算法)获取初始分布与转移概率矩阵。
这三者一旦确定,就能让我们基于某一个时刻的状态预测未来,或计算系统随时间演化的规律。
四、HMM隐马尔可夫模型
在上文中也提到,很多现实场景中,我们并不能直接获取系统的状态,只有对系统的观测值,这种情况又该如何处理呢? 这个章节我们展开来谈谈——
在回答这个问题前,我们首先回顾下,状态和观测值的区别,状态是一个系统的内在决定性的属性,比如一个人,善良、邪恶、勇敢、怯懦、自信、自卑;观测值则是从外面不同观察者获取的数值,可能有局限,有偏差。
但是实际场景中,我们大概率是很难获取一个系统的真实状态,一个人的真实底色,只能利用大量观测值推测一二,所以就出现了隐马尔可夫模型。
HMM(隐马尔可夫模型)是对普通马尔可夫的拓展,它们的核心区别如下:
| 特性 | 普通马尔可夫模型 | 隐马尔可夫模型(HMM) |
|---|---|---|
| 状态可见性 | 状态可直接观测 | 状态隐藏,需要通过观测推测 |
| 观测 | 不涉及观测 | 每个隐藏状态生成观测数据,通过观测概率连接隐藏状态 |
| 模型要素 | 状态 + 转移概率 + 初始概率 | 状态 + 转移概率 + 初始概率 + 观测 + 观测概率 |
| 应用场景 | 可以直接统计状态变化 | 观测数据可以测量,但内部状态未知 |
| 推断任务 | 直接计算下一状态概率 | 需要根据观测序列推测最可能的隐藏状态序列(如 Viterbi) |
再举几个例子,来感受下隐马尔可夫模型
1️⃣ 音乐会(经典 HMM 场景)
- 隐藏状态:乐谱上正在演奏的音符
- 观测:听到的声音(可能有噪音、演奏差异)
- 理解:乐谱是隐藏状态,它决定了实际听到的音符序列,但声音本身可能有变化,不直接代表乐谱。
2️⃣医学诊断
- 隐藏状态:病人的真实健康状态(健康、轻微发病、重病)
- 观测:体温、血压、实验室检查结果
- 理解:测量指标只是病情的表现,指标会有噪声,真正决定病情演变的是隐藏状态。HMM就是用这些观测推测病情序列。
3️⃣ 戏剧
- 隐藏状态:剧本中角色真正的心理状态(开心、紧张、愤怒)
- 观测:演员的表情、台词
- 理解:观众看到的是表象(观测),真实的心理状态(隐藏状态)才决定故事发展和台词的选择。
隐马尔可夫模型包含以下五个核心要素:
| 符号 | 含义 |
|---|---|
| S = {S₁, S₂, ..., S_N} | 隐藏状态集合 |
| V = {v₁, v₂, ..., v_M} | 观测值集合 |
| A = [aᵢⱼ] | 状态转移概率矩阵,表示从状态 i 到状态 j 的概率 |
| B = [bⱼ(k)] | 观测概率矩阵,表示在状态 j 下生成观测 vₖ 的概率 |
| π = [πᵢ] | 初始状态分布 |
一个完整的 HMM 通常写作:
其中,A 决定了隐藏状态之间如何转移;
B 决定了每个状态下“观测值”可能出现的概率分布;
π 决定了系统最开始可能在哪个隐藏状态。
讲到这里,我们再重申下目标
马尔可夫模型(Markov Model, MM):已知当前“状态”,预测未来“状态”。它的关键行为是通过统计方法找到状态之间的转移矩阵。
隐马尔可夫模型(Hidden Markov Model, HMM):已知当前“观测值”,推断当前或未来“隐藏状态”。它的关键行为是根据观测序列找到一个隐马尔可夫模型,在这个隐马尔可夫模型下计算出来观测序列出现概率最大。
但是呢,人类没有办法直接获取全局最优解
不过,到这里伟大的数学家们又出手了:没有办法获取到全局最优解,那咱能不能根据以往经验或者随便给一隐马尔可夫模型,然后不断对这个模型进行调整,使得调整后得模型计算出来的观测序列出现概率一直增加,直到最后这个概率不增加了,就把最后的模型当作全局最优解。
当然这种办法给出的解只能叫做局部最优解,是基于观测序列和隐马尔可夫模型给出的一个局部最优解,是不是全局最优,鬼知道,不过只要样本数量够多、多进行尝试,局部最优就会不断逼近全局最优,或者发现这种情况无法用隐马尔可夫模型推测。
ok,那接下来,我们来谈谈获取隐马尔可夫模型的局部最优解一种最经典的算法——EM(Baum-Welch)算法
EM算法本质是在观测数据确定下,不断用当前模型对隐藏状态进行概率性的统计(E步),然后用这些完整的统计结果来重新计算(M步)出一套更好的、更匹配数据的模型参数。
具体来说如下
问题
已知一个观测序列
假设它符合隐马尔可夫模型,目标是估计 HMM 参数
使这个隐马尔可夫模型下下计算出来观测序列出现概率 P(O∣λ)最大
解答
1️⃣ 计算前向概率 αₜ(i):
表示在时刻 t 处于状态 i 并观测到 O₁...Oₜ 的概率。
通过递推计算:
2️⃣ 后向概率 βₜ(i):
表示从时刻 t 状态 i 出发,观测到 的概率。
观测序列概率
3️⃣ 状态期望概率 γₜ(i):
观测序列是O且时刻 t 在状态 i 的概率 ,这里要解释下,时刻t有可能是状态i,也有可能是状态j,k等
4️⃣ 转移期望概率 ξₜ(i,j):
时刻 t 从状态 i 转移到状态 j 的概率:
M步:重新估计参数 A、B、π
现在我们用这些期望概率重新计算模型参数:
这些更新意味着:
- A 更新 = 实际上 i→j 的期望次数 / i 状态出现的总期望次数
- B 更新 = 状态 i 发出观测 k 的期望次数 / 状态 i 总出现次数
- π 更新 = 第一个时刻各状态的概率
也就是说,我们让模型参数直接匹配“数据中期望的统计频率”。
重复 E步 + M步,直到收敛
因为EM算法保证,每次更新使观测序列的概率不断增大。
最后,当似然增大到变化极小时(或迭代次数达到上限),就认为收敛,输出 所有模型参数。
小结
在使用 HMM 时,我们通常要解决以下三个经典问题👇
| 问题 | 名称 | 目标 |
|---|---|---|
| ① 概率计算问题 | Evaluation | 给定模型 λ 和观测序列 O,求该观测序列出现的概率 P(O|λ) |
| ② 解码问题 | Decoding | 给定 λ 和 O,求最可能的隐藏状态序列 Q |
| ③ 学习问题 | Learning | 给定观测序列 O,估计模型参数 (A, B, π) 使得 P(O|λ) 最大 |
Baum–Welch 是 EM 在 HMM 上的具体实现:在“看不见状态”的条件下,E 步用当前模型软估计隐藏状态的期望统计(γ、ξ),M 步用这些期望统计更新参数(π、A、B),每次迭代使观测似然单调不减,直到收敛(通常到局部最优)
总结
隐马尔可夫模型(HMM)揭示了“观测背后的隐藏规律”——我们看到的只是表象,而真正决定系统行为的是隐藏状态。通过状态转移和观测概率,HMM 能从外部信号中推断系统内部的演化逻辑。虽然它假设状态转移是离散且仅依赖上一个状态,难以处理复杂连续或长距离依赖,但这一思想为后续的 CRF、RNN、Transformer 等模型奠定了基础,让机器具备了从观测中理解“隐含因果”的能力。