NLP深入学习(五):HMM 详解及字母识别/天气预测用法

文章目录

  • 0. 引言
  • 1. 什么是 HMM
  • 2. HMM 的例子
    • 2.1 字母序列识别
    • 2.2 天气预测
  • 3. 参考


0. 引言

前情提要:
《NLP深入学习(一):jieba 工具包介绍》
《NLP深入学习(二):nltk 工具包介绍》
《NLP深入学习(三):TF-IDF 详解以及文本分类/聚类用法》
《NLP深入学习(四):贝叶斯算法详解及分类/拼写检查用法》

1. 什么是 HMM

隐马尔可夫模型(Hidden Markov Model, HMM)是一种统计学习方法,用于描述含有隐藏状态的随机过程。在 HMM 中,系统的当前状态无法直接观测,但可以通过该状态下生成的可观测序列来推断。它由两部分构成:一个不可见的马尔可夫链(即隐藏状态),和每个隐藏状态生成观测值的概率分布。

基本结构与概念:

  1. 隐藏状态(Hidden States): 系统可能处于的一系列状态,通常用 S = S 1 , S 2 , . . . , S N S = S^{1}, S_{2}, ..., S_N S=S1,S2,...,SN 表示,其中 N 为状态的数量。这些状态是不直接可观测的。

  2. 观测序列(Observations): 每个隐藏状态生成一个观测值,观测值构成的时间序列是可见的。例如,在拼写检查器中,观测序列可能是字符序列,而在语音识别中,观测序列可能是声学特征序列。

  3. 初始概率分布(Initial Probability Distribution): 定义了系统开始时处于各个状态的概率,记作 π = ( π 1 , π 2 , . . . , π N ) \pi = ( \pi_{1}, \pi_{2}, ..., \pi_{N} ) π=(π1,π2,...,πN),满足 ∑ i = 1 N π i = 1 \sum_{i=1}^{N}\pi_i = 1 i=1Nπi=1

  4. 状态转移概率矩阵(Transition Probability Matrix): 表示从一个状态转移到另一个状态的概率,记作 A = [ a i j ] A = [a_{ij}] A=[aij],其中 a i j a_{ij} aij 是从状态 S i S_i Si转移到状态 S j S_j Sj的概率。满足对于所有 i i i, ∑ j = 1 N a i j = 1 \sum_{j=1}^{N}a_{ij} = 1 j=1Naij=1

  5. 发射概率(Emission Probability): 表示在某个隐藏状态下生成特定观测值的概率,通常定义为条件概率分布 b i ( o k ) b_i(o_k) bi(ok),表示在状态 S i S_i Si下产生观测值 o k o_k ok的概率。

三个基本问题:

  • 评估问题(Evaluation Problem): 给定一个 HMM 模型和一个观测序列,计算该观测序列出现的概率。

  • 解码问题(Decoding Problem): 给定一个 HMM 模型和一个观测序列,找出最有可能生成这个观测序列的状态序列,也称为最大似然路径问题,常通过维特比算法(Viterbi Algorithm)解决。

  • 学习问题(Learning Problem): 根据已有的观测序列数据集估计出HMM的参数,包括初始状态概率、状态转移概率以及发射概率。

2. HMM 的例子

2.1 字母序列识别

假设我们有一个由"A"和"B"两个隐藏状态组成的 HMM 模型,用来识别由"X"和"Y"两个字母构成的观测序列。

模型参数:

  • 状态集合(A, B)

  • 观测值(X, Y)

  • 初始状态分布 π:

    π = [0.6, 0.4]  # 开始时是状态A的概率为0.6,是状态B的概率为0.4
    
  • 状态转移矩阵 A:

    A = [[0.7, 0.3],  # 从状态A转移到状态A的概率为0.7,转移到状态B的概率为0.3[0.4, 0.6]   # 从状态B转移到状态A的概率为0.4,转移到状态B的概率为0.6
    ]
    
  • 发射概率 B:

    B(A) = [0.8, 0.2]  # 在状态A下生成观测值'X'的概率为0.8,生成观测值'Y'的概率为0.2
    B(B) = [0.1, 0.9]  # 在状态B下生成观测值'X'的概率为0.1,生成观测值'Y'的概率为0.9
    

