作者:相国大人
写这篇博文用了很多时间和精力,如果这篇博文对你有帮助,希望您可以打赏给博主相国大人。哪怕只捐1毛钱,也是一种心意。通过这样的方式,也可以培养整个行业的知识产权意识。我可以和您建立更多的联系,并且在相关领域提供给您更多的资料和技术支持。
附:《春天里,我们的拉萨儿童图书馆,需要大家的帮助》
参考文献
齐次马尔科夫性假设:隐藏的马尔科夫链在任意时刻 t 的状态只依赖于前一时刻的状态,与其他时刻的状态及观测无关,也与时刻 t 无关。
观测独立性假设:任意时刻的观测只依赖于该时刻的马尔科夫链的状态,与其他观测及状态无关。
说人话,就下面这个图,其中箭头和连边表示概率依赖。
从这个图中,我们可以很轻松的对后面的一些公式做推导。比如:
转移概率 aij=(It+1=qj|It=qi)
观测概率 bj(ot)=(ot|It=qj)
初始状态概率 πi=P(I1=qi)
前向概率 αt(i)=(o1:t,It=qi)
转移概率 aij=(It+1=qj|It=qi)
观测概率 bj(ot)=(ot|It=qj)
初始状态概率 πi=P(I1=qi)
初始前向概率:
输入:隐马尔科夫模型 λ ,观测序列 O ;
输出:观测序列概率 P(O|λ) 。
根据公式 (1.8) ,设定初值。
根据公式 (1.9) 递推。其中 t=1,2,⋯,T−1 。
终止。根据公式 (1.10) 得到输出。
python实现(李航《统计学习方法》177页例题10.2):
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@author: XiangguoSun
@contact: [email protected]
@file: forward_prob.py
@time: 2017/3/13 8:53
@software: PyCharm
"""
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()
if __name__ == '__main__':
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)
后向概率: βt(i)=(ot+1:T|It=qi)
初始后向概率: βT(i)=1,i=1,2,⋯,N
后向概率迭代推导:
输入:隐马尔科夫模型 λ ,观测序列 O ;
输出:观测序列概率 P(O|λ) 。
python实现(李航《统计学习方法》177页例题10.2):
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@author: XiangguoSun
@contact: [email protected]
@file: markov.py
@time: 2017/3/13 8:53
@software: PyCharm
"""
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):
alpha = alpha.dot(A)*B[:, Observe[t+1]]
print "t=", t + 1, " alpha_", t + 1, "(i):", alpha
print "(3)终止。alpha_",T,"(i): ", alpha
print "输出Prob: ",alpha.sum()
return alpha.sum()
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
if __name__ == '__main__':
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)
backward_prob(model, Observe, States)
实验结果: