HMM所解决的三个方面问题

1.介绍

隐马尔可夫比马尔可夫多一个隐状态,隐状态可以已知也可以未知,未知隐状态可以通过观测序列获得最可能的隐状态。

隐马尔可夫的两个假设:
1.对于状态来说(隐状态)当前状态只与前一时刻状态有关
2.当前时刻的观测值只与当前状态(隐状态)有关

隐马尔可夫可以解决的三个方面的问题:
1.求概率问题,已知模型参数(A,B, π)和观测序列O
,可以计算当前模型下的观测序列概率。
即在已知模型的基础下,出现这样的观测序列可能性有多大。

2.训练学习问题,学习HMM模型,已知观测序列O,计算使该观测序列出现最大可能性的HMM模型。
这是一个通过序列得到模型的过程,不需要知道隐状态,得到模型自然也得到了隐状态。

3.预测问题,根据HMM模型和观测序列,计算状态序列。
这一问题通常要先解决问题2,得到最优的模型之后,用所学习到的模型取解决预测问题。
为什么说是预测问题呢,因为问题3通常的应用是在NLP,词性标注,分词,翻译任务。有一种翻译预测的意思。

2.HMM三个问题的解决

举个例子:
这里有三个盒子:box1,box2,box3
每个盒子都可能摸出red,white两种颜色的球球

那么观测序列就是观测出来的球球
隐状态就是是从哪个盒子摸的

1.求概率问题
这个要求已知模型参数(转移矩阵A,观测概率矩阵B,初始概率向量 π)
A:

box1box2box3
box10.50.20.3
box20.30.50.2
box30.20.30.5

B:

redwhite
box10.50.5
box20.40.6
box30.70.3

π:

box1box2box3
第一次从三个箱子拿球的概率0.20.40.4

已知观测序列:
red white red

可以求出这个观测序列发生的概率,以及最有可能的隐状态序列

from hmmlearn import hmm
import numpy as np

if __name__ == "__main__":

    """
    问题1:已知模型、观测序列,求观测序列在这个模型下的概率问题
    """
    # 模型的定义
    # 隐状态
    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])


    # 转移矩阵A
    transition_probability = np.array([
        [0.5, 0.2, 0.3],
        [0.3, 0.5, 0.2],
        [0.2, 0.3, 0.5]
    ])

    # 观测概率矩阵B
    emission_probability = np.array([
        [0.5, 0.5],
        [0.4, 0.6],
        [0.7, 0.3]
    ])

    model1 = hmm.MultinomialHMM(n_components=n_states)
    model1.startprob_ = start_probability
    model1.transmat_ = transition_probability
    model1.emissionprob_ = emission_probability

    seen = np.array([[0, 1, 0]]).T # 输入观测序列
    logprob, box = model1.decode(seen, algorithm="viterbi")
    print(logprob,box)
    print("The ball picked:",[observations[int(i)] for i in seen])
    print("The hidden box", [states[int(i)] for i in box])

    box2 = model1.predict(seen)
    print("The ball picked:", [observations[int(i)] for i in seen])
    print("The hidden box", [states[int(i)] for i in box2])
    print(model1.score(seen))

在这里插入图片描述

这里求出的概率-2.038545309915233其实是观测序列发生的概率的ln值,即
lnP =-2.038545309915233
得到的最可能的状态序列是box3—box3—box3

这里我们可以计算一下在不知道隐状态的时候,观测概率发生的概率:
3个box一共3**3 = 27种隐状态:
box1 – box1 – box1
box1 – box1 – box2
box1 – box1 – box3
box1 – box2 – box1
box1 – box2 – box2
box1 – box2 – box3
box1 – box3 – box1
box1 – box3 – box2
box1 – box3 – box3
box2 – box1 – box1
box2 – box1 – box2

把这些概率加起来值为0.13022
ln0.13022≈−2.0385

2.训练学习问题
这类问题要求已知观测序列,从观测序列可以得知观测值有两种,给定一个隐藏状态的可能状态数n_states,然后就可以训练出能得到观测矩阵的可能性最大的一个HMM模型

