我是靠谱客的博主 碧蓝导师,最近开发中收集的这篇文章主要介绍隐马尔可夫模型之python实战,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

隐马尔可夫模型之HMM基础
隐马尔可夫模型之评估观察序列概率
隐马尔可夫模型之学习算法
隐马尔可夫模型之预测算法
隐马尔可夫模型之python实战

手写

定义数据

Hidden_states = ("box 1", "box 2", "box 3") # 隐状态集合
Observations_states = ('red', 'white', 'red') # 观测状态集合

Start_probability = {'box 1': 0.2, 'box 2': 0.4, 'box 3': 0.4} # 初始状态

Hidden_transition_probability = { # 隐马尔可夫链中从当前盒子转移到其他盒子的概率
    'box 1' : {'box 1': 0.5, 'box 2': 0.2, 'box 3': 0.3},
    'box 2' : {'box 1': 0.3, 'box 2': 0.5, 'box 3': 0.2},
    'box 3' : {'box 1': 0.2, 'box 2': 0.3, 'box 3': 0.5},
   }

Hidden_observations_probability = {    # 原来叫emission_probability。这里表示每个盒子里面红白球的数量
    'box 1' : {'red': 0.5, 'white': 0.5},
    'box 2' : {'red': 0.4, 'white': 0.6},
    'box 3' : {'red': 0.7, 'white': 0.3},
   }

定义维特比算法

def viterbi(obs, states, start_p, trans_p, h2o_p): # Viterbi算法
    '''
    input:
        obs:观测状态集合O={红,白,红}
        states:隐状态集合Q={盒子1,盒子2,盒子3}
        start_p:初始状态Π=(0.2,0.4,0.4)T
        trans_p:转移状态矩阵A=【0.5 0.3 0.2
                              0.2 0.5 0.3
                              0.3 0.2 0.5】
        h2o_p:观测状态概率矩阵为:B=【0.5 0.4 
                                   0.7 0.5 
                                   0.6 0.3】
    output:
        prob:最优概率
        path[state]:最优路径
    '''
    V = [{}]
    path = {}

    # Initialize base cases (t == 0)
    for y in states:
        #t=1时刻,状态为i观测o1为红的概率,即δ1(i)
        V[0][y] = start_p[y] * h2o_p[y][obs[0]]
        # 初始状态,由start的概率,对应乘上发射概率,即由隐状态到观测状态的可能性
        path[y] = [y]

    # 开始遍历,t=2和t=3时刻
    for t in range(1,len(obs)):
        V.append({})
        newpath = {}

        for y in states:
            # 对于每个箱子,计算其由前一个的各个状态,到现在箱子的概率大小,取最大值。即求出最有可能到达现在箱子的路径
            # 前一个箱子转移到现在箱子的每个状态对应的路径大小都计算了,取最大值。作为V[t][y]的值,并更新路径
            (prob, state) = max([(V[t-1][y0] * trans_p[y0][y] * h2o_p[y][obs[t]], y0) for y0 in states])
            V[t][y] = prob
            newpath[y] = path[state] + [y]

        # Don't need to remember the old paths
        path = newpath

    print_dptable(V)
    (prob, state) = max([(V[len(obs) - 1][y], y) for y in states])
    return (prob, path[state])

预测

viterbi(Observations_states,
                   Hidden_states,
                   Start_probability,
                   Hidden_transition_probability,
                   Hidden_observations_probability)

(0.014699999999999998, [‘box 3’, ‘box 3’, ‘box 3’])

调包

hmmlearn安装很简单,"pip install hmmlearn"即可完成。
hmmlearn文档

定义数据

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
model.emissionprob_=emission_probability

seen = np.array([[0,1,0]]).T
logprob, box = model.decode(seen, algorithm="viterbi")

结果

print("The ball picked:【", ", ".join(map(lambda x: observations[x[0]], seen)),"】")
print("The hidden box【", ", ".join(map(lambda x: states[x], box)),"】")

The ball picked:【 red, white, red 】
The hidden box【 box3, box3, box3 】

github

最后

以上就是碧蓝导师为你收集整理的隐马尔可夫模型之python实战的全部内容,希望文章能够帮你解决隐马尔可夫模型之python实战所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部