前言:
这里主要介绍观察序列的前向与后向算法
目录:
- 直接计算法
- 前向算法
- 后向算法
- 概率与期望值计算
一 直接计算
已知条件:
模型,
观测序列出现的概率:
状态序列的概率
对于固定的状态序列 , 观测序列
O 和 I 同时出现的联合概率为: 这个实际应用中也经常会用到
(通过贝叶斯公式可以推导)
上面计算量太大了,可以通过前向和后向算法简化
二 前向算法
算法流程:
输入: 隐马尔可夫模型,观测序列O
输入: 观测序列概率
初始值:
递推值:
终止值:
例子:
# -*- coding: utf-8 -*-
"""
Created on Wed Jan 15 15:45:08 2020
@author: chengxf2
"""
import numpy as np
def Forward():
##状态转移矩阵
arrA = np.array([[0.5,0.2,0.3],
[0.3,0.5,0.2],
[0.2,0.3,0.5]])
##观测概率矩阵
arrB= np.array([[0.5,0.5],
[0.4, 0.6],
[0.7,0.3]])
m,n = np.shape(arrA)
PI= np.array([0.2,0.4,0.4]) ##初始状态概率
T =3
V =[0,1,0] ##观测集合
dictV ={0:"红",1:"白"}
arrAlpha = np.zeros((T,n)) ##array
print("\n 观测序序列: ")
for t in range(T):
obj= V[t]
print("\t ",dictV[obj])
print("\n *****************计算初始值********************")
##step1 处置计算
obj =V[0]
b1 = arrB[:,obj]
arrAlpha[0,]=np.multiply(PI,b1)
print("\n arrAlpha ",arrAlpha[0,])
print("\n *****************递推********************")
for t in range(T-1):
alpha_t = arrAlpha[t,] ## 前向概率
obj_t1 = V[t+1] ##t+1时刻的观测值
objB = arrB[:,obj_t1]
arrAlpha[t+1,]=np.multiply(np.dot(alpha_t,arrA),objB)
print("\n arrAlpha", arrAlpha)
##观测序列的概率
print("\n *****************观测序列的概率********************")
P = sum(arrAlpha[T-1,])
print("\n arrAlpha: ", P)
Forward()
二 后向算法
定义给定隐马尔可夫模型,定义t时刻状态
,从t+1到T的部分观测序列为
的概率为后向概率
记住:
算法流程:
输入: 观测序列O, 以及模型
输出: 观测序列概率
2.1
2.2 对t = T-1,T-2,....,1
2.3
import numpy as np
"""
Q: 状态序列
V: 观测集合
A: 转移概率矩阵
B: 生成概率矩阵
O: 观测序列
PI: 概率向量
"""
def BackWard():
Q =[1,2,3]
V =['红','白']
A = np.array([[0.5,0.2,0.3],
[0.3,0.5,0.2],
[0.2,0.3,0.5]])
B = np.array([[0.5,0.5],
[0.4, 0.6],
[0.7,0.3]])
O = ['红','白','红']
PI = [0.2, 0.4, 0.4]
T = len(O)
N = len(Q)
beta = np.zeros((T,N))
print("\n ***********step1 初始化概率***********")
beta[T-1,]=1.0
print("\n beta ",beta)
print("\n ***********step2 后向计算法***********")
for t in range(T-2,-1,-1):
index = V.index(O[t+1])
for i in range(N):
a = np.dot(np.multiply(A[i,],B[:,index]),beta[t+1,].T)
#print("\n a: ",a,"\t i: ",i)
beta[t,i]= a
print("\n beta ",beta)
print("\n ===计算P(O|lambda) ===: ")
index0 = V.index(O[0])
P = np.dot(np.multiply(PI,B[:,index0]),beta[0])
print("\n P: ",P)
计算结果和前向计算结果是一样的
四 概率与期望值计算
4.1 给定模型 和 观测O,在时刻t处于状态
的概率
4.2 给定模型 和 观测O,在t时刻处于
且在t+1时刻处于