【数学】【机器学习】什么是隐马尔可夫模型 (HMM)?

2024-06-15 06:52

本文主要是介绍【数学】【机器学习】什么是隐马尔可夫模型 (HMM)?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 隐马尔可夫模型 (HMM)
      • 背景
      • 公式
      • 示例题目
      • 详细讲解
      • Python代码求解
      • 实际生活中的例子
    • 什么是隐变量
      • 背景
      • 隐含变量的意义
      • 举例说明
      • HMM的三个基本问题
      • 示例

隐马尔可夫模型 (HMM)

背景

隐马尔可夫模型(Hidden Markov Model, HMM)是一种统计模型,用于描述含有隐含变量的时间序列数据。它在自然语言处理、语音识别、生物信息学等领域有广泛应用。HMM假设系统是一个马尔可夫过程,即未来的状态只依赖于当前状态,而与过去状态无关。此外,HMM有两个层次:观测层次和隐藏层次,观测层次是可以看到的数据,隐藏层次是我们无法直接观察到的状态。

公式

HMM主要包括以下几个公式和参数:

  1. 初始状态分布: π = { π i } \pi = \{\pi_i\} π={πi},表示系统初始时刻各状态的概率分布。
  2. 状态转移矩阵: A = { a i j } A = \{a_{ij}\} A={aij},表示从状态 i i i转移到状态 j j j的概率。
  3. 观测概率矩阵: B = { b j ( k ) } B = \{b_j(k)\} B={bj(k)},表示在状态 j j j下观测到符号 k k k的概率。

上述参数的定义为:

  • π i = P ( Q 1 = S i ) \pi_i = P(Q_1 = S_i) πi=P(Q1=Si)
  • a i j = P ( Q t + 1 = S j ∣ Q t = S i ) a_{ij} = P(Q_{t+1} = S_j | Q_t = S_i) aij=P(Qt+1=SjQt=Si)
  • b j ( k ) = P ( O t = v k ∣ Q t = S j ) b_j(k) = P(O_t = v_k | Q_t = S_j) bj(k)=P(Ot=vkQt=Sj)

示例题目

假设一个简单的天气模型,有两个隐藏状态(晴天和雨天)和两个观测值(散步和打伞)。我们知道初始状态分布、状态转移矩阵和观测概率矩阵如下:

  • 初始状态分布: π = [ 0.6 , 0.4 ] \pi = [0.6, 0.4] π=[0.6,0.4]
  • 状态转移矩阵:
    A = [ 0.7 0.3 0.4 0.6 ] A = \begin{bmatrix} 0.7 & 0.3 \\ 0.4 & 0.6 \end{bmatrix} A=[0.70.40.30.6]
  • 观测概率矩阵:
    B = [ 0.5 0.5 0.1 0.9 ] B = \begin{bmatrix} 0.5 & 0.5 \\ 0.1 & 0.9 \end{bmatrix} B=[0.50.10.50.9]

观测序列为:散步,打伞,散步,问隐状态序列的概率分布。

详细讲解

