【博学谷学习记录】超强总结,用心分享丨人工智能 AI项目 前向概率计算笔记

news2024/10/5 5:20:53

目录

    • 前向概率
      • 模型基础参数
      • 公式推导
      • 代码实现

前向概率

给定隐马尔可夫模型 λ \lambda λ,定义到时刻 t t t部分观测序列为 o 1 , o 2 , ⋯   , o t o_1,o_2,\cdots,o_t o1,o2,,ot且状态为 s i s_i si的概率为前向概率,记作 α t ( i ) = P ( o 1 , o 2 , ⋯   , o t , i t = s i ∣ λ ) \alpha_t(i)=P(o_1,o_2,\cdots,o_t,i_t=s_i|\lambda) αt(i)=P(o1,o2,,ot,it=siλ)。可以递推地求出前向概率 α t ( i ) \alpha_t(i) αt(i)以及观测序列概率 P ( O ∣ λ ) P(O|\lambda) P(Oλ)

模型基础参数

在这里插入图片描述

公式推导

(1)初值
α 1 ( i ) = π i b i ( o 1 ) ,          i = 1 , 2 , ⋯   , N \alpha_1(i)=\pi_i b_i (o_1),\;\;\;\;i=1,2,\cdots,N α1(i)=πibi(o1),i=1,2,,N

第一个时刻,i代表不同的状态,pi表示初始概率,b为发射概率,如:从5个盒子中抽球,第一个抽到红球,i对应的就是1,b为红球在第一个盒子中被抽出来的概率(发射概率)
结果是5个数据,第i数据表示第1个时刻从第i球中抽出红球的概率

(2)递推 对 t = 1 , 2 , ⋯   , T − 1 t=1,2,\cdots,T-1 t=1,2,,T1
α t + 1 ( i ) = [ ∑ j = 1 N α t ( j ) a j i ] b i ( o t + 1 ) ,          i = 1 , 2 , ⋯   , N 示例      t = 1 ,    i = 1 α 2 ( 1 ) = [ ∑ j = 1 N α 1 ( j ) a j 1 ] b 1 ( o 2 ) t = 1 ,    i = 2 α 2 ( 2 ) = [ ∑ j = 1 N α 1 ( j ) a j 2 ] b 2 ( o 2 ) t = 1 ,    i = 3 α 2 ( 3 ) = [ ∑ j = 1 N α 1 ( j ) a j 3 ] b 3 ( o 2 ) \alpha_{t+1}(i)=\left[\sum_{j=1}^{N}\alpha_t(j)a_{ji}\right]b_i(o_{t+1}),\;\;\;\;i=1,2,\cdots,N \\ \\ 示例\;\;t=1,\;i=1\\ \alpha_2(1)=\left[\sum_{j=1}^{N}\alpha_1(j)a_{j1}\right]b_1(o_2)\\ t=1,\;i=2\\ \alpha_2(2)=\left[\sum_{j=1}^{N}\alpha_1(j)a_{j2}\right]b_2(o_2)\\ t=1,\;i=3\\ \alpha_2(3)=\left[\sum_{j=1}^{N}\alpha_1(j)a_{j3}\right]b_3(o_2)\\ αt+1(i)=[j=1Nαt(j)aji]bi(ot+1),i=1,2,,N示例t=1,i=1α2(1)=[j=1Nα1(j)aj1]b1(o2)t=1,i=2α2(2)=[j=1Nα1(j)aj2]b2(o2)t=1,i=3α2(3)=[j=1Nα1(j)aj3]b3(o2)

第二个时刻则是前一个时刻求出的5个数据,每个数据乘转移概率和再乘当前时刻的发射概率
a(t)j表示上个时刻求出的5个值,aji表示从j状态转移到i状态的概率

(3)终止
P ( O ∣ λ ) = ∑ i = 1 N α T ( i ) P(O|\lambda)=\sum_{i=1}^{N}\alpha_T(i) P(Oλ)=i=1NαT(i)

概率求和(算出的5个状态分别对应的值进行求和)

代码实现

随机从4个盒子中抽出5个球 ,求该序列的概率
前向概率计算函数:forward_probability()其中是通过矩阵运算,所以公式的求和的符号可能提现的不明显,可以输出运算后结果进而理解运算过程

import numpy as np

