隐马尔可夫模型(HMM) |前向算法 |一个简单的例子说清计算过程 |一般步骤总结

如是我闻: 本文通过一个简单的例子来详细说明隐马尔可夫模型(HMM)的前向算法

我们求解的问题类型是:给定模型及观测序列计算其出现的概率

隐马尔可夫模型由三个主要部分组成:

  1. 隐藏状态集合
  2. 观测状态集合
  3. 以及三个概率矩阵(状态转移概率矩阵、观测概率矩阵、和初始状态概率向量)

1. 示例说明

假设有一个简化的天气模型,其中隐藏状态是“晴朗”(Sunny)和“雨天”(Rainy),观测状态是“干燥”(Dry)和“湿润”(Wet)。

  • 隐藏状态集合:S = {Sunny, Rainy}
  • 观测状态集合:O = {Dry, Wet}

我们定义以下概率:

  • 初始状态概率向量(π):P(Sunny) = 0.8, P(Rainy) = 0.2
  • 状态转移概率矩阵(A):
SunnyRainy
Sunny0.70.3
Rainy0.40.6
  • 观测概率矩阵(B):
DryWet
Sunny0.90.1
Rainy0.30.7

1.1 任务

给定观测序列:O = {Dry, Wet},计算这个观测序列出现的概率。

2.解决过程

2.1前向算法概述

前向算法通过递归的方式计算每个时间点上所有隐藏状态的前向概率。前向概率α是给定模型参数和观测序列直到当前时间点的所有观测值条件下,隐藏状态为某状态的概率。那么前向概率是什么呢

2.2 前向算法中的前向概率(这个是重点,明白前向概率就明白前向算法)

在隐马尔可夫模型(HMM)中,α(前向概率)代表了在给定模型参数和到当前时间点为止的观测序列的条件下,序列处于某一特定隐藏状态的概率。具体来说,对于时间点t的状态i, α t ( i ) α_t(i) αt(i)表示从序列开始到时间点t观察到特定观测序列,并且在时间点t处于状态i的联合概率。这个概念是通过结合初始状态概率、状态转移概率,以及观测概率来计算得出的。

2.3示例计算过程

给定的观测序列O = {Dry, Wet},我们如何使用前向算法计算其概率?

2.3.1初始化

对于第一个观测“Dry”,我们计算每个隐藏状态的前向概率 α 1 ( i ) α_1(i) α1(i)

  • α 1 ( S u n n y ) = π ( S u n n y ) ⋅ B ( S u n n y ∣ D r y ) = 0.8 ∗ 0.9 = 0.72 α_1(Sunny) = π(Sunny) \cdot B(Sunny|Dry) = 0.8 * 0.9 = 0.72 α1(Sunny)=π(Sunny)B(SunnyDry)=0.80.9=0.72
  • α 1 ( R a i n y ) = π ( R a i n y ) ⋅ B ( R a i n y ∣ D r y ) = 0.2 ∗ 0.3 = 0.06 α_1(Rainy) = π(Rainy) \cdot B(Rainy|Dry) = 0.2 * 0.3 = 0.06 α1(Rainy)=π(Rainy)B(RainyDry)=0.20.3=0.06

实际上要是把 α 1 ( S u n n y ) α_1(Sunny) α1(Sunny) α 1 ( R a i n y ) α_1(Rainy) α1(Rainy)相加,得到就是t=1的时刻下,观测是Dry的概率

2.3.2递归

接下来,我们使用前一步的前向概率来计算第二个观测“Wet”时,每个隐藏状态的前向概率 α 2 ( i ) α_2(i) α2(i)

  • α 2 ( S u n n y ) = [ α 1 ( S u n n y ) ⋅ A ( S u n n y ∣ S u n n y ) + α 1 ( R a i n y ) ⋅ A ( S u n n y ∣ R a i n y ) ] ⋅ B ( S u n n y ∣ W e t ) = [ 0.72 ⋅ 0.7 + 0.06 ⋅ 0.4 ] ⋅ 0.1 = ( 0.504 + 0.024 ) ⋅ 0.1 = 0.0528 α_2(Sunny) = [α_1(Sunny) \cdot A(Sunny|Sunny) + α_1(Rainy) \cdot A(Sunny|Rainy)] \cdot B(Sunny|Wet) = [0.72 \cdot 0.7 + 0.06 \cdot 0.4] \cdot 0.1 = (0.504 + 0.024) \cdot 0.1 = 0.0528 α2(Sunny)=[α1(Sunny)A(SunnySunny)+α1(Rainy)A(SunnyRainy)]B(SunnyWet)=[0.720.7+0.060.4]0.1=(0.504+0.024)0.1=0.0528
  • α 2 ( R a i n y ) = [ α 1 ( S u n n y ) ⋅ A ( R a i n y | S u n n y ) + α 1 ( R a i n y ) ⋅ A ( R a i n y ∣ R a i n y ) ] ⋅ B ( R a i n y ∣ W e t ) = [ 0.72 ⋅ 0.3 + 0.06 ⋅ 0.6 ] ⋅ 0.7 = ( 0.216 + 0.036 ) ⋅ 0.7 = 0.1764 α_2(Rainy) = [α_1(Sunny) \cdot A(Rainy|Sunny) + α_1(Rainy) \cdot A(Rainy|Rainy)] \cdot B(Rainy|Wet) = [0.72 \cdot 0.3 + 0.06 \cdot 0.6] \cdot 0.7 = (0.216 + 0.036)\cdot 0.7 = 0.1764 α2(Rainy)=[α1(Sunny)A(RainySunny)+α1(Rainy)A(RainyRainy)]B(RainyWet)=[0.720.3+0.060.6]0.7=(0.216+0.036)0.7=0.1764
