机器学习---概率图模型(概率计算问题)

1. 直接计算法

给定模型和观测序列,计算观测序列O出现的概率。最直接

的方法是按概率公式直接计算.通过列举所有可能的长度为T的状态序列,求各个状

态序列 I 与观测序列的联合概率,然后对所有可能的状态序列求和,得


状态序列的概率是

对固定的状态序列,观测序列的概率是

,O和I同时出现的联合概率为

。然后,对所有可能的状态序列I求和,得到观测序列O的概率

,即但是,利用公式计算

量很大,是阶的,这种算法不可行。

2. 前向算法

首先定义前向概率。给定隐马尔可夫模型λ,定义到时刻 t 部分观测序列为,且

状态为q1的概率为前向概率,记作。可以递推地求得前向概率α(i)

及观测序列概率

算法:(观测序列概率的前向算法)输入:隐马尔可夫模型λ,观测序列O;输出:观测序列概率P

(O|λ)。

初值:

递推:对

终止:

如上图所示,前向算法实际是基于“状态序列的路径结构”递推计算P(O|λ)的算法。前向算法高

效的关键是其局部计算前向概率,然后利用路径结构将前向概率“递推”到全局,得到P(O|λ).

具体地,在时刻t=1,计算α1(i)的N个值(i=1,2,···,N);在各个时刻t=1,2,···,T-1,

计算αt+1(i)的N个值(i=1,2,···.,N),而且每个αt+1(i)的计算利用前一时刻N个αt(j),减少计

算量的原因在于每一次计算直接引用前一个时刻的计算结果,避免重复计算。这样,利用前向概率

计算P(O|λ)的计算量是阶的,而不是直接计算的阶。

前向算法的复杂度:

所以利用前向算法计算的计算量是阶的,当N=3,T=100时,

原始算法:大约需要10^(50)次运算;前向算法:计算次数小于2000次

前向算法Python实现分析:

import numpy as np  def forward_algorithm(obs, states, start_p, trans_p, emit_p):  """  obs: 观察序列  states: 隐藏状态集合  start_p: 初始状态概率  trans_p: 状态转移概率  emit_p: 发射概率  """  T = len(obs)  N = len(states)  # 初始化alpha  alpha = np.zeros((T, N))  alpha[0, :] = start_p * emit_p[:, obs[0]]  # 递推计算alpha  for t in range(1, T):  for n in range(N):  alpha[t, n] = sum(alpha[t-1, :] * trans_p[:, n]) * emit_p[n, obs[t]]  # 计算观察序列的概率  P = sum(alpha[-1, :])  return P, alpha  # 示例  
obs = [0, 1, 0]  # 观察序列  
states = [0, 1]  # 隐藏状态集合  
start_p = [0.6, 0.4]  # 初始状态概率  
trans_p = [[0.7, 0.3], [0.4, 0.6]]  # 状态转移概率  
emit_p = [[0.1, 0.9], [0.9, 0.1]]  # 发射概率  P, alpha = forward_algorithm(obs, states, start_p, trans_p, emit_p)  
print(f"观察序列的概率: {P}")

3. 后向算法

后向概率:给定隐马尔可夫模型λ,定义在时刻t状态为q1的条件下,从t+1到T的部分观测序列为

的概率为后向概率,记作

可以用递推的方法求得后向概率βt(i)及观测序列概率P(O|λ)。

观测序列概率的后向算法:

输入:隐马尔可夫模型λ,观测序列O;输出:观测序列概率P(O|λ)。

,对

后向算法Python实现分析:

import numpy as np  def backward_algorithm(obs, states, start_p, trans_p, emit_p):  """  obs: 观察序列  states: 隐藏状态集合  start_p: 初始状态概率 (虽然后向算法本身不使用这个参数,但为了完整性仍然包括在参数列表中)  trans_p: 状态转移概率  emit_p: 发射概率  """  T = len(obs)  # 观察序列的长度  N = len(states)  # 隐藏状态的数量  # 初始化beta  beta = np.ones((T, N))  # 从观察序列的倒数第二个元素开始递推计算beta  for t in range(T - 2, -1, -1):  for n in range(N):  beta[t, n] = np.dot(beta[t + 1, :] * emit_p[:, obs[t + 1]], trans_p[n, :])  # 计算观察序列的概率  # 注意:这里我们实际上计算的是所有可能路径的概率之和,  # 但由于我们只需要这个总和,因此不需要显式地计算每个路径的概率。  # 初始状态概率start_p在后向算法中并不直接用于计算观察序列的概率,  # 但我们可以利用最后一步的beta和初始的发射概率来计算整个观察序列的概率。  # 这是一种不太常见的做法,因为我们通常使用前向-后向算法来计算概率,  # 该算法结合了前向和后向概率以避免数值下溢问题。  # 然而,为了这个示例的完整性,我们将展示如何使用beta来计算概率。  # 请注意,这种方法可能不是数值上最稳定的。  # 正确的做法是使用前向-后向算法中的一个步骤来计算概率,如下:  # P = sum(forward_probs[-1] * backward_probs[0]) (其中forward_probs和backward_probs是归一化的)  # 但在这个例子中,我们只实现后向算法,所以我们将使用一种简化的方法(可能不是最优的)。  # 计算最后一步的"后向概率"(未归一化)  last_step_backward = np.dot(beta[0, :] * emit_p[:, obs[0]], start_p)  # 由于我们没有计算前向概率,我们不能简单地通过前向和后向概率的乘积来归一化。  # 因此,我们将依赖这样一个事实:对于正确的模型参数,后向算法计算的beta应该使得下面的求和接近1(但不是严格的1,因为数值误差)。  # 在实际应用中,应该使用前向-后向算法来确保正确的归一化。  # 近似计算观察序列的概率(这不是标准做法,仅用于演示目的)  P = np.sum(last_step_backward)  return P, beta  # 示例参数(同前向算法示例)  
obs = [0, 1, 0]  # 观察序列  
states = [0, 1]  # 隐藏状态集合(这里用整数表示状态)  
start_p = [0.6, 0.4]  # 初始状态概率(虽然后向算法不使用它来计算概率)  
trans_p = [[0.7, 0.3], [0.4, 0.6]]  # 状态转移概率  
emit_p = [[0.1, 0.9], [0.9, 0.1]]  # 发射概率  # 调用后向算法函数并打印结果  
P, beta = backward_algorithm(obs, states, start_p, trans_p, emit_p)  
print(f"观察序列的概率(近似): {P}")

4. 计算

利用前向概率和后向概率,可以得到关于单个状态和两个状态概率的计算公式。

给定模型λ和观测O,在时刻t处于状态q1的概率。记

可以通过前向后向概率计算。事实上,

由前向概率和后向概率定义可知:

于是得到:

给定模型λ和观测O,在时刻t处于状态qt且在时刻t+1处于状态qj的概率。记

可以通过前向后向概率计算:

所以:

对各个时刻t求和,可以得到一些有用的期望值:

在观测O下状态i出现的期望值,在观测O下由状态i转移的期望值

在观测O下由状态i转移到状态j的期望值

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

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

相关文章

在屏蔽任何FRP环境下从零开始搭建安全的FRP内网穿透服务

背景 本人目前在境外某大学读博,校园网屏蔽了所有内网穿透的工具的数据包和IP访问,为了实现在家也能远程访问服务器,就不得不先开个学校VPN,再登陆。我们实验室还需要访问另一个大学的服务器,每次我都要去找另一个大学…

Mysql-Explain-使用说明

Explain 说明 explain SELECT * FROM tb_category_report;id:SELECT识别符,这是SELECT查询序列号。select_type:表示单位查询的查询类型,比如:普通查询、联合查询(union、union all)、子查询等复杂查询。table&#x…

酷开科技荣获消费者服务平台黑猫投诉“消费者服务之星”称号

什么是优质服务?既是以客户为中心的庄严承诺,又是对服务能力提升的深耕细作;既是对服务标准的敬畏,也是对服务创新的不断探索……服务是多维的,每个企业都有自己独到的诠释,或事无巨细环环严控,…

NumPy:Python的强大数值计算库

NumPy:Python的强大数值计算库 NumPy(Numerical Python)是Python中最常用和最强大的数值计算库之一。它提供了高性能的多维数组对象和广泛的数学函数,使得在Python中进行科学计算和数据分析变得更加简单和高效。本文将介绍NumPy的…

《动手学深度学习(PyTorch版)》笔记8.1

注:书中对代码的讲解并不详细,本文对很多细节做了详细注释。另外,书上的源代码是在Jupyter Notebook上运行的,较为分散,本文将代码集中起来,并加以完善,全部用vscode在python 3.9.18下测试通过&…

kmeans聚类选择最优K值python实现

Kmeans算法中K值的确定是很重要的。 下面利用python中sklearn模块进行数据聚类的K值选择 数据集自制数据集,格式如下: 维度为3。 ①手肘法 手肘法的核心指标是SSE(sum of the squared errors,误差平方和), 其中,Ci是第…

【玩转408数据结构】线性表——定义和基本操作

考点剖析 线性表是算法题命题的重点,该类题目实现相对容易且代码量不高,但需要最优的性能(也就是其时间复杂度以及空间复杂度最优),这样才可以获得满分。所以在考研复习中,我们需要掌握线性表的基本操作&am…

Linux探秘:如何用 find 命令发现隐藏的宝藏

🌟🌌 欢迎来到知识与创意的殿堂 — 远见阁小民的世界!🚀 🌟🧭 在这里,我们一起探索技术的奥秘,一起在知识的海洋中遨游。 🌟🧭 在这里,每个错误都…

无心剑汉英双语诗《龙年大吉》

七绝龙年大吉 Great Luck in the Dragon Year 龙腾五岳九州圆 年吼佳音万里传 大漠苍鹰华夏梦 吉人天相铸奇缘 Dragon flies over five peaks watching the divine land so great and round, New Year’s call sends joyous tidal waves far across the world’s bound. The…

教师如何找答案? #知识分享#职场发展

当今社会,随着信息技术的迅猛发展,大学生们在学习过程中面临着各种各样的困难和挑战。而在这些挑战中,面对繁重的作业和复杂的题目,大学生搜题软件应运而生 1.快解题 这是一个网站 是一款服务于职业考证的考试搜题软件,拥有几千…

【k8s系列】(202402) 证书apiserver_client_certificate_expiration_seconds

apiserver_client_certificate_expiration_second证书定义的位置:kubernetes/staging/src/k8s.io/apiserver/pkg/authentication/request/x509/x509.go at 244fbf94fd736e94071a77a8b7c91d81163249d4 kubernetes/kubernetes (github.com) apiserver_client_certi…

代码随想录 Leetcode455. 分发饼干

题目&#xff1a; 代码(首刷看解析 2024年2月8日&#xff09;&#xff1a; class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(), g.end());sort(s.begin(), s.end());int res 0;int index s.size() - 1…

Kafka 入门介绍

目录 一. 前言 二. 使用场景 三. 分布式的流平台 四. Kafka 的基本术语 4.1. 主题和日志 &#xff08;Topic 和 Log&#xff09; 4.2. 分布式&#xff08;Distribution&#xff09; 4.3. 异地数据同步技术&#xff08;Geo-Replication&#xff09; 4.4. 生产者&#xf…

Vulnhub靶机:hacksudo-Thor

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.15&#xff09; 靶机&#xff1a;hacksudo-Thor&#xff08;10.0.2.49&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://download.vulnhub.com/…

【JAVA WEB】 css背景属性 圆角矩形的绘制

目录 背景属性设置 圆角矩形 背景属性设置 背景颜色,在style中 background-color:颜色&#xff1b; 背景图片 background-image:url(……) 背景图片的平铺方式 background-repeat: 平铺方式 repeat 平铺&#xff08;默认&#xff09;no-repeat 不平铺repeat-x 水平平铺repea…

推荐一款开源的跨平台划词翻译和OCR翻译软件:Pot

Pot简介 一款开源的跨平台划词翻译和OCR翻译软件 下载安装指南 根据你的机器型号下载对应版本&#xff0c;下载完成后双击安装即可。 使用教程 Pot具体功能如下&#xff1a; 划词翻译输入翻译外部调用鼠标选中需要翻译的文本&#xff0c;按下设置的划词翻译快捷键即可按下输…

HiveSQL——共同使用ip的用户检测问题【自关联问题】

注&#xff1a;参考文章&#xff1a; SQL 之共同使用ip用户检测问题【自关联问题】-HQL面试题48【拼多多面试题】_hive sql 自关联-CSDN博客文章浏览阅读810次。0 问题描述create table log( uid char(10), ip char(15), time timestamp);insert into log valuesinsert into l…

秒杀相关问题解决

秒杀 超卖问题 如下,我们先来复现问题,抢购秒杀券的代码逻辑也是很简单, 先判断优惠券是否开始了,是的化,判断库存是否充足,如果是的化,扣减库存,最后创建订单 如下是代码 Override Transactional public Result seckillVoucher(Long voucherId) {//1.查询优惠券SeckillVo…

C#使用哈希表对XML文件进行查询

目录 一、使用的方法 1.Hashtable哈希表 2.Hashtable哈希表的Add方法 &#xff08;1&#xff09;定义 &#xff08;2&#xff09;示例 3.XML文件的使用 二、实例 1.源码 2.生成效果 可以通过使用哈希表可以对XML文件进行查询。 一、使用的方法 1.Hashtable哈希表…

证明之黄金分割比的无理性

黄金分割比的无理性 “黄金分割比的神奇之处&#xff1a;视觉化证明与数学的魅力” 人们在学习高等数学时&#xff0c;走到一个证明的结尾处&#xff0c;通常会经历这样的思考&#xff1a;“我理解每一行是怎样由前一行得到的&#xff0c;但是我却不明白为什么这个定理是正确…