隐马尔科夫模型 (HMM) 算法介绍及代码实现

2023-11-03

Table of Contents

Hidden Markov Model (隐马尔科夫模型)

Back to TOC

两种问题特征:

  • 基于序列的,比如时间序列,或者状态序列
  • 两类数据,一类序列数据是可以观测到的,即观测序列;而另一类数据是不能观察到的,即隐藏状态序列,简称状态序列

定义

Back to TOC

假设 N N N是可能的隐藏状态数, M M M是可能的观测状态数,定义
Q = { q 1 , q 2 , … , q N } , V = { v 1 , v 2 , … , v M } \mathcal{Q}=\{q_1,q_2,\dots,q_N\},\mathcal{V}=\{v_1,v_2,\dots,v_M\} Q={ q1,q2,,qN},V={ v1,v2,,vM}
分别为所有可能的隐藏状态和所有可能的观测状态的集合
同时,对于一个长度为 T T T的序列 I I I,和对应的观测序列 O O O
I = { s 1 , s 2 , … , s T } , O = { o 1 , o 2 , … , o T } \mathcal{I}=\{s_1,s_2,\dots,s_T\},\mathcal{O}=\{o_1,o_2,\dots,o_T\} I={ s1,s2,,sT},O={ o1,o2,,oT}
HMM做了两个很重要的假设:

  • 齐次马尔科夫链假设。任意时刻隐藏状态只依赖于它前一个隐藏状态
    定义状态转移概率 A i j A_{ij} Aij从当前时刻 t t t的状态 s i s_i si转移到下一时刻 t + 1 t+1 t+1的状态 s j s_j sj的概率,即
    A i j = P ( s t + 1 = q j ∣ s t = q i ) A_{ij}=P(s_{t+1}=q_j|s_t=q_i) Aij=P(st+1=qjst=qi)
    从而定义状态转移矩阵 A ∈ R N × N A\in \mathbb{R}^{N\times N} ARN×N
  • 观测独立性假设即任意时刻的观测状态只仅仅依赖于当前时刻的隐藏状态。定义生成概率 B i j B_{ij} Bij由隐藏状态 s i s_i si生成观测状态 q j q_j qj的概率,即
    B i j = P ( o t = v i ∣ s t = q j ) B_{ij}=P(o_t=v_i|s_t=q_j) Bij=P(ot=vist=qj)
    从而定义生成概率矩阵(发射矩阵) B ∈ R N × M B\in \mathbb{R}^{N\times M} BRN×M
    最后,定义在 t t t时刻的隐藏状态分布 Π t = [ π t ( k ) ] \Pi_t=[\pi_t (k)] Πt=[πt(k)],其中 π t ( k ) = P ( s t = q k ) \pi_t (k)=P(s_t=q_k) πt(k)=P(st=qk)
    因此一个HMM模型主要由三个参数表示:
    λ = ( A , B , Π ) \lambda=(A,B,\Pi) λ=(A,B,Π)

基本问题

Back to TOC

    1. 评估观察序列概率。给定模型 λ \lambda λ和观测序列 O \mathcal{O} O,计算在模型 λ \lambda λ下该观测序列 O \mathcal{O} O出现的概率 P ( O ∣ λ ) P(\mathcal{O}|\lambda) P(Oλ)。求解方法:前向后向算法
    1. 预测问题。给定观测序列 O = { o 1 , o 2 , … , o T } \mathcal{O}=\{o_1,o_2,\dots,o_T\} O={ o1,o2,,oT}和模型参数 λ = ( A , B , Π ) \lambda=(A,B,\Pi) λ=A,B,Π),求解最有可能出现的隐藏状态序列。求解方法:Viterbi算法
    1. 模型参数学习问题。给定观测序列 O = { o 1 , o 2 , … , o T } \mathcal{O}=\{o_1,o_2,\dots,o_T\} O={ o1,o2,,oT},求解模型参数 λ = ( A , B , Π ) \lambda=(A,B,\Pi) λ=A,B,Π)使得 P ( O ∣ λ ) P(\mathcal{O}|\lambda) P(Oλ)最大。求解方法:Baum-Walch算法(EM算法)

前向算法

Back to TOC
在这里插入图片描述

算法流程

输入:观测序列 O = { o 1 , o 2 , … , o T } \mathcal{O}=\{o_1,o_2,\dots,o_T\} O={ o1,o2,,oT},模型参数 λ = ( A , B , Π ) \lambda=(A,B,\Pi) λ=A,B,Π)
输出:观测序列 P ( O ∣ λ ) P(O|\lambda) P(Oλ)
步骤:

  • 计算时刻1各个隐藏状态 s i s_i si的前向概率
    α 1 ( i ) = π ( i ) B i , o 1 , i = 1 , 2 , … , N \alpha_1(i)=\pi(i)B_{i,o_1},i=1,2,\dots,N α1(i)=π(i)Bi,o1,i=1,2,,N
  • 递推 2 , 3 , … , T 2,3,\dots,T 2,3,,T时刻的前向概率
    α t + 1 ( i ) = [ ∑ j = 1 N α t ( j ) A j i ] B i , o t + 1 , i = 1 , 2 , … , N \alpha_{t+1}(i)=[\sum_{j=1}^{N}\alpha_{t}(j)A_{ji}]B_{i,o_{t+1}},i=1,2,\dots,N αt+1(i)=[j=1Nαt(j)Aji]Bi,ot+1,i=1,2,,N
  • 最终结果
    P ( O ∣ λ ) = ∑ i N α T ( i ) P(\mathcal{O}|\lambda)=\sum_i^N\alpha_T(i) P(Oλ)=iNαT(i)

实现代码

def HMMfwd(pi, a, b, obs):
    '''
    pi:初始概率分布
    a:状态转移矩阵
    b:发射矩阵
    obs:观测序列
    '''

    nStates = np.shape(b)[0]
    T = np.shape(obs)[0]

    alpha = np.zeros((nStates,T))
    '''alpha[i,t]表示上述公式的 alpha_t(i)'''
    alpha[:,0] = pi*b[:,obs[0]]

    for t in range(1,T):
        for s in range(nStates):
            alpha[s,t] = b[s,obs[t]] * np.sum(alpha[:,t-1] * a[:,s])

    return alpha

最后计算 P ( O ∣ λ ) P(\mathcal{O}|\lambda) P(Oλ)

np.sum(alpha[:,-1])

后向算法

Back to TOC
在这里插入图片描述

算法流程

输入:观测序列 O = { o 1 , o 2 , … , o T } \mathcal{O}=\{o_1,o_2,\dots,o_T\} O={ o1,o2,,oT},模型参数 λ = ( A , B , Π ) \lambda=(A,B,\Pi) λ=

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

隐马尔科夫模型 (HMM) 算法介绍及代码实现 的相关文章

  • 【Nginx 】nginx的正则表达式

    1 nginx配置基础 1 正则表达式匹配 区分大小写匹配 不区分大小写匹配 和 分别为区分大小写不匹配及不区分大小写不匹配 以什么开头的匹配 以什么结尾的匹配 转义字符 可以转 等 代表任意字符 2 文件及目录匹配 f和 f用来判断是否存
  • AS608指纹识别模块+STM32实现指纹录入

    视频演示 d9148ed412b24119db81eef6c2c8e9ec 1 特性参数 资料来自ALIENTEK文档 ATK AS608 指纹识别模块是 ALIENTEK 推出的一款高性能的光学指纹识别模块 ATK AS608 模块采用了

