• 隐马尔可夫过程


    隐马尔可夫过程

    基本概念

    隐马尔可夫过程有明暗两条线,明线是可观测的变量,暗线是隐藏状态。例如在三个不同的装有黑白球的盒子中取球,明线是观测序列,就是每次取出来的球的颜色构成的序列,暗线是状态序列,也就是每次取的球属于的盒子的序列。我们只能观测到观测序列,而不能观测到盒子序列。

    推动隐马尔可夫模型随着时间不断运行的是它的内核三要素:状态转移矩阵 A A A、观测概率矩阵 B B B、以及初始隐状态概率向量 π \pi π

    写成三元组形式: λ = ( A , B , π ) \lambda=(A, B, \pi) λ=(A,B,π)

    求观测序列

    已知隐马尔可夫模型三要素 λ = ( A , B , π ) \lambda=(A, B, \pi) λ=(A,B,π),以及隐藏状态序列 I = ( i 1 , i 2 , ⋯   , i T ) I=(i_1, i_2, \cdots,i_T) I=(i1,i2,,iT)的基础上,求有可能对应的观测矩阵 O = ( o 1 , o 2 , ⋯   , o T ) O=(o_1,o_2, \cdots,o_T) O=(o1,o2,,oT)

    使用前向概率算法:

    1、令 α t ( i ) = P ( o 1 , o 2 , ⋯   , o t , i i = q t ∣ λ ) \alpha_t(i)=P(o_1,o_2,\cdots,o_t,i_i=q_t|\lambda) αt(i)=P(o1,o2,,ot,ii=qtλ)

    2、初始值: α 1 ( i ) = π i b i o 1 \alpha_1(i)=\pi_ib_{io_1} α1(i)=πibio1

    3、递推关系: α t + 1 ( i ) = [ ∑ j = 1 N α t ( j ) a j i ] b i o t + 1 \alpha_{t+1}(i)=[\sum_{j=1}^N\alpha_t(j)a_{ji}]b_{io_{t+1}} αt+1(i)=[j=1Nαt(j)aji]biot+1,一直推到 α T ( i ) \alpha_{T}(i) αT(i)

    4、相加得到结果: P ( O ∣ λ ) = ∑ i = 1 N α T ( i ) P(O|\lambda)=\sum_{i=1}^N\alpha_T(i) P(Oλ)=i=1NαT(i)

    代码实现:

    
    # -*- coding: utf-8 -*-
    # @Use     : 
    # @Time    : 2022/8/29 22:03
    # @FileName: hidden_Markov.py
    # @Software: PyCharm
    
    
    import numpy as np
    from hmmlearn import hmm
    
    # 隐状态
    states = ['box1', 'box2', 'box3']
    
    # 观测集合
    observations = ['black', 'white']
    
    # 初始概率
    start_probability = np.array([0.3, 0.5, 0.2])
    
    # 状态转移矩阵
    transition_probability = np.array([
        [0.4, 0.4, 0.2],
        [0.3, 0.2, 0.5],
        [0.2, 0.6, 0.2]
    ])
    
    # 观测概率矩阵
    emission_probability = np.array([
        [0.2, 0.8],
        [0.6, 0.4],
        [0.4, 0.6]
    ])
    
    # 使用MultinomialHMM建模
    model = hmm.MultinomialHMM(n_components=len(states))
    model.startprob_ = start_probability
    model.transmat_ = transition_probability
    model.emissionprob_ = emission_probability
    
    # 观测序列
    observation_list = np.array([0, 1, 0])
    
    # 计算观测序列概率,是概率的自然对数值
    print(np.exp(model.score(observation_list.reshape(-1, 1))))
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    求隐藏状态序列

    已知隐马尔可夫模型三要素 λ = ( A , B , π ) \lambda=(A, B, \pi) λ=(A,B,π),以及观测矩阵 O = ( o 1 , o 2 , ⋯   , o T ) O=(o_1,o_2, \cdots,o_T) O=(o1,o2,,oT)的基础上,求有可能对应的隐藏状态序列 I = ( i 1 , i 2 , ⋯   , i T ) I=(i_1, i_2, \cdots,i_T) I=(i1,i2,,iT)

    使用维特比算法进行解码:

    # 隐状态
    states = ['box1', 'box2', 'box3']
    
    # 观测集合
    observations = ['black', 'white']
    
    # 初始概率
    start_probability = np.array([0.3, 0.5, 0.2])
    
    # 状态转移矩阵
    transition_probability = np.array([
        [0.4, 0.4, 0.2],
        [0.3, 0.2, 0.5],
        [0.2, 0.6, 0.2]
    ])
    
    # 观测概率矩阵
    emission_probability = np.array([
        [0.2, 0.8],
        [0.6, 0.4],
        [0.4, 0.6]
    ])
    
    # 使用MultinomialHMM建模
    model = hmm.MultinomialHMM(n_components=len(states))
    model.startprob_ = start_probability
    model.transmat_ = transition_probability
    model.emissionprob_ = emission_probability
    
    # 观测序列,黑白黑
    observation_list = np.array([0, 1, 0])
    
    # 调用维特比算法对观测序列进行隐状态解码
    logprob, box_list = model.decode(observation_list.reshape(-1, 1), algorithm='viterbi')
    
    # 输出隐状态序列
    print(box_list)
    for i in range(len(observation_list)):
        print(states[box_list[i]])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    参考

    《机器学习中的概率统计 python语言描述》 张雨萌

  • 相关阅读:
    各种信息论坛
    Nginx配置
    Flask 框架:运用Echarts绘制图形
    vue2脚手架组件化开发
    深入理解AQS之ReentrantLock
    python读取yaml文件内容
    二叉排序树的创建与添加操作(思路分析)
    服务器Centos7 静默安装Oracle Database 12.2
    二叉树的一些基本操作
    计算机网络 第2章物理层 作业2
  • 原文地址:https://blog.csdn.net/KPer_Yang/article/details/126594248