您的位置:首页 > 其它

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

2016-01-26 11:20 204 查看
From:http://blog.csdn.net/ycheng_sjtu/article/details/38865395

马尔科夫模型

马尔科夫模型是单重随机过程,是一个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

A=[0.90.05 0.05;0.45 0.1 0.45;0.45 0.45 0.1];

B=[0.50.75 0.25;0.5 0.25 0.75];

Pi=[1/31/3 1/3]';

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

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

[plain] view
plain copy

O=[11 2];

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

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

【概率问题】

1.向前算法

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



显然有



[plain] view
plain copy

Alpha=zeros(3,N);

Beta=zeros(3,N);

Lambda=zeros(3,N);

Alpha(:,1)=B(O(1),:)'.*Pi;

Delta=Alpha;

fori=2:N

Alpha(:,i)=A'*Alpha(:,i-1).*B(O(i),:)';

end

Q1_1=sum(Alpha(:,N));

输出

[plain] view
plain copy

Alpha=

0.166666666666667 0.150000000000000 0.0867187500000000

0.250000000000000 0.0531250000000000 0.00683593750000000

0.0833333333333333 0.0322916666666667 0.0259765625000000

Q1_1=0.119531250000000

2.向后算法

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



显然有



[plain] view
plain copy

Beta(:,N)=ones(N,1);

fori=N:-1:2

Beta(:,i-1)=bsxfun(@times,A,B(O(i),:))*Beta(:,i);

end

Q1_2=sum(Pi.*B(1,:)'.*Beta(:,1));

输出

[plain] view
plain copy

Beta=

0.252187500000000 0.500000000000000 1

0.202968750000000 0.587500000000000 1

0.321093750000000 0.412500000000000 1

Q1_2=0.119531250000000

【预测问题】

Viterbi算法

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



显然有



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



[plain] view
plain copy

Q2=zeros(1,N);

fori=2:N

Delta(:,i)=max(bsxfun(@times,A,Delta(:,i-1)))'.*B(O(i),:)';

[~,Lambda(:,i)]=max(bsxfun(@times,A,Delta(:,i-1)));

end

[~,Q2(N)]=max(Delta(:,N));

fori=N:-1:2

Q2(i-1)=Lambda(Q2(i),i);

end

输出

[plain] view
plain copy

Delta=

0.166666666666667 0.0750000000000000 0.0337500000000000

0.250000000000000 0.0281250000000000 0.00316406250000000

0.0833333333333333 0.0281250000000000 0.00949218750000000

最优序列

[plain] view
plain copy

1 1 1

【学习问题】

1.有监督模式

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

2.无监督模式

Baum-Welch算法

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







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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: