中国移动 WebService 主从复制 Python爬虫实战 sharepoint automation lua scrapy arm usb vue学习 安卓项目实战 js对象添加元素 mser算法 java使用redis java上传图片 python运算 python写文件 python查找指定字符 java中的接口 java初级 java写文件 javastringbuilder java操作数据库 java时间转时间戳 java接口规范 金山wps2003 怪物猎人ol捏脸数据 一键换系统 端口关闭工具 lseek函数 橄榄山快模 p6软件 pr蒙版 视频md5修改器 edquota qq魔法卡片登陆 losecontrol geartrax 苹果8怎么截屏
当前位置: 首页 > 学习教程  > 编程语言

HMM

2020/12/28 19:30:02 文章标签:

HMM 马尔科夫链即为 状态空间中从一个状态到另一个状态转换的随机过程。 该过程要求具备 “无记忆” 的性质: 下一状态的概率分布只能由当前状态决定,在时间序列中它前面的事件均与之无关 隐马尔可夫模型(Hidden Markov Model&#xff0c…

HMM

马尔科夫链即为

  • 状态空间中从一个状态到另一个状态转换的随机过程。

  • 该过程要求具备

    “无记忆”

    的性质:

    • 下一状态的概率分布只能由当前状态决定,在时间序列中它前面的事件均与之无关

隐马尔可夫模型(Hidden Markov Model,HMM)是统计模型,它用来描述一个含有隐含未知参数的马尔可夫过程。

  • 隐马尔可夫模型(Hidden Markov Model,HMM)是统计模型,它用来描述一个含有隐含未知参数的马尔可夫过程。

  • 常见术语

    • 可见状态链
    • 隐含状态链
    • 转换概率
    • 输出概率
  • 什么样的问题可以用HMM模型解决

    • 基于序列的,比如时间序列;
    • 问题中包含两类数据,一类是可以观测到的观测序列;另一类是不能观察到的隐藏状态序列。
  • HMM模型的两个重要假设

    • 其次马尔科夫链假设
    • 观测独立性假设
  • HMM模型的三个基本问题

    • 评估观察序列概率—— 前向后向的概率计算
    • 预测问题,也称为解码问题 ——维特比(Viterbi)算法
    • 模型参数学习问题 —— 鲍姆-韦尔奇(Baum-Welch)算法
  • 前向算法求HMM观测序列

    • 输入:HMM模型 λ=(A,B,Π),观测序列image-20200609235438949
    • 输出:观测序列概率P(O|λ)
        1. 计算时刻1的各个隐藏状态前向概率:image-20191211111014281
        1. 递推时刻2,3,… …T时刻的前向概率:image-20191211111110223
        1. 计算最终结果:image-20191211111203339
  • 后向算法求HMM观测序列

    • 输入:HMM模型 λ=(A,B,Π),观测序列image-20200609235438949
    • 输出:观测序列概率P(O|λ)
      • 初始化时刻T的各个隐藏状态后向概率:image-20191211131712030
      • 递推时刻T−1,T−2,…1时刻的后向概率:image-20191211131727431
      • 计算最终结果:image-20191211131746630

维特比算法流程总结:

  • 输入:HMM模型 λ=(A,B,Π),观测序列image-20200610115739520
  • 输出:最有可能的隐藏状态序列image-20200610115759219

流程如下:

  • 1)初始化局部状态:

image-20191211153308449

    1. 进行动态规划递推时刻 t=2,3,…T 时刻的局部状态:

image-20191211153349430

    1. 计算时刻T最大的image-20200610115901486,即为最可能隐藏状态序列出现的概率。计算时刻T最大的 image-20200610115925436,即为时刻T最可能的隐藏状态。

image-20191211153412145

    1. 利用局部状态image-20200610115945012开始回溯。对于 t=T-1,T-2,…,1

image-20191211153607900

最终得到最有可能的隐藏状态序列: image-20200610120053531

MultinomialHMM实例

下面我们用我们在前面讲的关于球的那个例子使用MultinomialHMM跑一遍。

import numpy as np
from hmmlearn import hmm
# 设定隐藏状态的集合
states = ["box 1", "box 2", "box3"]
n_states = len(states)

# 设定观察状态的集合
observations = ["red", "white"]
n_observations = len(observations)

# 设定初始状态分布
start_probability = np.array([0.2, 0.4, 0.4])

# 设定状态转移概率分布矩阵
transition_probability = np.array([
  [0.5, 0.2, 0.3],
  [0.3, 0.5, 0.2],
  [0.2, 0.3, 0.5]
])

# 设定观测状态概率矩阵
emission_probability = np.array([
  [0.5, 0.5],
  [0.4, 0.6],
  [0.7, 0.3]
])
# 设定模型参数
model = hmm.MultinomialHMM(n_components=n_states)
model.startprob_=start_probability  # 初始状态分布
model.transmat_=transition_probability  # 状态转移概率分布矩阵
model.emissionprob_=emission_probability  # 观测状态概率矩阵

现在我们来跑一跑HMM问题三维特比算法的解码过程,使用和之前一样的观测序列来解码,代码如下:

seen = np.array([[0,1,0]]).T  # 设定观测序列
box = model.predict(seen)

print("球的观测顺序为:\n", ", ".join(map(lambda x: observations[x], seen.flatten())))
# 注意:需要使用flatten方法,把seen从二维变成一维
print("最可能的隐藏状态序列为:\n", ", ".join(map(lambda x: states[x], box)))

我们再来看看求HMM问题一的观测序列的概率的问题,代码如下:

print(model.score(seen))
# 输出结果是:-2.03854530992

要注意的是score函数返回的是以自然对数为底的对数概率值,我们在HMM问题一中手动计算的结果是未取对数的原始概率是0.13022。对比一下:

import math

math.exp(-2.038545309915233)
# ln0.13022≈−2.0385
# 输出结果是:0.13021800000000003

本文链接: http://www.dtmao.cc/news_show_550263.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?