在隐马尔可夫模型中决定概率的方法有哪些?

时间:2011-10-28 18:12:38

标签: algorithm math statistics probability hidden-markov-models

我开始学习隐藏的马尔可夫模型,并且在维基页面上,以及在github上有很多例子,但大多数概率已经存在(降雨变化70%,改变状态的几率为30%等) ..)。拼写检查或句子示例,似乎是在研究书籍,然后对单词的概率进行排名。

马尔可夫模型是否包含了一种确定概率的方法,或者我们是否想到其他一些模型来预先计算它?

很抱歉,如果此问题已关闭。我认为隐藏的马尔可夫模型如何选择可能的序列,但概率部分对我来说有点灰色(因为它经常提供)。示例或任何信息都会很棒。


对于那些不熟悉马尔可夫模型的人,这是一个例子(来自维基百科)http://en.wikipedia.org/wiki/Viterbi_algorithmhttp://en.wikipedia.org/wiki/Hidden_Markov_model

#!/usr/bin/env python

states = ('Rainy', 'Sunny')

observations = ('walk', 'shop', 'clean')

start_probability = {'Rainy': 0.6, 'Sunny': 0.4}

transition_probability = {
   'Rainy' : {'Rainy': 0.7, 'Sunny': 0.3},
   'Sunny' : {'Rainy': 0.4, 'Sunny': 0.6},
   }

emission_probability = {
   'Rainy' : {'walk': 0.1, 'shop': 0.4, 'clean': 0.5},
   'Sunny' : {'walk': 0.6, 'shop': 0.3, 'clean': 0.1},
   }

#application code
# Helps visualize the steps of Viterbi.
def print_dptable(V):
    print "    ",
    for i in range(len(V)): print "%7s" % ("%d" % i),
    print

    for y in V[0].keys():
        print "%.5s: " % y,
        for t in range(len(V)):
            print "%.7s" % ("%f" % V[t][y]),
        print

def viterbi(obs, states, start_p, trans_p, emit_p):
    V = [{}]
    path = {}

    # Initialize base cases (t == 0)
    for y in states:
        V[0][y] = start_p[y] * emit_p[y][obs[0]]
        path[y] = [y]

    # Run Viterbi for t > 0
    for t in range(1,len(obs)):
        V.append({})
        newpath = {}

        for y in states:
            (prob, state) = max([(V[t-1][y0] * trans_p[y0][y] * emit_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])



#start trigger
def example():
    return viterbi(observations,
                   states,
                   start_probability,
                   transition_probability,
                   emission_probability)
print example()

1 个答案:

答案 0 :(得分:5)

您正在寻找EM(期望最大化)算法来计算观察序列集合中的未知参数。可能最常用的是Baum-Welch算法,该算法使用forward-backward算法。

作为参考,这里有一个set of slides我以前用过来审查HMM。它对Forward-Backward,Viterbi和Baum-Welch有很好的概述