隐马尔科夫模型(HMM)及其实现

来源:互联网 发布:退役特种兵知乎 编辑:程序博客网 时间:2024/06/05 17:23

马尔科夫模型

马尔科夫模型是单重随机过程,是一个2元组:(S,A)。

其中S是状态集合,A是状态转移矩阵。

只用状态转移来描述随机过程。

 

马尔科夫模型的2个假设

有限历史性假设:t+l时刻系统状态的概率分布只与t时刻的状态有关,与t时刻以前的状态无关;

齐次性假设:从t时刻到t+l时刻的状态转移与t的值无关。

 

以天气模型为例

天气变化有3中状态S:{1(阴),2(云),3(晴)}


图片来自网络


则状态转移矩阵A:


这样,只要知道的初始状态概率向量,就能预测接下来每天的天气了。

 

隐马尔科夫模型

隐马尔科夫模型是双重随机过程,是一个5元组


V是输出集合。

表示在状态j时输出k的概率。

是初始状态概率。

用状态转移和输出概率一起来描述随机过程。

 

以扔硬币模型为例

有个小孩手上拿着3个各不相同,也正反不均匀的硬币。他每次随机抽取1个硬币扔,扔了很多次(比如10次),他并不告诉你他每次抽中的是哪个硬币。但是他会告诉你每次的正反结果:正正反正反正正正……

在这个问题中,我们知道观察序列(硬币的正反),但是小孩手上硬币类型的变换序列被隐藏起来了,我们不知道小孩每次拿的哪个硬币扔,因此是双重随机过程。这就隐马尔科夫过程。

 

这里假设模型参数已知:

[plain] view plain copy
  1. A=[0.90.05 0.05;0.45 0.1 0.45;0.45 0.45 0.1];  
  2. B=[0.50.75 0.25;0.5 0.25 0.75];  
  3. Pi=[1/31/3 1/3]';  

隐马尔科夫模型的3个问题

1.【概率问题】给定上述模型,观察到[正正反]的概率是多少?

[plain] view plain copy
  1. O=[11 2];  

2.【预测问题】给定上述模型,如果观察到上述结果,最可能的硬币转换序列(状态转换序列)是什么?

3.【学习问题】不告诉你模型参数,如何根据观察序列得到它们?

 

【概率问题】

1.向前算法

向前变量:给定模型,在时刻t,状态为i,且之前的观察序列如下的概率。

显然有

[plain] view plain copy
  1. Alpha=zeros(3,N);  
  2. Beta=zeros(3,N);  
  3. Lambda=zeros(3,N);  
  4.    
  5. Alpha(:,1)=B(O(1),:)'.*Pi;  
  6. Delta=Alpha;  
  7. fori=2:N  
  8.     Alpha(:,i)=A'*Alpha(:,i-1).*B(O(i),:)';  
  9. end  
  10. Q1_1=sum(Alpha(:,N));  

输出

[plain] view plain copy
  1. Alpha=  
  2. 0.166666666666667      0.150000000000000      0.0867187500000000  
  3. 0.250000000000000      0.0531250000000000    0.00683593750000000  
  4. 0.0833333333333333    0.0322916666666667    0.0259765625000000  
  5.    
  6. Q1_1=0.119531250000000  

2.向后算法

向后变量:给定模型,在时刻t,状态为i,且之后的观察序列如下的概率。

显然有


[plain] view plain copy
  1. Beta(:,N)=ones(N,1);  
  2. fori=N:-1:2  
  3.    Beta(:,i-1)=bsxfun(@times,A,B(O(i),:))*Beta(:,i);  
  4. end  
  5. Q1_2=sum(Pi.*B(1,:)'.*Beta(:,1));  

输出

[plain] view plain copy
  1. Beta=  
  2. 0.252187500000000      0.500000000000000      1  
  3. 0.202968750000000      0.587500000000000      1  
  4. 0.321093750000000      0.412500000000000      1  
  5.    
  6. Q1_2=0.119531250000000  

 

【预测问题】

Viterbi算法

Viterbi变量:给定模型,在时刻t,状态为i,观察到的最佳转换序列为的概率。


显然有


这里需要把最佳路径记录下来


[plain] view plain copy
  1. Q2=zeros(1,N);  
  2. fori=2:N  
  3.     Delta(:,i)=max(bsxfun(@times,A,Delta(:,i-1)))'.*B(O(i),:)';  
  4.    [~,Lambda(:,i)]=max(bsxfun(@times,A,Delta(:,i-1)));  
  5. end  
  6. [~,Q2(N)]=max(Delta(:,N));  
  7. fori=N:-1:2  
  8.     Q2(i-1)=Lambda(Q2(i),i);  
  9. end  


输出

[plain] view plain copy
  1. Delta=  
  2. 0.166666666666667      0.0750000000000000    0.0337500000000000  
  3. 0.250000000000000      0.0281250000000000    0.00316406250000000  
  4. 0.0833333333333333    0.0281250000000000    0.00949218750000000  

 

最优序列

[plain] view plain copy
  1. 1     1     1  


【学习问题】

1.有监督模式

在有大量标签数据下,直接用频率近似概率参数即可。

2.无监督模式

Baum-Welch算法

定义变量:在给定模型和观察序列O,在t时刻状态为i,在t+1时刻状态为j的概率



则关于模型参数的一种估计方法为

0 0
原创粉丝点击