HMM-GMM——前向算法

HMM概序

(533

1、五个基本要素
    HMM
是个五元组λ=( S, O, π ,A,B)

    S:状态值集合,O:观察值集合,π:初始化概率,A:状态转移概率矩阵,B:给定状态下,观察值概率矩阵
2
、HMM的三个假设
1
、有限历史性假设,p(si|si-1,si-2,...,s1)= p(si|si-1)
2
、齐次性假设,(状态与具体时间无关),P(si+1|si)=p(sj+1,sj)
3
、输出独立性假设,输出仅与当前状态有关,P(o1,...ot|s1,...st) = P(ot|st)

3
、HMM解决的三个问题
1
:识别问题,已知模型参数 λ= (A, B, π),计算某个观测序列发生的概率,即求P(O|λ)用前向算法或者后向算法求解此类问题。

2:译码问题,给出观测序列O和模型μ,怎样选择一个状态序列S(s1,s2,...st+1),能最好的解释观测序列,此问题采用了维特比算法

3:训练问题,如何调整模型参数 λ=(π, A, B), 使得P(O|λ)较大?此问题面向不同的语料库有不同的方式:

    a.对于观测序列和状态序列都有的立项预料库,直接用较大似然估计即可获得参数λ
    b.
对于只知道观测序列的,应用EM算法Baum-Welch鲍姆-韦尔奇算法)的实现前向后向算法求解。

 

前向算法

先看一个通过观察海藻湿度推测天气的实例。

假设连续观察3天的海藻湿度为(Dry,Damp,Soggy),求出该观察序列的概率。天气只有三类(Sunny,Cloudy,Rainy),而且海藻湿度和天气有一定的关系。

已知:

1.隐藏的状态:Sunny,Cloudy, Rainy;海藻湿度有四类{Dry,Dryish,Damp, Soggy }

2.观察状态序列:{Dry, Damp, Soggy };

3.初始状态序列:Sunny(0.63),Cloudy(0.17),Rainy(0.20);

4.状态转移矩阵:

 

Sunny

Cloudy

Rainy

Sunny

0.5

0.375

0.125

Cloudy

0.25

0.125

0.625

Rainy

0.25

0.375

0.375

Cloudy(昨天)->Sunny(今天)的概率是0.25;

Sunny(昨天)->Rainy(今天)的概率是0.125.

 

5.混淆矩阵(海藻湿度与天气的相关性):

 

Dry

Dryish

Damp

Soggy

Sunny

0.6

0.2

0.15

0.05

Cloudy

0.25

0.25

0.25

0.25

Rainy

0.05

0.10

0.35

0.50

观察到海藻湿度Dry,则当天Sunny的概率是0.6;Cloudy的概率是0.25;而当天Rainy的概率是0.05.

Howto calculate the probability of this observation list?

直接计算法

问题:已知HMM的参数 λ,和观测序列O = {o1, o2,...,oT},求P(O|λ)

思路:

1,列举所有可能的长度为T的状态序列I = {i1, i2,..., iT};

2,求各个状态序列I与观测序列 的联合概率P(O,I|λ);

3,所有可能的状态序列求和∑_I P(O,I|λ)得到P(O|λ)。

     即统计P(observation|Sunny,Sunny, Sunny)+P(observation| Sunny, Sunny, Cloudy)+ P(observation| Sunny,Sunny,Rainy)+ P(observation| Sunny, Cloudy, Sunny) + P(observation| Sunny,Cloudy,Cloudy) + P(observation| Sunny, Cloudy, Rainy) + …总共的可能性有3^3种。

步骤:

     1,最终目标是求O和I同时出现的联合概率,即:

                    P(O,I|λ)= P(O|I,λ)P(I|λ)

   那就需要求出P(O|I, λ) 和 P(I|λ)。

2,求P(I|λ) ,即状态序列I = {i1,i2,..., iT} 的概率:

         P(I|λ) = P(i1,i2, ..., iT |λ)

                 =P(i1 |λ)P(i2,i3, ..., iT |λ)

                 =P(i1 |λ)P(i2 |i1, λ)P(i3, i4, ..., iT |λ)

                 =......

                 =P(i1 |λ)P(i2 |i1, λ)P(i3 | i2, λ)...P(iT |iT-1, λ)

 而上面的P(i1|λ) 是初始为状态i1的概率,P(i2| i1,λ) 是从状态i1转移到i2的概率,其他同理,于是分别使用初始概率分布π 和状态转移矩阵A,就得到结果:

                                    

PS:上面的ai1i2代表A的第i1行第i2列。

 

3,P(O|I, λ),即对固定的状态序列I,观测序列O的概率是:

                               

4,代入第一步求出P(O,I|λ)

                              

5,对所有可能的状态序列I求和得到观测序列O的概率P(O|λ):

                             

时间复杂度:

每个时刻有n个状态,一共有t个时刻,而根据上面的第5步可以知道每个时刻需要乘2T-1次,所以时间复杂度是:O((2T-1)nT)

 

前向算法

实际由于马尔科夫模型,我们得知其实第二天的状况只取决于第一天,第三天的天气已经与第一天的天气没有关系了。