观测序列与问题描述
给定观测序列 O = [“X”, “Y”],我们的目标是计算在给定模型 λ=(π,A,B) 下观测序列出现的概率 P(O|λ)。

前向算法求解过程:

使用前向算法,我们可以按照以下步骤计算 α 序列:

def forward_algorithm(observations, pi, A, B):num_states = len(pi)T = len(observations)alpha = [[0 for _ in range(num_states)] for _ in range(T)]# 初始化for s in range(num_states):alpha[0][s] = pi[s] * B[s][observations[0]]# 迭代计算for t in range(1, T):for s in range(num_states):alpha[t][s] = sum(alpha[t - 1][prev_s] * A[prev_s][s] * B[s][observations[t]] for prev_s in range(num_states))# 计算总概率prob_observation = sum(alpha[T - 1][s] for s in range(num_states))return alpha, prob_observation# 实例化模型参数
pi = [0.6, 0.4]
A = [[0.7, 0.3], [0.4, 0.6]]
B = [[0.8, 0.2], [0.1, 0.9]]# 观测序列
observations = ['X', 'Y']# 调用函数计算观察序列概率
alpha, prob_observation = forward_algorithm(observations, pi, A, B)print(f"The probability of the observation sequence is: {prob_observation}")

以上Python代码定义了一个名为forward_algorithm的函数,它接收观测序列、初始状态分布、状态转移矩阵和发射概率作为输入,并返回前向概率数组以及观测序列的概率。通过调用该函数并传入相应参数,可以计算出给定观测序列的概率。

2.2 天气预测

假设我们有一个天气模型,用 HMM 来表示天气的变化。我们有两种天气状态:晴天(Sunny)和雨天(Rainy)。我们通过观察温度来获取观测序列,观测值为高温(Hot)、中温(Mild)和低温(Cold)。

模型参数:

  • 状态集合: {Sunny, Rainy}

  • 观测值集合: {Hot, Mild, Cold}

  • 初始概率分布:

    • P(Sunny) = 0.8
    • P(Rainy) = 0.2
  • 状态转移概率矩阵:

     A = [[ P(Sunny|Sunny)   P(Rainy|Sunny) ][ P(Sunny|Rainy)   P(Rainy|Rainy) ]]A = [0.7, 0.3], [0.4, 0.6]
    

    其中,A[i, j] 表示在时刻 t 处于状态 i 的情况下,在时刻 t+1 转移到状态 j 的概率。

  • 发射概率矩阵:

     B = [[ P(Hot|Sunny)  P(Mild|Sunny)  P(Cold|Sunny) ][ P(Hot|Rainy)  P(Mild|Rainy)  P(Cold|Rainy) ]]B = [0.2  0.4  0.4], [0.5  0.4  0.1]
    

    其中,B[i, j] 表示在时刻 t 处于状态 i 的情况下生成观测值 j 的概率。