我们需要使用前向算法计算观测序列的概率。前向算法通过动态规划的方法逐步计算出每个时刻的前向概率。

  1. 初始化:
    α 1 ( i ) = π i b i ( O 1 ) \alpha_1(i) = \pi_i b_i(O_1) α1(i)=πibi(O1)
    对于本题:
    α 1 ( 1 ) = 0.6 ⋅ 0.5 = 0.3 \alpha_1(1) = 0.6 \cdot 0.5 = 0.3 α1(1)=0.60.5=0.3
    α 1 ( 2 ) = 0.4 ⋅ 0.1 = 0.04 \alpha_1(2) = 0.4 \cdot 0.1 = 0.04 α1(2)=0.40.1=0.04

  2. 递推:
    α t + 1 ( j ) = [ ∑ i = 1 N α t ( i ) a i j ] b j ( O t + 1 ) \alpha_{t+1}(j) = \left[ \sum_{i=1}^{N} \alpha_t(i) a_{ij} \right] b_j(O_{t+1}) αt+1(j)=[i=1Nαt(i)aij]bj(Ot+1)
    对于第二个观测值:
    α 2 ( 1 ) = [ α 1 ( 1 ) ⋅ a 11 + α 1 ( 2 ) ⋅ a 21 ] b 1 ( O 2 ) \alpha_2(1) = \left[ \alpha_1(1) \cdot a_{11} + \alpha_1(2) \cdot a_{21} \right] b_1(O_2) α2(1)=[α1(1)a11+α1(2)a21]b1(O2)
    = [ 0.3 ⋅ 0.7 + 0.04 ⋅ 0.4 ] ⋅ 0.5 = \left[ 0.3 \cdot 0.7 + 0.04 \cdot 0.4 \right] \cdot 0.5 =[0.30.7+0.040.4]0.5
    = 0.107 = 0.107 =0.107
    α 2 ( 2 ) = [ α 1 ( 1 ) ⋅ a 12 + α 1 ( 2 ) ⋅ a 22 ] b 2 ( O 2 ) \alpha_2(2) = \left[ \alpha_1(1) \cdot a_{12} + \alpha_1(2) \cdot a_{22} \right] b_2(O_2) α2(2)=[α1(1)a12+α1(2)a22]b2(O2)
    = [ 0.3 ⋅ 0.3 + 0.04 ⋅ 0.6 ] ⋅ 0.9 = \left[ 0.3 \cdot 0.3 + 0.04 \cdot 0.6 \right] \cdot 0.9 =[0.30.3+0.040.6]0.9
    = 0.081 = 0.081 =0.081

  3. 终止:
    P ( O ∣ λ ) = ∑ i = 1 N α T ( i ) P(O | \lambda) = \sum_{i=1}^{N} \alpha_T(i) P(Oλ)=i=1NαT(i)
    对于第三个观测值:
    α 3 ( 1 ) = [ α 2 ( 1 ) ⋅ a 11 + α 2 ( 2 ) ⋅ a 21 ] b 1 ( O 3 ) \alpha_3(1) = \left[ \alpha_2(1) \cdot a_{11} + \alpha_2(2) \cdot a_{21} \right] b_1(O_3) α3(1)=[α2(1)a11+α2(2)a21]b1(O3)
    = [ 0.107 ⋅ 0.7 + 0.081 ⋅ 0.4 ] ⋅ 0.5 = \left[ 0.107 \cdot 0.7 + 0.081 \cdot 0.4 \right] \cdot 0.5 =[0.1070.7+0.0810.4]0.5
    = 0.04255 = 0.04255 =0.04255
    α 3 ( 2 ) = [ α 2 ( 1 ) ⋅ a 12 + α 2 ( 2 ) ⋅ a 22 ] b 2 ( O 3 ) \alpha_3(2) = \left[ \alpha_2(1) \cdot a_{12} + \alpha_2(2) \cdot a_{22} \right] b_2(O_3) α3(2)=[α2(1)a12+α2(2)a22]b2(O3)
    = [ 0.107 ⋅ 0.3 + 0.081 ⋅ 0.6 ] ⋅ 0.1 = \left[ 0.107 \cdot 0.3 + 0.081 \cdot 0.6 \right] \cdot 0.1 =[0.1070.3+0.0810.6]0.1
    = 0.00837 = 0.00837 =0.00837

最终,观测序列的概率为:
P ( O ∣ λ ) = α 3 ( 1 ) + α 3 ( 2 ) = 0.04255 + 0.00837 = 0.05092 P(O | \lambda) = \alpha_3(1) + \alpha_3(2) = 0.04255 + 0.00837 = 0.05092 P(Oλ)=α3(1)+α3(2)=0.04255+0.00837=0.05092

Python代码求解

import numpy as np# 初始参数
pi = np.array([0.6, 0.4])
A = np.array([[0.7, 0.3],[0.4, 0.6]])
B = np.array([[0.5, 0.5],[0.1, 0.9]])
O = [0, 1, 0]  # 0表示散步,1表示打伞# 前向算法
def forward(pi, A, B, O):N = len(pi)T = len(O)alpha = np.zeros((T, N))# 初始化alpha[0, :] = pi * B[:, O[0]]# 递推for t in range(1, T):for j in range(N):alpha[t, j] = np.sum(alpha[t-1, :] * A[:, j]) * B[j, O[t]]# 终止return np.sum(alpha[-1, :])# 计算观测序列的概率
prob = forward(pi, A, B, O)
print(f"观测序列的概率为: {prob}")

实际生活中的例子