2.3.3终止

观测序列的总概率是最后一个观测的所有前向概率之和:

  • 总概率 = α 2 ( S u n n y ) + α 2 ( R a i n y ) = 0.0528 + 0.1764 = 0.2292 α_2(Sunny) + α_2(Rainy) = 0.0528 + 0.1764 = 0.2292 α2(Sunny)+α2(Rainy)=0.0528+0.1764=0.2292

结果非常amazing啊,这与我们通过暴力方法计算的结果相同。但是前向算法的效率更高,特别是在处理长观测序列时。

3.前向算法的一般步骤总结:

  1. 初始化:对于每个状态i,计算第一个观测的前向概率 α 1 ( i ) α_1(i) α1(i)
  2. 递归:对于每个后续的时间点t和每个状态i,更新 α t ( i ) α_t(i) αt(i)
  3. 终止:计算给定观测序列出现的概率,即最后一个时间点的所有前向概率之和。

前向算法不仅提高了计算效率,而且是理解更复杂HMM算法(如Baum-Welch算法和维特比算法)的基础。

通过前向算法,我们能够以更高效的方式解决给定观测序列在特定HMM下出现概率的计算问题,使其在实际应用中更为可行,特别是在序列较长或状态空间较大的情况下

大家一定要理解前向概率啊

非常的有品

以上

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/745696.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QTextToSpeech的使用——Qt

前言 之前随便看了几眼QTextToSpeech的帮助就封装使用了,达到了效果就没再管了,最近需要在上面加功能(变换语速),就写了个小Demo后,发现不对劲了。 出现的问题 场景 写了个队列添加到语音播放子线程中&a…

HTTPS基础

目录 HTTPS简介 HTTP与HTTPS的区别 CA证书 案例 服务器生成私钥与证书 查看证书和私钥存放路径 Cockpit(图像化服务管理工具) HTTPS简介 超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容,不提供任何方式的数据加密&…

C++——类和对象(1)

1. 面向对象和面向过程对比 当涉及到编程范式时,两个主要的方法是面向对象编程(Object-Oriented Programming,OOP)和面向过程编程(Procedural Programming)。这两种编程范式在解决问题和组织代码时有着不同…

T2080 AR8031 RGMII to 1000Base-X(fiber)

前段时间在调试FT-M6678和C6678的板卡,结果中途来了一个T2080网络配置的更改需求,就临时处理了一下,花了一点功夫,记录下来,为大家做个参考。 这个问题完成后,就得继续开发FT-M6678了~ uboot下面phy配置更…

COX回归影响因素分析的基本过程与方法

在科学研究中,经常遇到分类的结局,主要是二分类结局(阴性/阳性;生存/死亡),研究者可以通过logistic回归来探讨影响结局的因素,但很多时候logistic回归方法无法使用。如比较两种手段治疗新冠肺炎…

Annaconda环境下ChromeDriver配置及爬虫编写

Anaconda环境的chromedriver安装配置_anaconda 配置chromedriver-CSDN博客 Chromedriver驱动( 121.0.6167.85 ) - 知乎 下载好的驱动文件解压,将exe程序复制到Annaconda/Scripts目录以及Chrome/Application目录下 注意要提前pip install selenium包才能运行成功&a…

BEV系列一:BEV介绍和常用BEV算法简介

BEV系列一:BEV介绍和常用BEV算法简介 自动驾驶最全学习资料获取:链接

Linux操作系统——线程概念

1.什么是线程? 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”一切进程至少都有一个执行线程线程在进程内部运行,本质是在进程地址空间内运行在Linux系统中&#x…

