主要是转载自:
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)