隐马尔可夫模型在语音识别中有重要应用。例如,在电话客服系统中,HMM可以用来处理用户的语音输入,识别用户的意图,进而提供相应的服务。假设用户输入了一段语音,系统通过HMM模型对语音进行分析,判断每一段语音对应的文字,再根据文字内容判断用户的需求,例如查询余额、转账等。

什么是隐变量

隐含变量(Hidden Variables)在隐马尔可夫模型(HMM)中指的是那些不能直接观察到但对系统行为产生影响的状态。它们是隐藏在观测数据背后的真实状态。

背景

在很多实际问题中,我们只能观察到某些现象或数据(观测变量),但这些数据是由一些我们看不到的状态(隐含变量)所决定的。例如,在语音识别中,观测变量是音频信号,而隐含变量是对应的文字或语音的语义。在天气预测中,观测变量是我们每天看到的天气情况(晴天、雨天),而隐含变量可能是更深层的气候模式或气压系统。

隐含变量的意义

隐含变量的存在使得问题更加复杂,因为我们需要通过观测数据去推断这些看不见的状态。HMM提供了一种系统化的方法来处理这种问题。通过定义初始状态分布、状态转移矩阵和观测概率矩阵,我们可以描述系统在时间序列上的演变。

举例说明

以天气预测为例:

  • 隐含变量:天气状态(晴天、雨天)
  • 观测变量:活动(散步、打伞)

我们无法直接知道今天是晴天还是雨天(隐含变量),但是我们可以看到今天有人散步或者打伞(观测变量)。通过一段时间的观测活动数据,我们可以推断出天气的变化模式(隐含变量的变化)。

HMM的三个基本问题

  1. 评估问题:给定模型参数和观测序列,计算观测序列的概率。
  2. 解码问题:给定观测序列和模型参数,找到最有可能的隐含状态序列。
  3. 学习问题:给定观测序列,估计模型参数(初始状态分布、状态转移矩阵、观测概率矩阵)。

示例

假设我们有以下模型参数:

  • 隐含状态:晴天( S 1 S_1 S1)、雨天( S 2 S_2 S2
  • 观测状态:散步( O 1 O_1 O1)、打伞( O 2 O_2 O2
  • 初始状态分布: π = [ 0.6 , 0.4 ] \pi = [0.6, 0.4] π=[0.6,0.4]
  • 状态转移矩阵:
    A = [ 0.7 0.3 0.4 0.6 ] A = \begin{bmatrix} 0.7 & 0.3 \\ 0.4 & 0.6 \end{bmatrix} A=[0.70.40.30.6]
  • 观测概率矩阵:
    B = [ 0.5 0.5 0.1 0.9 ] B = \begin{bmatrix} 0.5 & 0.5 \\ 0.1 & 0.9 \end{bmatrix} B=[0.50.10.50.9]

观测序列为:散步,打伞,散步。我们通过前向算法计算该观测序列的概率。

import numpy as np# 初始参数
pi = np.array([0.6, 0.4])
A = np.array([[0.7, 0.3],[0.4, 0.6]])
B = np.array([[0.5, 0.5],[0.1, 0.9]])
O = [0, 1, 0]  # 0表示散步,1表示打伞# 前向算法
def forward(pi, A, B, O):N = len(pi)T = len(O)alpha = np.zeros((T, N))# 初始化alpha[0, :] = pi * B[:, O[0]]# 递推for t in range(1, T):for j in range(N):alpha[t, j] = np.sum(alpha[t-1, :] * A[:, j]) * B[j, O[t]]# 终止return np.sum(alpha[-1, :])# 计算观测序列的概率
prob = forward(pi, A, B, O)
print(f"观测序列的概率为: {prob}")

实际生活中的例子如语音识别系统和天气预测系统都是通过观察外部现象(观测变量)来推断内部状态(隐含变量),从而进行决策和预测。

这篇关于【数学】【机器学习】什么是隐马尔可夫模型 (HMM)?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1062725

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

uva 10014 Simple calculations(数学推导)

直接按照题意来推导最后的结果就行了。 开始的时候只做到了第一个推导,第二次没有继续下去。 代码: #include<stdio.h>int main(){int T, n, i;double a, aa, sum, temp, ans;scanf("%d", &T);while(T--){scanf("%d", &n);scanf("%lf", &first);scanf