HMM理解以及相关算法

来源:互联网 发布:虚拟仿真软件 编辑:程序博客网 时间:2024/06/14 00:39

1、MM  

    先有马尔可夫模型,再有隐马尔可夫模型,什么叫马尔可夫模型呢,也就是具有马尔可夫性质的模型,而马尔可夫性质用概念来讲,就是:一个过程的“将来”只取决于“现在”,而不取决于“过去”。这就叫马尔可夫性,具有马尔可夫性的过程叫做马尔可夫过程。

     (下面来一段数学定义:

           设在时刻t的随机变量用St 表示,其观察值用st表示,则如果当S1=s1,S2=s2,……St=st的前提下 ,S(t+1)=s(t+1)的概率为:

                 

         当n=1时就是一阶马尔可夫模型了,这个式子就是表明:系统在任一时刻所处的状态只与此时刻的前一时刻所处的状态有关 (注意,跟上面的“过去”、“现在”、“将来”要理解开来),后面还有一些时间无关性、转移概率相关的数学函数,在此先不列出,重在理解马尔可夫模型的思想先。  


2、HMM

         HMM与一阶MM形式差不多,而H则体现在HMM是由两个随机过程组成,一个是状态转移序列,它对应着一个单纯Markov过程;另一个是每次转移时输出的符号组成的符号序列。这两个随机过程,其中状态转移随机过程是不可观测的,只能通过另一个随机过程的输出观察序列观测。

        例如,容器与彩球的模型:有若干个容器,每个容器中按已知比例放入各色的彩球(这样,选择了容器后,我们可以用概率来预测取出各种彩球的可能性);我们做这样的实验,实验者从容器中取彩球——先选择一个容器,再从中抓出某一个球,只给观察者看球的颜色;这样,每次取取出的球的颜色是可以观测到的,即o1, o2,…,但是每次选择哪个容器是不暴露给观察者的,容器的序列就组成了隐藏状态序列S1, S2,…Sn。这是一个典型的可以用HMM描述的实验。


         以语音识别为例讲讲HMM模型,HMM一般可用六个参数来定义,M={S,O,A,B,PI,F};

         S:模型中状态的有限集合,记t时刻模型所处状态为St

        O:输出的观察值符号集合,t时刻模型观察到的观察值为Ot

        A:状态转移概率的集合

        B:输出观测值概率的集合,根据B将HMM分为离散型和连续型

        PI:系统初始状态概率的集合

        F:系统终了状态的集合

        为了便于表示,常用下面的形式表示一个HMM,即简写为M={A,B,pi }。HMM可以分为两部分,一个是Markov链,由pi ,A描述,产生的输出为
状态序列。另一个随机过程,由B描述,产生的输出为观察符号序列。


3、HMM的三个基本问题

        a.已知观测序列O={ o1 , o2 …… oT }和模型 U{A,B,pi },如何有效计算在给定模型的条件下产生观测序列O的条件概率P(O/U)最大。
        b.已知观测序列O=O={ o1 , o2 …… oT }和模型U {A,B,pi },如何选择相应的在某种意义上最佳的(能最好解释观测序列的)状态序列S。
        c.如何调整模型参数U {A,B,pi }以使条件概率P(O|U)最大。


4、3中abc问题的解决方案

      a问题由上一篇文章中的前向算法解决

      b问题由viterbi算法解决

      c问题后续继续说明,其使用的算法是Baum-Welch算法


5、viterbi算法的例子

      

    假设你有一个朋友在外地,每天你可以通过电话来了解他每天的活动。他每天只会做三种活动之一——Walk, Shop, Clean。你的朋友从事哪一种活动的概率与当地的气候有关,这里,我们只考虑两种天气——Rainy, Sunny。我们知道,天气与运动的关系如下:

P(o|state)

Rainy

Sunny

Walk

0.1

0.6

Shop

0.4

0.3

Clean

0.5

0.1

例如,在下雨天出去散步的可能性是0.1。

而天气之前互相转换的关系如下,(从行到列)

p(state—>next_state)

Rainy

Sunny

Rainy

0.7

0.3

Sunny

0.4

0.6

例如,从今天是晴天而明天就开始下雨的可能性是0.4 。

    同时为了求解问题我们假设初始情况:通话开始的第一天的天气有0.6的概率是Rainy,有0.4概率是Sunny。OK,现在的问题是,如果连续三天,你发现你的朋友的活动是:Walk->Shop->Clean(观测序列);那么,如何判断你朋友那里这几天的天气(隐藏状态序列)是怎样的?

    解决这个问题的python伪代码如下:

def forward_viterbi(y, X, sp, tp, ep):

T = {}

for state in X:

## prob. V. path V. prob.

T[state] = (sp[state], [state], sp[state])

for output in y:

U = {}

for next_state in X:

    total = 0

    argmax = None

    valmax = 0

    for source_state in X:

        (prob, v_path, v_prob) = T[source_state]

        p = ep[source_state][output] * tp[source_state][next_state]

        prob *= p

        v_prob *= p

        total += prob

        if v_prob > valmax:

            argmax = v_path + [next_state]

            valmax = v_prob

    U[next_state] = (total, argmax, valmax)

T = U

## apply sum/max to the final states:

total = 0

argmax = None

valmax = 0

for state in X:

(prob, v_path, v_prob) = T[state]

total += prob

if v_prob > valmax:

    argmax = v_path

    valmax = v_prob

return (total, argmax, valmax)几点说明:

    算法对于每一个状态要记录一个三元组:(prob, v_path, v_prob),其中,prob是从开始状态到当前状态所有路径(不仅仅

是最有可能的viterbi路径)的概率加在一起的结果(作为算法附产品,它可以输出一个观察序列在给定HMM下总的出现概率,即forward算法的输出),v_path是从开始状态一直到当前状态的viterbi路径,v_prob则是该路径的概率。

    算法开始,初始化T (T是一个Map,将每一种可能状态映射到上面所说的三元组上) 三重循环,对每个一活动y,考虑下一步每一个可能的状态next_state,并重新计算若从T中的当前状态state跃迁到next_state概率会有怎样的变化。跃迁主要考虑天气转移(tp[source_state][next_state])与该天气下从事某种活动(ep[source_state][output])的联合概率。所有下一步状态考虑完后,要从T中找出最优的选择viterbi路径——即概率最大的viterbi路径,即上面更新Map U的代码U[next_state] = (total, argmax, valmax)。

    算法最后还要对T中的各种情况总结,对total求和,选择其中一条作为最优的viterbi路径。

算法输出四个天气状态,这是因为,计算第三天的概率时,要考虑天气转变到下一天的情况。

通过程序的输出可以帮助理解这一过程:{p=p(observation|state)*p(state—>next_state)}

observation=Walk

next_state=Sunny

    state=Sunny

        p=0.36

        triple=(0.144,Sunny->,0.144)

    state=Rainy

        p=0.03

        triple=(0.018,Rainy->,0.018)

Update U[Sunny]=(0.162,Sunny->Sunny->,0.144)

next_state=Rainy

    state=Sunny

        p=0.24

        triple=(0.096,Sunny->,0.096)

    state=Rainy

        p=0.07

        triple=(0.042,Rainy->,0.042)

Update U[Rainy]=(0.138,Sunny->Rainy->,0.096)

observation=Shop

next_state=Sunny

    state=Sunny

        p=0.18

        triple=(0.02916,Sunny->Sunny->,0.02592)

    state=Rainy

        p=0.12

        triple=(0.01656,Sunny->Rainy->,0.01152)

Update U[Sunny]=(0.04572,Sunny->Sunny->Sunny->,0.02592)

next_state=Rainy

    state=Sunny

        p=0.12

        triple=(0.01944,Sunny->Sunny->,0.01728)

    state=Rainy

        p=0.28

        triple=(0.03864,Sunny->Rainy->,0.02688)

Update U[Rainy]=(0.05808,Sunny->Rainy->Rainy->,0.02688)

observation=Clean

next_state=Sunny

    state=Sunny

        p=0.06

        triple=(0.0027432,Sunny->Sunny->Sunny->,0.0015552)

    state=Rainy

        p=0.15

       triple=(0.008712,Sunny->Rainy->Rainy->,0.004032)

Update U[Sunny]=(0.0114552,Sunny->Rainy->Rainy->Sunny->,0.004032)

next_state=Rainy

    state=Sunny

        p=0.04

        triple=(0.0018288,Sunny->Sunny->Sunny->,0.0010368)

    state=Rainy

        p=0.35

        triple=(0.020328,Sunny->Rainy->Rainy->,0.009408)

Update U[Rainy]=(0.0221568,Sunny->Rainy->Rainy->Rainy->,0.009408)

final triple=(0.033612,Sunny->Rainy->Rainy->Rainy->,0.009408)所以,最终的结果是,朋友那边这几天最可能的天气情况是Sunny->Rainy->Rainy->Rainy,它有0.009408的概率出现。而我们算法的另一个附带的结论是,我们所观察到的朋友这几天的活动序列:Walk->Shop->Clean在我们的隐马可夫模型之下出现的总概率是0.033612。

原创粉丝点击