隐马尔可夫过程
隐马尔可夫过程
基本概念
隐马尔可夫过程有明暗两条线,明线是可观测的变量,暗线是隐藏状态。例如在三个不同的装有黑白球的盒子中取球,明线是观测序列,就是每次取出来的球的颜色构成的序列,暗线是状态序列,也就是每次取的球属于的盒子的序列。我们只能观测到观测序列,而不能观测到盒子序列。
推动隐马尔可夫模型随着时间不断运行的是它的内核三要素:状态转移矩阵AAA、观测概率矩阵BBB、以及初始隐状态概率向量π\piπ。
写成三元组形式:λ=(A,B,π)\lambda=(A, B, \pi)λ=(A,B,π)。
求观测序列
已知隐马尔可夫模型三要素λ=(A,B,π)\lambda=(A, B, \pi)λ=(A,B,π),以及隐藏状态序列I=(i1,i2,⋯,iT)I=(i_1, i_2, \cdots,i_T)I=(i1,i2,⋯,iT)的基础上,求有可能对应的观测矩阵O=(o1,o2,⋯,oT)O=(o_1,o_2, \cdots,o_T)O=(o1,o2,⋯,oT)
使用前向概率算法:
1、令αt(i)=P(o1,o2,⋯,ot,ii=qt∣λ)\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)=πibio1\alpha_1(i)=\pi_ib_{io_1}α1(i)=πibio1;
3、递推关系:αt+1(i)=[∑j=1Nαt(j)aji]biot+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=1Nα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: PyCharmimport 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=(o1,o2,⋯,oT)O=(o_1,o_2, \cdots,o_T)O=(o1,o2,⋯,oT)的基础上,求有可能对应的隐藏状态序列I=(i1,i2,⋯,iT)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语言描述》 张雨萌
总结
- 上一篇: 判断一个年份是否是闰年
- 下一篇: PSP联机插件pro online