计算公式:

  1. 概率计算问题(Evaluation):

    给定观测序列 O 和模型 λ = ( A , B , π ) λ=(A, B, π) λ=(A,B,π),计算在模型 λ 下观测序列 O 出现的概率 P(O|λ)。

    计算公式:
    P ( O ∣ λ ) = ∑ i P ( O , X t = i ∣ λ ) = ∑ i α t ( i ) P(O|λ) = \sum_{i} P(O, X_t=i|λ) = \sum_{i} \alpha_t(i) P(Oλ)=iP(O,Xt=iλ)=iαt(i)

    其中, α t ( i ) \alpha_t(i) αt(i) 是在时刻 t 处于状态 i 的情况下,观测序列 O 的部分概率。

  2. 解码问题(Decoding):

    给定观测序列 O 和模型 λ = ( A , B , π ) λ=(A, B, π) λ=(A,B,π),找到使得观测序列的概率最大的状态序列。

    计算公式:
    arg ⁡ max ⁡ X P ( X ∣ O , λ ) = arg ⁡ max ⁡ X P ( O , X ∣ λ ) = arg ⁡ max ⁡ X ∏ t = 1 T P ( O t , X t ∣ λ ) \arg \max_{X} P(X|O,λ) = \arg \max_{X} P(O, X|λ) = \arg \max_{X} \prod_{t=1}^{T} P(O_t, X_t|λ) argmaxXP(XO,λ)=argmaxXP(O,Xλ)=argmaxXt=1TP(Ot,Xtλ)

    其中,T 表示观测序列的长度。

  3. 学习问题(Learning):

    给定观测序列 O,调整模型参数 λ=(A, B, π) 使得观测序列的概率最大。

    计算公式:

    • 初始概率分布: π i = P ( X 1 = i ∣ O , λ ) \pi_i = P(X_1=i|O,λ) πi=P(X1=iO,λ)
    • 状态转移概率: a i j = ∑ t = 1 T − 1 P ( X t = i , X t + 1 = j ∣ O , λ ) ∑ t = 1 T − 1 P ( X t = i ∣ O , λ ) a_{ij} = \frac{\sum_{t=1}^{T-1} P(X_t=i, X_{t+1}=j|O,λ)}{\sum_{t=1}^{T-1} P(X_t=i|O,λ)} aij=t=1T1P(Xt=iO,λ)t=1T1P(Xt=i,Xt+1=jO,λ)
    • 发射概率: b i j = ∑ t = 1 , O t = j T P ( X t = i ∣ O , λ ) ∑ t = 1 T P ( X t = i ∣ O , λ ) b_{ij} = \frac{\sum_{t=1, O_t=j}^{T} P(X_t=i|O,λ)}{\sum_{t=1}^{T} P(X_t=i|O,λ)} bij=t=1TP(Xt=iO,λ)t=1,Ot=jTP(Xt=iO,λ)

这是一个简单的天气模型的例子,展示了 HMM 模型的基本结构和计算公式。在实际应用中,通常会使用算法来进行计算和解码。

import numpy as np# 模型参数
states = ['Sunny', 'Rainy']
observations = ['Hot', 'Mild', 'Cold']initial_prob = np.array([0.8, 0.2])transition_prob = np.array([[0.7, 0.3],[0.4, 0.6]
])emission_prob = np.array([[0.2, 0.4, 0.4],[0.5, 0.4, 0.1]
])# 观测序列
observations_sequence = ['Hot', 'Mild', 'Cold']# 概率计算问题(Evaluation)
def forward_algorithm(observations_sequence):T = len(observations_sequence)alpha = np.zeros((T, len(states)))# 初始化时刻 t=1 的 alphaalpha[0] = initial_prob * emission_prob[:, observations.index(observations_sequence[0])]# 递推计算 alphafor t in range(1, T):for j in range(len(states)):alpha[t, j] = np.sum(alpha[t-1] * transition_prob[:, j] * emission_prob[j, observations.index(observations_sequence[t])])# 返回观测序列的概率return np.sum(alpha[T-1])# 解码问题(Decoding)
def viterbi_algorithm(observations_sequence):T = len(observations_sequence)delta = np.zeros((T, len(states)))psi = np.zeros((T, len(states)), dtype=int)# 初始化时刻 t=1 的 deltadelta[0] = initial_prob * emission_prob[:, observations.index(observations_sequence[0])]# 递推计算 delta 和 psifor t in range(1, T):for j in range(len(states)):delta[t, j] = np.max(delta[t-1] * transition_prob[:, j]) * emission_prob[j, observations.index(observations_sequence[t])]psi[t, j] = np.argmax(delta[t-1] * transition_prob[:, j])# 回溯得到最优路径best_path = np.zeros(T, dtype=int)best_path[T-1] = np.argmax(delta[T-1])for t in range(T-2, -1, -1):best_path[t] = psi[t+1, best_path[t+1]]return best_path# 执行概率计算问题
probability = forward_algorithm(observations_sequence)
print(f"Probability of observing {observations_sequence}: {probability:.4f}")# 执行解码问题
best_path = viterbi_algorithm(observations_sequence)
print("Most likely states:")
for t, state in enumerate(best_path):print(f"Time {t+1}: {states[state]}")

