HMM模型
- 马尔科夫链
- HMM简介
- HMM模型基础
- 前向后向算法评估观察序列概率
- 维特⽐算法解码隐藏状态序列
- 鲍姆-⻙尔奇算法简介
- HMM模型API介绍
马尔科夫链
⻢尔科夫链即为状态空间中从⼀个状态到另⼀个状态转换的随机过程。
该过程要求具备“⽆记忆”的性质: 下⼀状态的概率分布只能由当前状态决定,在时间序列中它前⾯的事件均与之⽆关。这种特定类型的“⽆记忆 性”称作⻢尔可夫性质。
下图中的⻢尔科夫链是⽤来表示股市模型,共有三种状态:⽜市(Bull market), 熊市(Bear market)和横盘 (Stagnant market)。 每⼀个状态都以⼀定的概率转化到下⼀个状态。⽐如,⽜市以0.025的概率转化到横盘的状态。
HMM简介
可见状态链:
隐含状态链:
HMM模型基础
使⽤HMM模型时我们的问题⼀般有这两个特征:
1)我们的问题是基于序列的,⽐如时间序列,或者状态序列。
2)我们的问题中有两类数据:
⼀类序列数据是可以观测到的,即观测序列;
⽽另⼀类数据是不能观察到的,即隐藏状态序列,简称状态序列
HMM模型的定义:
1) ⻬次⻢尔科夫链假设。
2) 观测独⽴性假设。
一个HMM模型实例:
总结:
什么样的问题可以⽤HMM模型解决
基于序列的,⽐如时间序列;
问题中包含两类数据,⼀类是可以观测到的观测序列;另⼀类是不能观察到的隐藏状态序列。
HMM模型的两个重要假设
其次⻢尔科夫链假设
观测独⽴性假设
HMM模型的三个基本问题
评估观察序列概率—— 前向后向的概率计算
预测问题,也称为解码问题 ——维特⽐(Viterbi)算法
模型参数学习问题 —— 鲍姆-⻙尔奇(Baum-Welch)算法
前向后向算法评估观察序列概率
例子:
计算:
维特⽐算法解码隐藏状态序列
论维特⽐算法解码隐藏状态序列,即给定模型和观测序列,求给定观测序列条件下,最可能出现的对应 的隐藏状态序列。
同时维特⽐算法是⼀个通⽤的求序列最短路径的动态规划算法
计算:
鲍姆-⻙尔奇算法简介
HMM模型API介绍
API安装:
pip install hmmlearn
hmmlearn介绍:
实例:
import numpy as np
from hmmlearn import hmm
# 设定隐藏状态的集合
states = ["box 1", "box 2", "box3"]
n_states = len(states)
# 设定观察状态的集合
observations = ["red", "white"]
n_observations = len(observations)
# 设定初始状态分布
start_probability = np.array([0.2, 0.4, 0.4])
# 设定状态转移概率分布矩阵
transition_probability = np.array([
[0.5, 0.2, 0.3],
[0.3, 0.5, 0.2],
[0.2, 0.3, 0.5]])
# 设定观测状态概率矩阵
emission_probability = np.array([
[0.5, 0.5],
[0.4, 0.6],
[0.7, 0.3]])
# 设定模型参数
model = hmm.MultinomialHMM(n_components=n_states)
model.startprob_=start_probability # 初始状态分布
model.transmat_=transition_probability # 状态转移概率分布矩阵
model.emissionprob_=emission_probability # 观测状态概率矩阵
# 设定观测序列
seen = np.array([[0,1,0]]).T
box = model.predict(seen)
print("球的观测顺序为:\n", ", ".join(map(lambda x: observations[x], seen.flatten()))) # 注意:需要使⽤flatten⽅法,把seen从⼆维变成⼀维
print("最可能的隐藏状态序列为:\n", ", ".join(map(lambda x: states[x], box)))
print(model.score(seen))