openGauss学习笔记-242 openGauss性能调优-SQL调优-典型SQL调优点-SQL自诊断

文章目录 openGauss学习笔记-242 openGauss性能调优-SQL调优-典型SQL调优点-SQL自诊断242.1 SQL自诊断242.1.1 告警场景242.1.2 规格约束 openGauss学习笔记-242 openGauss性能调优-SQL调优-典型SQL调优点-SQL自诊断 SQL调优是一个不断分析与尝试的过程:试跑Query&…

【KTips】如何为Job指定两个“parent“

欢迎来到一分钟 KT Tips! 🎉 想必在日常生活中,大家总会遇到这样的苦恼:我有一个 Job ,但是它有两个“候选parent”。这可愁坏了我们亲爱的小job: val pJob1: Job Job()fun createJob(pJob2: Job): Job {return Job…

【Qt】常用控件或属性(1)

需要云服务器等云产品来学习Linux可以移步/-->腾讯云<--/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;新用户首次下单享超低折扣。 目录 一、QWidget属性一览 二、控件button、属性enabled(可用状态) 三、属性geometry(修改位置和尺寸) 1、QRect类型的结…

微信小程序之tabBar

1、tabBar 如果小程序是一个多 tab 应用&#xff08;客户端窗口的底部或顶部有 tab 栏可以切换页面&#xff09;&#xff0c;可以通过 tabBar 配置项指定 tab 栏的表现&#xff0c;以及 tab 切换时显示的对应页面。 属性类型必填默认值描述colorHexColor是tab 上的文字默认颜色…

Leetcode 3.14

Leetcode hot100 二叉树1.二叉树的层序遍历2.验证二叉搜索树3.二叉树的右视图 二叉树 1.二叉树的层序遍历 二叉树的层序遍历 二叉树的层序遍历可以用先进先出的队列来实现。 将每一层的所有node都添加到队列中&#xff0c;记录下当前队列的长度&#xff0c;即该层的元素数量&…

『 Linux 』进程替换( Process replacement ) 及 简单Shell的实现(万字)

文章目录 &#x1f984; 进程替换&#x1f9a9; execl()函数&#x1f9a9; execlp()函数&#x1f9a9; execle()函数&#x1f9a9; execv()函数&#x1f9a9; execvp()函数&#x1f9a9; execvpe()函数&#x1f9a9; execve()函数 &#x1f984; 简单Shell命令行解释器的实现&a…

【漏洞复现】ChatGPT-Next-Web SSRF漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

Python-sklearn-diabetes项目实战

目录 1 下载数据集和预处理 1.1 加载/下载数据集 1.2 数据可视化 1.3 数据清洗 1.4 特征工程 1.5 构建特征集和标签集 1.6 拆分训练集和测试集 2 训练模型 2.1 选择算法和确定模型 2.2 训练拟合模型 3 评估并优化模型性能 本文以糖尿病数据集diabetes为基础进行线性…

【Node.js从基础到高级运用】十一、构建RESTful API

在本篇博客中&#xff0c;我们将综合之前讨论的内容&#xff0c;深入探索如何使用Node.js构建一个RESTful API。我们将重点讨论设计合理的API端点&#xff0c;展示如何通过代码实现这些端点&#xff0c;并指导如何使用Postman测试我们的API&#xff0c;确保其按预期工作。 前提…

完美解决 RabbitMQ可视化界面Overview不显示折线图和队列不显示Messages

问题场景&#xff1a; 今天使用docker部署了一个RabbitMQ&#xff0c;浏览器打开15672可视化页面发送消息后不显示Overview中的折线图&#xff0c;还有队列中的Messages&#xff0c;因为我要看队列中的消息数量。 解决方案&#xff1a; 进入容器内部 docker exec -it 容器id…

NumPy库中的np.exp和np.exp2

在NumPy库中&#xff0c;np.exp和np.exp2是两个用于计算指数的函数&#xff0c;但它们的基数不同&#xff1a; np.exp(x)&#xff1a;计算自然指数 ex&#xff0c;其中 e 是自然对数的底数&#xff0c;大约等于2.71828。这个函数返回e的x次幂&#xff0c;用于各种自然增长或衰…

Spring Cloud Gateway如何实现熔断

Spring Cloud Gateway熔断集成 熔断应用&#xff1a; 金融市场中的熔断机制&#xff1a;在金融交易系统中&#xff0c;熔断机制&#xff08;Circuit Breaker&#xff09;是一种市场保护措施&#xff0c;旨在预防市场剧烈波动时可能导致的系统性风险。当某个基准指数&#xff08…