# 概率图模型一：隐马尔可夫模型

## 两个基本假设：

1. 齐次马尔科夫假设：隐藏的马尔科夫链在任意时刻的状态只依赖于前一时刻的状态，与其他时刻的状态及观测无关，也与时刻无关。
2. 观测独立性假设：任意时刻的观测只依赖于该时刻的马尔科夫链状态，与其他观测及状态无关。

### 观测序列概率的前向算法

import numpy as np

#马尔科夫前向算法
def forward_prob(model,Observe,States):
A,B,pi=model
N=States.size
T=Observe.size

alpha=pi*B[:,Observe[0]]
print "（1）计算初值alpha_1（i）: ",alpha

print "(2)递推..."
for t in xrange(0,T-1):
print "t=",t+1,"   alpha_",t+1,"(i):",alpha
alpha=alpha.dot(A)*B[:,Observe[t+1]]

print "(3)终止。alpha_",T,"(i):    ", alpha
print "输出Prob:  ",alpha.sum()
return alpha.sum()

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]])
pi = np.array([0.2, 0.4, 0.4])
model = (A, B, pi)
Observe = np.array([0, 1, 0])
States = np.array([1, 2, 3])
forward_prob(model,Observe,States)


### 观测序列概率的后向算法

import numpy as np

def backward_prob(model,Observe,States):
'''
马尔科夫后向算法
'''

A, B, pi = model
N = States.size
T = Observe.size

beta = np.ones((N,))  # beta_T
print "（1）计算初值beta_",T,"(i):   ", beta

print "(2) 递推..."
for t in xrange(T - 2, -1, -1):  # t=T-2,...,0
beta = A.dot(B[:, Observe[t + 1]] * beta)
print "t=", t + 1, "   beta_", t + 1, "(i):", beta

print "(3)终止。alpha_", 1, "(i):    ", beta
prob = pi.dot(beta * B[:, Observe[0]])
print "输出Prob:  ", prob
return prob

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]])
pi = np.array([0.2, 0.4, 0.4])
model = (A, B, pi)
Observe = np.array([0, 1, 0])
States = np.array([1, 2, 3])
backward_prob(model, Observe, States)


posted @ 2017-06-17 22:55  三门曾经  阅读(311)  评论(0编辑  收藏  举报