隐马尔可夫过程
基本概念
隐马尔可夫过程有明暗两条线,明线是可观测的变量,暗线是隐藏状态。例如在三个不同的装有黑白球的盒子中取球,明线是观测序列,就是每次取出来的球的颜色构成的序列,暗线是状态序列,也就是每次取的球属于的盒子的序列。我们只能观测到观测序列,而不能观测到盒子序列。
推动隐马尔可夫模型随着时间不断运行的是它的内核三要素:状态转移矩阵 A A A、观测概率矩阵 B B B、以及初始隐状态概率向量 π \pi π。
写成三元组形式: λ = ( A , B , π ) \lambda=(A, B, \pi) λ=(A,B,π)。
求观测序列
已知隐马尔可夫模型三要素 λ = ( A , B , π ) \lambda=(A, B, \pi) λ=(A,B,π),以及隐藏状态序列 I = ( i 1 , i 2 , ⋯ , i T ) I=(i_1, i_2, \cdots,i_T) I=(i1,i2,⋯,iT)的基础上,求有可能对应的观测矩阵 O = ( o 1 , o 2 , ⋯ , o T ) O=(o_1,o_2, \cdots,o_T) O=(o1,o2,⋯,oT)
使用前向概率算法:
1、令 α t ( i ) = P ( o 1 , o 2 , ⋯ , o t , i i = q t ∣ λ ) \alpha_t(i)=P(o_1,o_2,\cdots,o_t,i_i=q_t|\lambda) αt(i)=P(o1,o2,⋯,ot,ii=qt∣λ);
2、初始值: α 1 ( i ) = π i b i o 1 \alpha_1(i)=\pi_ib_{io_1} α1(i)=πibio1;
3、递推关系: α t + 1 ( i ) = [ ∑ j = 1 N α t ( j ) a j i ] b i o t + 1 \alpha_{t+1}(i)=[\sum_{j=1}^N\alpha_t(j)a_{ji}]b_{io_{t+1}} αt+1(i)=[∑j=1Nαt(j)aji]biot+1,一直推到 α T ( i ) \alpha_{T}(i) αT(i);
4、相加得到结果: P ( O ∣ λ ) = ∑ i = 1 N α T ( i ) P(O|\lambda)=\sum_{i=1}^N\alpha_T(i) P(O∣λ)=∑i=1NαT(i)
代码实现:
# -*- coding: utf-8 -*-
# @Use :
# @Time : 2022/8/29 22:03
# @FileName: hidden_Markov.py
# @Software: PyCharm
import numpy as np
from hmmlearn import hmm
# 隐状态
states = ['box1', 'box2', 'box3']
# 观测集合
observations = ['black', 'white']
# 初始概率
start_probability = np.array([0.3, 0.5, 0.2])
# 状态转移矩阵
transition_probability = np.array([
[0.4, 0.4, 0.2],
[0.3, 0.2, 0.5],
[0.2, 0.6, 0.2]
])
# 观测概率矩阵
emission_probability = np.array([
[0.2, 0.8],
[0.6, 0.4],
[0.4, 0.6]
])
# 使用MultinomialHMM建模
model = hmm.MultinomialHMM(n_components=len(states))
model.startprob_ = start_probability
model.transmat_ = transition_probability
model.emissionprob_ = emission_probability
# 观测序列
observation_list = np.array([0, 1, 0])
# 计算观测序列概率,是概率的自然对数值
print(np.exp(model.score(observation_list.reshape(-1, 1))))
求隐藏状态序列
已知隐马尔可夫模型三要素 λ = ( A , B , π ) \lambda=(A, B, \pi) λ=(A,B,π),以及观测矩阵 O = ( o 1 , o 2 , ⋯ , o T ) O=(o_1,o_2, \cdots,o_T) O=(o1,o2,⋯,oT)的基础上,求有可能对应的隐藏状态序列 I = ( i 1 , i 2 , ⋯ , i T ) I=(i_1, i_2, \cdots,i_T) I=(i1,i2,⋯,iT)
使用维特比算法进行解码:
# 隐状态
states = ['box1', 'box2', 'box3']
# 观测集合
observations = ['black', 'white']
# 初始概率
start_probability = np.array([0.3, 0.5, 0.2])
# 状态转移矩阵
transition_probability = np.array([
[0.4, 0.4, 0.2],
[0.3, 0.2, 0.5],
[0.2, 0.6, 0.2]
])
# 观测概率矩阵
emission_probability = np.array([
[0.2, 0.8],
[0.6, 0.4],
[0.4, 0.6]
])
# 使用MultinomialHMM建模
model = hmm.MultinomialHMM(n_components=len(states))
model.startprob_ = start_probability
model.transmat_ = transition_probability
model.emissionprob_ = emission_probability
# 观测序列,黑白黑
observation_list = np.array([0, 1, 0])
# 调用维特比算法对观测序列进行隐状态解码
logprob, box_list = model.decode(observation_list.reshape(-1, 1), algorithm='viterbi')
# 输出隐状态序列
print(box_list)
for i in range(len(observation_list)):
print(states[box_list[i]])
参考
《机器学习中的概率统计 python语言描述》 张雨萌