隐马尔可夫过程

隐马尔可夫过程

基本概念

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

推动隐马尔可夫模型随着时间不断运行的是它的内核三要素:状态转移矩阵 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))))

求隐藏状态序列

已知隐马尔可夫模型三要素 λ = ( 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]])

参考

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KPer_Yang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值