请注意,这是一个简单的演示,实际应用中可能需要更复杂的模型和算法。上述代码中的 forward_algorithm 函数用于概率计算问题,而 viterbi_algorithm 函数用于解码问题。

3. 参考

《NLP深入学习(一):jieba 工具包介绍》
《NLP深入学习(二):nltk 工具包介绍》
《NLP深入学习(三):TF-IDF 详解以及文本分类/聚类用法》
《NLP深入学习(四):贝叶斯算法详解及分类/拼写检查用法》

欢迎关注本人,我是喜欢搞事的程序猿; 一起进步,一起学习;

也欢迎关注我的wx公众号:一个比特定乾坤

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

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

相关文章

JS的数据类型和运算符

typeof()方法:检测数据类型 JS中的基本数据类型 基本数据类型 1.number 数字 2.string 字符串 3.boolean 布尔 4.null 代表空值(typeof方法检测出来的数据类型是object类型) 5.underfined 未定义;变量已声明但是未赋值 6.…

QT Model/View 设计模式中 selection 模型

1. QT 的 selection 模型是用来做什么的? Qt的selection模型用于管理TableView中的选择操作。它允许用户选择和操作特定的数据。 2. Selection 模型用途的例子? 当使用Qt的TableView时,可以使用selection模型来实现以下用途: …

vue路由-全局前置守卫

1. 介绍 详见:全局前置守卫网址 使用场景: 对于支付页,订单页等,必须是登录的用户才能访问的,游客不能进入该页面,需要做拦截处理,跳转到登录页面 全局前置守卫的原理: 全局前置…

KubeSphere 核心实战之二【在kubesphere平台上部署redis】(实操篇 2/4)

文章目录 1、登录kubesphere平台2、redis部署分析3、redis容器启动代码4、kubesphere平台部署redis4.1、创建redis配置集4.2、创建redis工作负载4.3、创建redis服务 5、测试连接redis 在kubesphere平台上部署redis应用都是基于redis镜像进行部署的,所以所有的部署操…

2022-ECCV-Adaptive Face Forgery Detection in Cross Domain

一、研究背景 1.伪造视频是逐帧生成的,因此会造成时间维度上的伪影。而鲁棒的检测模型需要对同一身份的不同帧有一致的检测结果。 1.利用频率线索进行deepfake检测效果良好,但也会导致帧间不一致问题,即不同帧检测结果不同。 2.以往方法中固定…

【JavaScript】面向后端快速学习 笔记

文章目录 JS是什么?一、JS导入二、数据类型 变量 运算符三、流程控制四、函数五、对象 与 JSON5.1 对象5.2 JSON5.3 常见对象1. 数组2. Boolean对象3. Date对象4. Math5. Number6. String 六、事件6.1 常用方法1. 鼠标事件2. 键盘事件3. 表单事件 6.2 事件的绑定**1…

【咕咕送书 | 第八期】羡慕同学进了大厂核心部门,看懂这本书你也能行!

