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

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

最近更新

  1. TCP协议是安全的吗?

    2024-06-15 13:08:05       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-15 13:08:05       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-15 13:08:05       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-15 13:08:05       18 阅读

热门阅读

  1. yum方式更新Jenkins

    2024-06-15 13:08:05       9 阅读
  2. Oracle中的模糊查询

    2024-06-15 13:08:05       7 阅读
  3. 在 Lua 中如何实现高效的内存管理?

    2024-06-15 13:08:05       8 阅读
  4. Qt正则表达式

    2024-06-15 13:08:05       7 阅读
  5. HTML DOM 事件

    2024-06-15 13:08:05       6 阅读
  6. SpringBoot 项目,三种方式实现打印 sql 日志

    2024-06-15 13:08:05       8 阅读