隐马尔可夫模型(Hidden Markov Model,HMM)
马尔科夫假设
随机过程中各个状态St的概率分布,只与它的前一个状态St−1有关,即
P(St∣S1,S2,S3,…,St−1)=P(St∣St−1)
对于一些实际情况中的概率关系(比如天气预报)显然是不够合理的,但至少给出了一个相对准确的近似解
符合马尔科夫假设的随机过程称为马尔科夫过程,或马尔科夫链

上图中圆圈表示状态,圆圈间的箭头表示状态的转化,箭头的权值P(xi+1,t∣xi,j)代表由状态xi,j向状态xi+1,t转移的概率,此处xi,j均取自同一个状态集合,之间互相转化。
隐马尔科夫链
在马尔科夫链的基础上引入隐马尔科夫链,任一时刻t的状态St是不可见的。观察者没法通过观察到状态序列S1,S2,S3,…,ST来进行推测。但是隐含马尔可夫模型在每个时刻t会输出一个符号Ot,而且Ot和St仅和St相关。

其中P(S2∣S1)代表由S1转化为S2的概率,P(O1∣S1)代表在状态S1时,输出O1的概率
隐马尔科夫链的五元组
HMM模型的五元组(S,O,Π,A,B)
状态值集合S={S1,S2,...,Sn}
观察值集合O={O1,O2,...,Om}
初始状态序列Π={P1,P2,...,Pn},此处初始化概率Pi是指P(Si∣初始状态)
转移概率序列A={Ai,j∣i,j∈{1,2,...,n}},此处转移概率Ai,j是指由状态Si向Sj转移的概率
发射概率序列B={Bi,j∣i∈{1,2,...,n},j∈{1,2,...,m}},此处转移概率Ai,j是指由状态Si输出Oj转移的概率
为方便对HMM五元组的理解,举个例子:
医生通过病人对自身身体感受的描述(正常,头晕,冷)来判断病人的病情(健康,低烧,高烧)
其中隐含的病情状态值集合为{健康,低烧,高烧}
可观察的身体感受观察值集合为{正常,头晕,冷}
医生根据以往病例,预判病人的病情,即初始状态序列
医生根据以往病例,得出的病人在两天之间病情转换概率,即转移概率序列
| 前\后 |
健康 |
低烧 |
高烧 |
| 健康 |
0.8 |
0.15 |
0.05 |
| 低烧 |
0.4 |
0.3 |
0.3 |
| 高烧 |
0.2 |
0.5 |
0.3 |
根据以往病例,医生得出的病人在相应病情下的身体感受概率,即发射概率序列
| 病情\感受 |
正常 |
头晕 |
冷 |
| 健康 |
0.8 |
0.1 |
0.1 |
| 低烧 |
0.2 |
0.4 |
0.4 |
| 高烧 |
0.1 |
0.3 |
0.6 |
隐马尔科夫链的三个假设
- 有限历史性假设:状态的概率分布只与其前一个状态有关
P(Si∣Si−1,Si−2,...,S1)=P(Si∣Si−1)
- 齐次性假设:状态与具体时间无关
P(Si+1∣Si)=P(Sj+1∣P(Sj))
- 输出独立性假设:输出仅与当前状态有关
P(O1O2...Ot∣S1S2...St)=P(Ot∣St)
隐马尔科夫链的三类问题
- 评估问题:给定模型,求某个输出序列的概率
- 在病人近几日的病情已知,所有概率序列均已知的情况下,计算病人最后一日身体感受的概率
- Forward-Backward算法
- 解码问题:给定模型和某个特定的输出序列,找到最可能产生这个输出的状态序列
- 已知所有概率序列,和近几日病人身体感受,得出近几日病人的病情
- Viterbi算法
- 学习问题:给定足够量的观测数据,估计隐含马尔可夫模型的参数
- 通过大量病例推算模型参数
- 无监督训练算法(鲍姆-韦尔奇算法)
维特比(viterbi)算法与中文词性标注(二)—— 维特比算法
维特比(viterbi)算法与中文词性标注(三)——词性标注实现
参考文献
[1]一文搞懂HMM(隐马尔可夫模型)
[2]HMM模型和Viterbi算法
[3]简单理解viterbi算法