李航书上隐马尔科夫模型案例的实验结果复现

主要是转载自:
https://www.cnblogs.com/pinard/p/7001397.html

我自己加了些注释以及修复了一个在python2.7下面运行的bug

1) 评估观察序列概率。
给定模型λ=(A,B,π)和观测序列O
计算P(O|λ)

2)模型参数学习问题。
观测序列O
输出λ=(A,B,π)

3)预测问题,也称为解码问题。
已知模型(A,B,π),观测序列O(o1,o2,···,oT)
求令P(I|O)最大的状态序列I=(i1,i2,···,iT)

第1个基恩问题和第3个基本问题:

# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
# @Author: appleyuchi
# @Date:   2018-12-31 16:11:34
# @Last Modified by:   appleyuchi
# @Last Modified time: 2018-12-31 17:19:26

import numpy as np
from hmmlearn import hmm
from math import log
from math import e
states = ["box 1", "box 2", "box3"]
n_states = len(states)

observations = ["red", "white"]
n_observations = len(observations)

start_probability = np.array([0.2, 0.4, 0.4])

transition_probability = np.array([
  [0.5, 0.2, 0.3],
  [0.3, 0.5, 0.2],
  [0.2, 0.3, 0.5]
])

emission_probability = np.array([
  [0.5, 0.5],
  [0.4, 0.6],
  [0.7, 0.3]
])

model = hmm.MultinomialHMM(n_components=n_states)
model.startprob_=start_probability#π
model.transmat_=transition_probability#转移概率A
model.emissionprob_=emission_probability#摸取小球的概率B


seen = np.array([[0,1,0]]).T#这里的意思是输入序列为(红,白,红)

logprob, box = model.decode(seen, algorithm="viterbi")
# print "observations=",observations
# print "seen=",seen
print"box=",box

print"---------------下面是隐马尔科夫第1个基本问题-------------------"
# print e
# print model.score(seen)
print "《统计学习方法》P178的HMM第1个基本问题:\nP(O|λ)=",e**model.score(seen)

print"---------------下面是隐马尔科夫第2个基本问题-------------------"


print"---------------下面是隐马尔科夫第3个基本问题-------------------"
print"The ball picked:", ", ".join(map(lambda x: observations[x], seen[0]))
print"《统计学习方法》P187的HMM第3个基本问题", ", ".join(map(lambda x: states[x], box))

第二个基本问题:

# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

import numpy as np
from hmmlearn import hmm

states = ["box 1", "box 2", "box3"]
n_states = len(states)

observations = ["red", "white"]
n_observations = len(observations)
model2 = hmm.MultinomialHMM(n_components=n_states, n_iter=20, tol=0.01)
X2 = np.array([[0,1,0,1],[0,0,0,1],[1,0,1,1]])
print"-------------------------------------------"
model2.fit(X2)
print "π=",model2.startprob_
print "A=",model2.transmat_
print "B=",model2.emissionprob_
print model2.score(X2)
print"-------------------------------------------"
model2.fit(X2)
print "π=",model2.startprob_
print "A=",model2.transmat_
print "B=",model2.emissionprob_
print model2.score(X2)
print"-------------------------------------------"
model2.fit(X2)
print "π=",model2.startprob_
print "A=",model2.transmat_
print "B=",model2.emissionprob_
print model2.score(X2)

猜你喜欢

转载自blog.csdn.net/appleyuchi/article/details/85474999
今日推荐