学习 HMM
简介
HMM 中的变量可以分为两组.
- 第一组是状态变量 \(\{y_i,y_2,\cdots, y_n\}\), 其中 \(y_i \in \mathcal{Y}\) 表示第 \(i\) 时刻的系统状态. 通常假定状态变量是隐藏的、不可观测的, 因此状态变量亦被称为隐变量 (hidden variable).
- 第二组是观测变量 \(\{x_1,x_2,\cdots, x_n\}\), 其中 \(x_i \in \mathcal{X}\) 表示第 \(i\) 时刻的观测值. 在 HMM 中, 系统通常在多个状态 \(\{s_1,s_2,\cdots,s_N\}\) 之间转换, 因此状态变量 \(y_i\) 的取值范围 \(\mathcal{Y}\) 通常有 \(N\) 个可能的离散空间.
下图更加直观:
graph LR;
subgraph 状态变量或隐变量
y1 --now--> y2
y2 --now--> y3
y3 --now--> y4
ago --> now
end
subgraph 观测变量
y1 --> x1
y2 --> x2
y3 --> x3
y4 --> x4
end
上图的箭头表示了变量之间的依赖关系. 在任一时刻, 观测变量的取值仅仅依赖于状态变量, 即 \(x_t\) 由 \(y_t\) 确定, 与其他的状态变量及其观测变量的取值无关. 同时, \(t\) 时刻的状态 \(y_t\) 仅依赖于 \(t-1\) 时刻的状态, 与其余 \(n-2\) 个状态无关. 这就是所谓的『马尔可夫链』(Markov chain), 系统下一时刻的状态仅由当前状态决定, 不依赖于以往的任何状态. 这样, 便有
\[P(x_1,y_1,\cdots,x_n,y_n) = P(y_1)P(x_1|y_1)\displaystyle\prod_{i=2}^n P(y_i|y_{i-1})P(x_i|y_i)
\]
除了结构信息外, 要确定一个 HMM 还需要以下三个参数:
- 状态转移概率: 模型在各个状态间转换的概率, 常记作矩阵 \(A=[a_{ij}]_{N\times N}\), 其中 \(a_{ij} = P(y_{t+1}=s_j|y_t=s_i), \text{ }\;\;1 \leq i,j \leq N\)
- 输出观测概率: 模型根据当前状态获得各个观测值的概率, 常常记作矩阵 \(B = [b_{ij}]_{N\times M},\) 其中 \(b_{ij} = P(x_t=o_j|y_t=s_i), \text{ }\;\;1\leq i \leq N, 1 \leq j \leq M\) 表示在任意时刻 \(t\), 若状态为 \(s_i\), 则观测值 \(o_j\) 被获取的概率.
- 初始状态概率: 模型在初始时刻各个状态出现的概率, 常常记作 \(\pi = (\pi_1, \pi_2, \cdots, \pi_N)\), 其中 \(\pi_i = P(y_1=s_i), \text{ }\;\;1\leq i \leq N\), 表示模型的初始状态为 \(s_i\) 的概率.
通过指定状态空间 \(\mathcal{Y}\), 观测空间 \(\mathcal{X}\) 和上述三组参数, 就能确定一个 HMM, 通常用其参数 \(\lambda = [A,B,\pi ]\) 来指代. 给定 \(\lambda\), 它按照如下过程产生观测序列 \(\{x_1,x_2,\cdots, x_n\}\)
- 设置 \(t=1\), 并根据初始化状态概率 \(\pi\) 选择初始状态 \(y_i\);
- 根据状态 \(y_t\) 和输出观测概率 \(B\) 选择观测变量取值 \(x_t\);
- 根据状态 \(y_t\) 和状态转移矩阵 \(A\) 转移模型状态, 即确定 \(y_{t+1}\);
- 若 \(t<n\), 设置 \(t=t+1\), 并转到第 2 步, 否则停止.
其中 \(y_t\in \{s_1,s_2,\cdots,s_N\}\) 和 \(x_t \in \{o_1,o_2,\cdots,o_M\}\), 分别为第 \(t\) 时刻的状态和观测值.
python 库: hmmlearn
探寻有趣之事!