🎬 鸽芷咕:个人主页 🔥 个人专栏:《linux深造日志》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! ⛳️ 写在前面参与规则 ✅参与方式:关注博主、点赞、收藏、评论,任意评论(每人最多评论…

VMware虚拟机设置NAT网络模式

查看本地服务器网卡ip10.9.158.77 设置vmNet8虚拟网卡ip10.9.58.177,不需要在同一网段 3.点击VMware设置“虚拟网络编辑器”,点击“NAT设置”所有设置的ip网段需要与第二步的VMNet8网卡的网一致

LeetCode 2788. 按分隔符拆分字符串

一、题目 1、题目描述 给你一个字符串数组 words 和一个字符 separator ,请你按 separator 拆分 words 中的每个字符串。 返回一个由拆分后的新字符串组成的字符串数组,不包括空字符串 。 注意 separator 用于决定拆分发生的位置,但它不包含…

算法 动态分析 及Java例题讲解

动态规划 动态规划(英语:Dynamic programming,简称 DP),是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适…

day-15 按分隔符拆分字符串

思路 依次对words的每个字符进行split(),然后将非空的加入List 解题方法 String arr[]s.split(ss);利用split()方法将words的每个字符串划分为String数组 if(arr[i]!“”) //将非空的加入 list.add(arr[i]); String ss“”separator; //使用转义字符 时间复杂度:…

HCIA——18实验:NAT

学习目标: NAT 学习内容: NAT 1.要求——基本的 2.模型 3.IP分配、规划、优化 1)思路 R2为ISP路由器,其上只能配置ip地址,不得冉进行其他的任何配置—ospf配置 认证 、汇总、沉默接口、加快收敛、缺省路由 PC1-PC2…

配置免费的SSL

1 引言 本文介绍了如何在 Linux 环境下使用免费的 Let’s Encrypt 为你的网站配置 SSL 证书的方法,以及如何在 Nginx 服务器中启用 SSL。对于需要在自己的网站上启用 HTTPS 的用户来说非常实用。 2 SSL 简介 SSL,全称为 Secure Sockets Layer&#xf…

React一般可以用哪些值作为key?

在 React 中,key 是用来帮助 React 核对 Virtual DOM 中的节点是否发生变化的。key 值唯一且稳定有助于提高渲染性能,因为 React 可以根据 key 值判断哪些元素需要重新渲染。 一般来说,以下属性可以作为 key 值: 数据库中的 ID&a…

制动盘市场分析:预计2029年将达到123亿美元

制动系统是高速列车动车组九大关键技术之一,制动性能的好坏将直接影响列车的行车安全及运行品质。制动系统按照操纵控制方式,主要分为电制动和空气制动。通常情况下,电制动和空气制动联合作用,但是在紧急制动情况下,只…

软件测试的原则有哪些?全文干货!

前言 大家好,我是chowley,最近阅读了不少博客,感觉在软件测试原则方面的内容还是太冗余和笼统,今天我来精简一下,用少量的语言告诉你最干活的东西! 软件测试的原则 全面性(Exhaustiveness&…

如何让对方主动想要联系你(过年了,你懂的)

开始之前,先纠正几个和女生聊天的误区: 1、女生很矜持,羞涩,不可能主动联系男生或者表白。 2、我越主动,我就掌握了主导权。错,越主动的一方越被动,越被动的一方越主动。比如:你主…

测试工程师必知的10大测试法则

作为开发人员,我们应该遵守这样一句话:“质量不是来自检查,而是来自生产过程的改进。”——爱德华戴明 “测试即代码。” 太多的组织将任何未编码的东西视为一次性的。很明显,测试是必不可少的,但我们一次又一次地发现…

蓝桥杯备战 每日一题 (2)

今天的题目是回忆迷宫 这个题目我们来熟悉一下 弗洛伊德算法 的代码模板 弗洛伊德算法用来处理最短路径问题 弗洛伊德算法(Floyd’s algorithm)用于解决图中所有节点对之间的最短路径问题。算法的基本思路是通过逐步迭代更新节点对之间的最短路径长度&a…

Windows系统使用手册

点击前往查看🔗我的博客文章目录 Windows系统使用手册 文章目录 Windows系统使用手册Windows10解决大小核调度问题Windows系统安装软件Windows系统Typora快捷键Windows系统压缩包方式安装redisWindows安装dockerWindows系统的docker设置阿里源Windows系统下使用doc…