class HMM(object):
    def __init__(self, N, M, pi=None, A=None, B=None):
        self.N = N # 盒子数量
        self.M = M # 球颜色数量
        self.pi = pi # 初始概率向量
        self.A = A # 转移概率矩阵
        self.B = B # 观测概率矩阵

    def get_data_with_distribute(self, dist):
        # 根据给定的概率分布,返回一个索引
        return np.random.choice(np.arange(len(dist)), p=dist)

    def generate(self, T : int):
        # T 要生成的数据的数量
        # 根据给定额参数生成观测序列
        # 根据初始概率分布,获取从哪个盒子取第一个球
        z = self.get_data_with_distribute(self.pi) # 得到的是第一个盒子的编号
        # 从上一个盒子中根据观测概率选中一个球(颜色)
        x = self.get_data_with_distribute(self.B[z]) #x代表球的颜色,0红色 1白色
        result = [x]
        for _ in range(T-1):
            z = self.get_data_with_distribute(self.A[z]) # 得到下一个盒子
            x = self.get_data_with_distribute(self.B[z]) # 从该盒子中随机选中一个颜色
            result.append(x)

        return result

    def forward_probability(self, X):
        # 根据给定的观测序列X,计算观测序列出现的概率
        alpha = self.pi * self.B[:, X[0]]
        # print(type(alpha))

        for x in X[1:]:
            # print(alpha)
            # print(self.A)
            # print(np.matmul(alpha, self.A))
            alpha = np.matmul(alpha, self.A) * self.B[:, x]

        return alpha.sum()


if __name__ == '__main__':
    pi = np.array([.25, .25, .25, .25])
    A = np.array([
        [0,  1,  0, 0],
        [.4, 0, .6, 0],
        [0, .4, 0, .6],
        [0, 0, .5, .5]])
    B = np.array([
        [.5, .5],
        [.3, .7],
        [.6, .4],
        [.8, .2]])
    assert len(A) == len(pi)
    assert len(A) == len(B)
    hmm = HMM(B.shape[0], B.shape[1], pi, A, B)
    seq = hmm.generate(5)
    print('抽出球的序列:', seq)

    print('概率值:', hmm.forward_probability(seq))

结果:白白红红白
在这里插入图片描述

心得:通过理解公式后再去理解运算过程和代码会很简单,关于矩阵运算对应到公式起初理解困难,多思考,多打印结果值,理解每步后方可打通任督二脉

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

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

相关文章

GDPU C语言 天码行空9

填空题 1. 指针排序 数组 输入 n5 30 85 12 77 6输出 6 12 30 77 85 &#x1f920; 代码 #include<stdio.h>#define N 10void sort(int *x,int n)// *x 是 数组 a 的地址 {int i,j,k,t;for(i0;i<n-1;i)//从前往后枚举 坑位{ki; for(ji1;j<n;j) if(x[k…

计算机网络 实验五

⭐计网实验专栏&#xff0c;欢迎订阅与关注&#xff01; ★观前提示&#xff1a;本篇内容为计算机网络实验。内容可能会不符合每个人实验的要求&#xff0c;因此以下内容建议仅做思路参考。 一、实验目的 理解DNS的域名解析机制&#xff0c;理解DHCP的工作机制熟悉WEB应用及超…

逍遥自在学C语言 | 位运算符>>的高级用法

前言 在上一篇文章中&#xff0c;我们介绍了<<运算符的高级用法&#xff0c;本篇文章&#xff0c;我们将介绍>> 运算符的一些高级用法。 一、人物简介 第一位闪亮登场&#xff0c;有请今后会一直教我们C语言的老师 —— 自在。 第二位上场的是和我们一起学习的小…

HCIP-6.8BGP的团体属性、BGP联盟

BGP的团体属性、BGP联盟1、Community:团体属性1.1、案例配置2、BGP联盟属性2.1、配置案例&#xff1a;2.2、四种类型的AS_PATH&#xff1a;对于大型网络或者路由条目较多&#xff0c;使用一种BGP特有的路由标记&#xff0c;用于简化路由策略的执行。对于减少路由条目&#xff0…

unity,制作一个环状滑动条

介绍 unity&#xff0c;制作一个环状滑动条 方法 1.导入png图片素材2.新建一个滑动条&#xff0c;两者图片都设置为图片3.调节slider的参数4.调节backgroud的参数5.fill area、fill的参数同上。 得到两个叠加的圆环。6.设置fill的背景颜色为红色7.设置fill填充方式&#xff0…

【C++】容器适配器之priority_queue 仿函数

一、priority_queue 的介绍和使用 1.priority_queue 的介绍 我们和学习之前的容器一样&#xff0c;可以使用cplusplus官网进行学习&#xff1a;priority_queue文档介绍 priority_queue(优先级队列)是一种容器适配器&#xff0c;它 和queue使用同一个头文件&#xff0c;其底层…

Elastic(ELK) Stack 架构师成长路径

Elastic Stack&#xff08;ELK Stack&#xff09;是一个开源的日志分析平台&#xff0c;由 Elasticsearch、Logstash 和 Kibana 三个组件组成&#xff0c;主要用于数据搜索、分析和可视化。要成为一名 ELK Stack 架构师&#xff0c;需要遵循一定的成长路径&#xff0c;以便逐步…

详解HiveSQL执行计划

一、前言 Hive SQL的执行计划描述SQL实际执行的整体轮廓&#xff0c;通过执行计划能了解SQL程序在转换成相应计算引擎的执行逻辑&#xff0c;掌握了执行逻辑也就能更好地把握程序出现的瓶颈点&#xff0c;从而能够实现更有针对性的优化。此外还能帮助开发者识别看似等价的SQL其…