随机推荐

  • git 下拉使用方法

    1 新建文件 新建的文件是用来关联远程仓库 可进行下拉和上传操作 新建的方法有很多中 选择一种自己认为比简单的即可 2 通过文件打开git bash 用鼠标右键点击所需文件 点击 git bash here 选项 打开后出现 gitC Us
  • 五款拿来就能用的炫酷表白代码

    作者主页 士别三日wyx 作者简介 CSDN top100 阿里云博客专家 华为云享专家 网络安全领域优质创作者 推荐专栏 小白零基础 Python入门到精通 五款炫酷表白代码 1 无限弹窗表白 2 做我女朋友好吗 不同意就关机 3 爱心发
  • 12.网络爬虫—线程队列详讲(实战演示)

    网络爬虫 线程队列详讲与实战 线程 队列 Queue模块介绍 线程和队列的关系 生产者消费者模式 实战演示 王者荣耀照片下载 使用生产者消费者模式 前言 个人简介 以山河作礼 Python领域新星创作者 CSDN实力新星认证 第一篇文章 1
  • angular2 组件的生命周期钩子

    按照生命周期执行的先后顺序 Angular生命周期接口如下所示 名称 时机 接口 范围 ngOnChanges 当被绑定的输入属性的值发生变化时调用 首次调用一定会发生在 ngOnInit之前 OnChanges 指令和组件 ngOnIni
  • Open3D 手动裁剪点云

    目录 一 概述 1 主要函数 2 基础操作 二 代码实现 三 结果展示 四 相关链接 一 概述 Open3d中的VisualizerWithEditing类提供了图形用户交互功能 draw geometries with editing p
  • Java 线程创建方法

    除了继承Thread 实现Runnable Callable三种创建线程方式外的第四种创建方式 实现java util concurrent ThreadFactory接口 实现newThread Runnable r 方法 这种方式应用于
  • 线上CPU飙升排查

    背景 cpu idle下降50 full gc触发线上报警 处理 1 top命令 查看所有进程占用CPU的排序 第一个就是我们的java服务进程 或者jps命令直接查看java服务进程 2 top Hp 46845 查看进程下所有线程占用C
  • 区块链入门之windows 安装以太坊 ethereum 客户端 (win7-64)

    以太坊 Ethereum 是一个运行智能合约的去中心化平台 Platform for Smart Contract 平台上的应用按程序设定运行 不存在停机 审查 欺诈 第三方人为干预的可能 以太坊平台由 Golang C Python 等多
  • Tomcat部署服务器添加多个<Host>就加载多次项目问题《解决方案》

    如题 项目部署到阿里云服务器之后 配置tomcat一个域名同时又可以使用IP直接访问项目 配置是如下
  • vue-router详解 - 从使用到扩展

    1 认识路由 1 1 后端路由 早期的网站开发整个HTML页面是由服务器来渲染的 服务器直接生产渲染好对应的HTML页面 返回给客户端进行展示 但是 一个网站 这么多页面服务器如何处理呢 一个页面有自己对应的网址 也就是URL URL会发送
  • Pychram:踩坑记录/窍门分享

    Debug Console 当使用PyCharm的Debug模式时 最好用的莫过于Debug Console 它与断点相配合可以实现类似于Jupyter Notebook的逐块运行代码的效果 但是今天我突然发现Debug Console无法
  • 用户体验式UI设计

    用户体验式UI设计 1 什么是用户体验式设计 产品的业务化和易用性始终是我们追求的目标 随着 Net Framework 3 0的推出 Windows Presentation Foundation WPF 组件库把用户UI
  • openGL之API学习(三十七)如何从FBO中读取颜色、深度信息

    方法一 保存成图片 QImage img new QImage WINDOW WIDTH WINDOW HEIGHT QImage Format ARGB32 uchar tmpBIT img gt bits 从颜色缓冲区中读取数据 int
  • C++整型(short,int,long,longlong)

    C 整型数据类型 整型就是没有小数部分的 C 基本整型有char short int long long long 由于char 类型比较特殊 下面只关于char int long long long 1 整型short int long
  • 使用verilog实现4选1数据选择器的几种方法

    第一种方法module mux d1 d2 d3 d4 se1 se2 dout input d1 input d2 input d3 input d4 input se1 input se2 output dout reg dout al
  • 一目了然凉哥为大家倾力打造的付费专栏

    写在前面 大家好 我是几何心凉 欢迎来到我的付费专栏系列 本专栏将深入介绍 Vue 3 和 Vite 以及如何在 TypeScript 的帮助下构建现代化的 Web 应用程序 Vue 是一个流行的 JavaScript 框架 它允许开发人员
  • 【AntDesign】图片自定义上传组件 超详细含代码及解读~

    技术栈 AntDesign 版本 3x 效果图如下 官网示例给的是标准上传模式 此处用的是自定义上传模式 customRequest 代码 子组件代码 import React useState useImperativeHandle fr
  • 初识微服务框架ServiceComb

    https blog csdn net zengdongwen article details 93486257 后续跟进学习 转载于 https www cnblogs com chaojizhengui p 11586398 html
  • C#变量初始化问题:字段初始值无法引用非静态字段、方法或属性

    问题 字段初始值设定项无法引用非静态字段 方法或属性的问题 下面代码出错的原因 在类中定义的字段为什么不能用 public class Test public Test public int Age 23 public int temp A
  • 隐马尔科夫模型 (HMM) 算法介绍及代码实现

    Table of Contents Hidden Markov Model 隐马尔科夫模型 定义 基本问题 前向算法 算法流程 实现代码 后向算法 算法流程 实现代码 Viterbi算法 算法流程 实现代码 Baum Welch 算法 单观