我们可以先求P(Day1-Sunny),P(Day1-Cloudy),P(Day1-Rainy),Day1的海藻湿度是Dry.

P(Day1-Sunny)= 0.63*0.6;

P(Day1-Cloudy)=0.17*0.25;

P(Day1-Rain)=0.20*0.05;

继续求P(Day2-Sunny),P(Day2-Cloudy),P(Day2-Rainy), Day2的海藻湿度是Damp.

P(Day2-Suny)=(P(Day1-Sunny)*0.5 + P(Day1-Cloudy)*0.25 +P(Day1-Rainy)*0.25)* 0.15

P(Day2-Cloudy) = (P(Day1-Sunny)*0.375+P(Day1-Cloudy)*0.125 + P(Day1-Rainy)*0.625) * 0.25

P(Day2-Rainy)=(P(Day1-Sunny)*0.125+ P(Day1-Cloudy)*0.625 + P(Day1-Rainy)*0.375)* 0.35

同理继续求第三日的各天气概率,Day3的海藻湿度是Soggy.

P(Day3-Suny)=(P(Day2-Sunny)*0.5 + P(Day1-Cloudy)*0.25 +P(Day1-Rainy)*0.25)* 0.05

P(Day3-Cloudy) = (P(Day2-Sunny)*0.375+P(Day1-Cloudy)*0.125 + P(Day1-Rainy)*0.625) * 0.25

P(Day3-Rainy)=(P(Day2-Sunny)*0.125+ P(Day1-Cloudy)*0.625 + P(Day1-Rainy)*0.375)* 0.50

推出:

P(observationlist) =P(Day3-Sunny)+P(Day3-Cloudy)+P(Day3-Rainy) =0.030319

公式总结:

    step1 初始化:

                               α1(i) = πi*bi(O1),1≤i≤N

    step2 归纳计算:

                               

    step3 终结:

                                  P(O|μ)=

 

 

时间复杂度

    计算某时刻的某个状态的前向变量需要看前一时刻的N个状态,此时时间复杂度为O(N),每个时刻有N个状态,此时时间复杂度为N*O(N)=O(N2),又有T个时刻,所以时间复杂度为T*O(N2)=O(N2T)。

程序例证1

   

   前向算法计算P(O|M)

   step1

             α1(1) =π1*b1(red)=0.2*0.5=0.1       

           α1(2)=π2*b2(red)==0.4*0.4=0.16       

           α1(3)=π3*b3(red)==0.4*0.7=0.21

    step2

             α2(1)=α1(1)*a11*b1(white)+ α1(2)*a21*b1(white) + α1(3)*a31*b1(white)

       ...

   step3:

             P(O|M) = α3(1)+α3(2)+α3(3)

 

例证2

假设有3个盒子,编号为1,2,3,每个盒子都装有红白两种颜色的小球,数目如下:

 

盒子号

1

2

3

红球数

5

4

7

白球数

5

6

3

然后按照下面的方法抽取小球,来得到球颜色的观测序列:

1,按照 π=(0.2, 0.4, 0.4) 的概率选择1个盒子,从盒子随机抽出

1个球,记录颜色后放回盒子;

2,按照下图A选择新的盒子,按照下图B抽取球,重复上述过程;

PS

A的第i行是选择到第i号盒子,第j列是转移到j号盒子,如:第一行第二列的0.2代表:上一次选择1号盒子后这次选择2号盒子的概率是0.2。

B的第i行是选择到第i号盒子,第j列是抽取到j号球,如:第二行第一列的0.4代表:选择了2号盒子后抽取红球的概率是0.4。

求:得到观测序列“红白红”的概率是多少?

解:

1,明确已知:HMM模型的参数已经如上图所示了,那我们就需要再明确两件事:HMM中那“看不见的状态”和“可见的观测”分别是什么。

可见的观测”根据题目可知是:y =“红白红”, “看不见的状态”就是这三次分别选择了什么盒子,且一共有3个状态:选中1号盒子、选中2号盒子、选中3号盒子。

2,根据前向算法,第一步计算 αi(1),这很简单:

αi=1 (t=1) 即时刻1时位于状态“选中1号盒子”的前向概率,所以:α1(1) =“选中1号盒子”*“选中红球” = π0* B10 =0.2*0.5 = 0.1

同理:α2(1) =0.4*0.4 = 0.16,α3(1)= 0.4*0.7 = 0.28。

3,计算 αi(2)

根据公式:

α1(2)= (∑_j α1(2)αj1) b1y2

=(0.1*0.5 + 0.16*0.3 + 0.28*0.2) * 0.5

=0.077

α2(2)= 0.1104

α3(2)= 0.0606

4,同αi(2),计算αi(3):

α1(3)=0.04187

α2(3)=0.03551

α3(3)=0.05284

5,最终

P(O|λ)= ∑_i αi(3)

=0.04187 + 0.03551 + 0.05284

=0.13022

 

参考:

    https://blog.csdn.net/jeiwt/article/details/8076019

    https://www.2cto.com/kf/201609/544539.html

 

猜你喜欢

转载自blog.csdn.net/audio_algorithm/article/details/80936077
今日推荐