【计算机组成原理】计算机组成原理(三)

计算机组成原理&#xff08;三) 奇偶校验码&#xff1a; 校验原理&#xff1a; 2个比特位可以映射出4种合法的情况 2的2次方 3个比特位可以映射出8种不同的情况&#xff0c;其中4种为合法情况&#xff0c;另外4种为非法情况 上图的每个编码都是一个码字 在同一组码字内&am…

【DES详解】(一)处理input block(64 bits)

一、DES 加密算法总览 0-1、初识置换 IP&#xff08;Initial Permutation&#xff09; 输入&#xff1a;明文&#xff08;64 bits&#xff09; 过程&#xff1a;初识置换 输出&#xff1a;处理后的明文permuted input&#xff08;64 bits&#xff09; 首先&#xff0c;对需要解…

手写一个IO泄露监测框架

作者&#xff1a;长安皈故里 大家好&#xff0c;最近由于项目原因&#xff0c;对IO资源泄漏的监测进行了一番调研深入了解&#xff0c;发现IO泄漏监测框架实现成本比较低&#xff0c;效果很显著&#xff1b;同时由于IO监测涉及到反射&#xff0c;还了解到了通过一种巧妙的方式实…

AEC-Q认证介绍及所有最新工程文件下载

AEC-Q认证介绍及所有最新文件&#xff08;英文版&#xff09;下载 注意&#xff1a; 更多交流及资料请加V&#xff1a;john-130 AEC-Q认证介绍 1&#xff0c;AEC-Q认证总体情况介绍 &#xff08;​1&#xff09;AEC&#xff08;Automotive Electronics Council&#xff09;…

图像分类:Pytorch图像分类之-- MobileNet系列模型

文章目录前言MobileNetV1模型介绍DW&#xff08;Depthwise Convolution&#xff09;卷积PW &#xff08;Pointwise Convolution&#xff09;卷积深度可分离卷积&#xff08;DWPW&#xff09;ReLU6激活函数的介绍MobileNet V1网络结构MobileNet V1程序MobileNetV2模型介绍Invert…

链接、包管理工具、polyrepo、monorepo以及Lerna 工具的使用

nodejs 链接、包管理工具、多包管理以及Lerna 工具的使用jcLee95&#xff1a;https://blog.csdn.net/qq_28550263?spm1001.2101.3001.5343 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/129903902 目 录1. 概述…

bjdctf_2020_babyrop2-fmt-leak canary

1,三连 分析:开了canary&#xff0c;先想办法获取canary值。 2&#xff0c;IDA静态分析&#xff0c;查看可以泄露canary的地方&#xff0c;否则只能爆破了 发现可以格式化字符串函数泄露的地方&#xff1a; 栈帧结构&#xff1a; 高地址 -------------- gift_ret栈帧 ------…

【算法宇宙——在故事中学算法】背包dp之01背包问题

唯手熟尔方成艺&#xff0c;唯读书能致卓越。勤学苦练方可成&#xff0c;路漫漫其修远兮&#xff01; 文章目录前言正文故事总结前言 尽管计算机是门严谨的学科&#xff0c;但正因为严谨&#xff0c;所以要有趣味才能看得下去。在笔者的前几篇算法类文章中&#xff0c;都采用了…

智慧公厕系统的应用示例

近几年&#xff0c;在一些高速服务区或者一些城市的公共厕所当中&#xff0c;总会看见一些富有科技感的硬件&#xff0c;比如厕位有无人指示灯、厕所除臭杀菌机、智能取纸机、智能洗手台镜面广告机等。现在在衡量城市发展的过程中&#xff0c;总会以城市的建设&#xff0c;城市…

Weblogic远程代码执行漏洞 CVE-2023-21839

漏洞简介 WebLogic Core远程代码执行漏洞&#xff08;CVE-2023-21839&#xff09;&#xff0c;该漏洞允许未经身份验证的远程攻击者通过T3/IIOP协议进行 JNDI lookup 操作&#xff0c;破坏易受攻击的WebLogic服务器&#xff0c;成功利用此漏洞可能导致Oracle WebLogic服务器被接…

MySQL可重复读事务隔离具体是怎么实现的

事务的启动会有的操作 事务的隔离等级有四种&#xff0c;现在说默认的可重复读&#xff0c;可重复读就是一个事务执行过程中看到的数据&#xff0c;总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下&#xff0c;未提交变更对其他事务也是不可见的。 可重复…

Java阶段一Day22

Java阶段一Day22 文章目录Java阶段一Day22线程安全synchronized教师总结新单词多线程多线程并发安全问题概念例synchronized关键字同步方法同步块在静态方法上使用synchronized互斥锁总结重点:多线程并发安全问题聊天室(续)实现服务端发送消息给客户端服务端转发消息给所有客户…