Hidden Markov Models学习笔记及Viterbi算法

        Hidden Markov Model由5个要素构成:

        1. N表示状态的集合。S={,, ..., },表示t时刻的状态;例如:人的健康状态有{'Health', 'Fever'};

        2. M表示不同的观察符号的集合。V={,, ...,};例如:医生观察人的感觉有{'Normal', 'Cold', 'Dizzy'};

        3. A表示状态转移概率集合。A={},=P(=|=),1i,jN;表示t-1时刻的状态转移到t时刻的状态的条件概率;

        4. B表示t时刻观察符号在状态时的条件概率。B={},=P(|);

        5. 表示初始状态的集合,={},=P(=),1 j N。

        给定N, M, A, B, ,HMMs就能输出一个观察符号的序列O=, 其中,T是观察序列的符合个数。


        Hidden Markov Model有3个独立性假设

        假设1:t时刻的状态只依赖于t-1时刻的状态

        假设2:t时刻观察到的符号只依赖于t时刻的状态

        假设3:状态与具体的时间无关。


        Hidden Markov Model的3个基本问题:

        问题1:给定一个HMMs的模型,如何高效的计算某一个输出观察序列O的概率?评价问题。

                     用forward算法来进行计算。以后会补充forward算法。

        问题2:给定一个HMMs的模型和一个输出观察序列O,如何找到产生O概率最大的状态序列?解码问题。

                    arg max P(O|Q),用Viterbi算法进行计算。下面有详细的例子。

                    表示t时刻状态时的最优状态序列和前t个观察序列的联合概率:

                   

                   

        问题3:给定一个HMMs的模型和一个输出观察序列O,如何调整模型的参数使得产生这一序列的概率最大?机器学习问题。

                     将用到Baum-Welch的EM算法,这个我没理解,等以后理解了再补充,如果有人知道欢迎一起讨论。


        Viterbi 算法:

        初始化:

        递归:

                 

        最终状体:

                         

        最优状态路径的逆向索引:=,t=T-1, T-2, ..., 1


        Vertibi算法例子(使用了维基百科中的维特比算法的例子):

        医生给病人看病,病人的状态有Health和Fever,而医生观察病人的感觉Normal, Cold, Dizzy,医生根据病人返回的感觉来判断病人是否生病(Health, Fever),医生觉得病人的模式符合HMM的问题2。例如:一个病人 day 1感觉是Normal, day 2感觉是Cold, day 3感觉是Dizzy。

N={Health, Fever}, M={Normal, Cold, Dizzy}

A:


  Health Fever
Health 0.7 0.3
Fever 0.4 0.6

B:

  Normal Cold Dizzy
Health 0.5 0.4 0.1
Fever 0.1 0.3 0.6


: P(health)=0.6, P(fever)=0.4

O={O1=normal,O2=cold, O3=dizzy}


Day 1(O1=normal)初始化:

=p(health)p(normal|health)=0.6*0.5=0.3,=0;

=p(fever)p(normal|fever)=0.4*0.1=0.04,=0;


开始递归:

Day 2(O2=cold):

=max{}P(cold|health)

               =max((0.3*0.7),(0.04*0.4))*0.4=0.084

;


=max{}P(cold|fever)

              =max((0.3*0.3),(0.04*0.6))*0.3=0.027

;


Day 3(O3=dizzy):

=max{}P(dizzy|health)

               =max{(0.084*0.7),(0.027*0.4)}*0.1=0.00588


=max{}P(dizzy|fever)

              =max{(0.084*0.3),(0.027*0.6)}*0.6=0.01512


最后一步

=max(0.00588,0.01512)=0.01512


结果:一个3天的病人的状态序列

day 3:fever, day 2: health, day 1: health。


Reference:

1.维基百科-维特比算法;

2. 条件随机场理论综述, 韩雪东,周彩根;







       


你可能感兴趣的:(Machine,Learning)