7

我开始学习隐藏马尔可夫模型,在 wiki 页面以及 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()
4

1 回答 1

5

您正在寻找一种 EM(期望最大化)算法来计算来自观察到的序列集的未知参数。最常用的可能是Baum-Welch算法,它使用前向后向算法。

作为参考,这里有一组我之前用来回顾 HMM的幻灯片。它很好地概述了 Forward-Backward、Viterbi 和 Baum-Welch

于 2011-10-28T18:21:43.327 回答