"""
问题2:已知观测序列,求解使观测序列出现概率最大的模型参数的问题
"""
# 离散序列 MultinomialHMM来构建模型
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]])
# 对模型参数的学习
model2.fit(X2, lengths=[4, 4, 4])
print("start_probility:\n",model2.startprob_)
print("transition_probility:\n",model2.transmat_)
print("emission_probability:\n",model2.emissionprob_)
print(model2.score(X2))
best_start_probability = model2.startprob_
best_transition_probability = model2.transmat_
best_emission_probability = model2.emissionprob_
score = model2.score(X2)
for i in range(2):
    # 再计算三次模型,找到分数最高的一组模型
    model2.fit(X2)
    print("start_probility:\n",model2.startprob_)
    print("transition_probility:\n",model2.transmat_)
    print("emission_probability:\n",model2.emissionprob_)
    print(model2.score(X2))
    if model2.score(X2) > score:
        score = model2.score(X2)
        best_start_probability = model2.startprob_
        best_transition_probability = model2.transmat_
        best_emission_probability = model2.emissionprob_
# 选取分数最高的一组系数构成的HMM模型作为最终模型

start_probility:
[0.66452295 0.22892967 0.10654738]
transition_probility:
[[0.24109481 0.33171148 0.42719371]
[0.27541871 0.33440095 0.39018034]
[0.32133808 0.33242396 0.34623796]]
emission_probability:
[[0.76604242 0.23395758]
[0.44948162 0.55051838]
[0.2437396 0.7562604 ]]
-7.968661248038626
start_probility:
[2.35226463e-04 9.99764774e-01 2.24678950e-14]
transition_probility:
[[0.41883451 0.2555928 0.32557268]
[0.11364722 0.00183315 0.88451963]
[0.22685444 0.48527655 0.28786901]]
emission_probability:
[[0.59049037 0.40950963]
[0.99292853 0.00707147]
[0.11267762 0.88732238]]
-6.748389565228643
start_probility:
[1.66818037e-11 6.38541196e-11 1.00000000e+00]
transition_probility:
[[2.00021999e-01 1.93711614e-01 6.06266386e-01]
[1.89309977e-01 1.84051895e-01 6.26638128e-01]
[5.24138699e-01 4.75837247e-01 2.40537818e-05]]
emission_probability:
[[1.58425571e-01 8.41574429e-01]
[1.73495095e-01 8.26504905e-01]
[9.99189639e-01 8.10361350e-04]]
-6.5464407218288505

这里跑了三个不同的HMM模型,可以取分数最高的那个模型作为该观测序列的HMM模型。得到了模型,就可以进行问题三了。

3.预测问题

这个是要已知模型和观测序列,那么可以推出隐状态。一般是要根据问题2求出一个最佳的HMM模型然后用该模型和观测序列套用问题1的求解模式去得到状态序列

"""
问题3:已知观测序列和模型,计算隐状态
"""
# 选取已经求取的最适合的一组模型参数
print("best_start_probability:",best_start_probability)
    print("best_transition_probability:",best_transition_probability)
    print("best_emission_probability:",best_emission_probability)

model3 = hmm.MultinomialHMM(n_components=n_states)
model3.startprob_ = best_start_probability
model3.transmat_ = best_transition_probability
model3.emissionprob_ = best_emission_probability

seen = np.array([[i[0] for i in X2]]).T  # 输入观测序列
print("已知的观测序列是:",seen)
logprob, box = model3.decode(seen, algorithm="viterbi")
print(logprob, box)  
print("The ball picked:", [observations[int(i)] for i in seen])
print("The hidden box", [states[int(i)] for i in box])

best_start_probability: [1.66818037e-11 6.38541196e-11 1.00000000e+00]
best_transition_probability: [[2.00021999e-01 1.93711614e-01 6.06266386e-01]
[1.89309977e-01 1.84051895e-01 6.26638128e-01]
[5.24138699e-01 4.75837247e-01 2.40537818e-05]]
best_emission_probability: [[1.58425571e-01 8.41574429e-01]
[1.73495095e-01 8.26504905e-01]
[9.99189639e-01 8.10361350e-04]]
已知的观测序列是: [[0]
[1]
[0]
[1]
[0]
[0]
[0]
[1]
[1]
[0]
[1]
[1]]
-11.304568795120566 [2 0 2 0 2 1 2 0 0 2 0 0]
The ball picked: [‘red’, ‘white’, ‘red’, ‘white’, ‘red’, ‘red’, ‘red’, ‘white’, ‘white’, ‘red’, ‘white’, ‘white’]
The hidden box [‘box3’, ‘box 1’, ‘box3’, ‘box 1’, ‘box3’, ‘box 2’, ‘box3’, ‘box 1’, ‘box 1’, ‘box3’, ‘box 1’, ‘box 1’]

这里用最佳的模型求出来序列如上

参考文献[1]
参考文献[2]
(如果对于连续型的序列,需要用GaussianHMM,见文献2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值