【数学】【机器学习】什么是隐马尔可夫模型 (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

相关文章

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

SpringBoot快速接入OpenAI大模型的方法(JDK8)

《SpringBoot快速接入OpenAI大模型的方法(JDK8)》本文介绍了如何使用AI4J快速接入OpenAI大模型,并展示了如何实现流式与非流式的输出,以及对函数调用的使用,AI4J支持JDK8... 目录使用AI4J快速接入OpenAI大模型介绍AI4J-github快速使用创建SpringBoot

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

Spring AI Alibaba接入大模型时的依赖问题小结

《SpringAIAlibaba接入大模型时的依赖问题小结》文章介绍了如何在pom.xml文件中配置SpringAIAlibaba依赖,并提供了一个示例pom.xml文件,同时,建议将Maven仓... 目录(一)pom.XML文件:(二)application.yml配置文件(一)pom.xml文件:首

如何在本地部署 DeepSeek Janus Pro 文生图大模型

《如何在本地部署DeepSeekJanusPro文生图大模型》DeepSeekJanusPro模型在本地成功部署,支持图片理解和文生图功能,通过Gradio界面进行交互,展示了其强大的多模态处... 目录什么是 Janus Pro1. 安装 conda2. 创建 python 虚拟环境3. 克隆 janus