欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

隐马尔可夫过程

发布时间:2023/12/14 编程问答 50 豆豆
生活随笔 收集整理的这篇文章主要介绍了 隐马尔可夫过程 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

隐马尔可夫过程

基本概念

隐马尔可夫过程有明暗两条线,明线是可观测的变量,暗线是隐藏状态。例如在三个不同的装有黑白球的盒子中取球,明线是观测序列,就是每次取出来的球的颜色构成的序列,暗线是状态序列,也就是每次取的球属于的盒子的序列。我们只能观测到观测序列,而不能观测到盒子序列。

推动隐马尔可夫模型随着时间不断运行的是它的内核三要素:状态转移矩阵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语言描述》 张雨萌

总结

以上是生活随笔为你收集整理的隐马尔可夫过程的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。