隐马尔科夫模型(HMM)及其实现
马尔科夫模型
马尔科夫模型是单重随机过程,是一个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次),他并不告诉你他每次抽中的是哪个硬币。但是他会告诉你每次的正反结果:正正反正反正正正……
在这个问题中,我们知道观察序列(硬币的正反),但是小孩手上硬币类型的变换序列被隐藏起来了,我们不知道小孩每次拿的哪个硬币扔,因此是双重随机过程。这就隐马尔科夫过程。
这里假设模型参数已知:
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.【概率问题】给定上述模型,观察到[正正反]的概率是多少?
O=[11 2];
2.【预测问题】给定上述模型,如果观察到上述结果,最可能的硬币转换序列(状态转换序列)是什么?
3.【学习问题】不告诉你模型参数,如何根据观察序列得到它们?
【概率问题】
1.向前算法
向前变量:给定模型,在时刻t,状态为i,且之前的观察序列如下的概率。
显然有
 = {\pi _i}{b_i}\left( {{o_i}} \right)}&{\left( {1 \le i \le N} \right)}\end{array}\\ \begin%7barray%7d%7b*%7b20%7d%7bc%7d%7d%7b%7b\alpha%20_%7bt%20+%201%7d%7d\left%28%20j%20\right%29%20=%20\left%20%7b\sum\limits_%7bi%20=%201%7d^N%20%7b%7b\alpha%20_t%7d\left%28%20i%20\right%29%7ba_%7bij%7d%7d%7d%20%7d%20\right%7bb_j%7d\left%28%20%7b%7bo_%7bt%20+%201%7d%7d%7d%20\right%29%7d&%7b1%20\le%20t%20\le%20T%20-%201,1%20\le%20j%20\le%20N%7d\end%7barray%7d\end%7barray%7d)
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));
输出
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,且之后的观察序列如下的概率。
显然有
 = 1}&{\left( {1 \le i \le N} \right)}\end{array}\\ \begin%7barray%7d%7b*%7b20%7d%7bc%7d%7d%7b%7b\beta%20_t%7d\left%28%20i%20\right%29%20=%20\sum\limits_%7bj%20=%201%7d^N%20%7b%7ba_%7bij%7d%7d%7bb_j%7d\left%28%20%7b%7bo_%7bt%20+%201%7d%7d%7d%20\right%29%7b\beta%20_%7bt%20+%201%7d%7d\left%28%20j%20\right%29%7d%20%7d&%7b1%20\le%20t%20\le%20T%20-%201,1%20\le%20j%20\le%20N%7d\end%7barray%7d\end%7barray%7d)
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));
输出
Beta=
0.252187500000000 0.500000000000000 1
0.202968750000000 0.587500000000000 1
0.321093750000000 0.412500000000000 1
Q1_2=0.119531250000000
【预测问题】
Viterbi算法
Viterbi变量:给定模型,在时刻t,状态为i,观察到的最佳转换序列为的概率。
显然有
 = {\pi _i}{b_i}\left( {{o_i}} \right)}&{1 \le i \le N}\end{array}\\ \begin%7barray%7d%7b*%7b20%7d%7bc%7d%7d%7b%7b\delta%20_%7bt%20+%201%7d%7d\left%28%20j%20\right%29%20=%20\left%20%7b\max%20%7b\delta%20_t%7d\left%28%20i%20\right%29%7ba_%7bij%7d%7d%7d%20\right%7bb_j%7d\left%28%20%7b%7bo_%7bt%20+%201%7d%7d%7d%20\right%29%7d&%7b1%20\le%20i%20\le%20N%7d\end%7barray%7d\end%7barray%7d)
这里需要把最佳路径记录下来
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
输出
Delta=
0.166666666666667 0.0750000000000000 0.0337500000000000
0.250000000000000 0.0281250000000000 0.00316406250000000
0.0833333333333333 0.0281250000000000 0.00949218750000000
最优序列
1 1 1
【学习问题】
1.有监督模式
在有大量标签数据下,直接用频率近似概率参数即可。
2.无监督模式
Baum-Welch算法
定义变量:在给定模型和观察序列O,在t时刻状态为i,在t+1时刻状态为j的概率
 = P\left( {{q_t} = i,{q_{t + 1}} = j\left| {O,\lambda } \right.} \right)\\ %20=%20%7b%7b%7b\alpha%20_t%7d\left%28%20i%20\right%29%7ba_%7bij%7d%7d%7bb_j%7d\left%28%20%7b%7bo_%7bt%20+%201%7d%7d%7d%20\right%29%7b\beta%20_%7bt%20+%201%7d%7d\left%28%20j%20\right%29%7d%20\mathord%7b\left/%20%7b\vphantom%20%7b%7b%7b\alpha%20_t%7d\left%28%20i%20\right%29%7ba_%7bij%7d%7d%7bb_j%7d\left%28%20%7b%7bo_%7bt%20+%201%7d%7d%7d%20\right%29%7b\beta%20_%7bt%20+%201%7d%7d\left%28%20j%20\right%29%7d%20%7b\sum\limits_%7bi%20=%201%7dN%20%7b\sum\limits_%7bj%20=%201%7dN%20%7b%7b\alpha%20_t%7d\left%28%20i%20\right%29%7ba_%7bij%7d%7d%7bb_j%7d\left%28%20%7b%7bo_%7bt%20+%201%7d%7d%7d%20\right%29%7b\beta%20_%7bt%20+%201%7d%7d\left%28%20j%20\right%29%7d%20%7d%20%7d%7d%7d%20\right.%20\kern-\nulldelimiterspace%7d%20%7b\sum\limits_%7bi%20=%201%7dN%20%7b\sum\limits_%7bj%20=%201%7dN%20%7b%7b\alpha%20_t%7d\left%28%20i%20\right%29%7ba_%7bij%7d%7d%7bb_j%7d\left%28%20%7b%7bo_%7bt%20+%201%7d%7d%7d%20\right%29%7b\beta%20_%7bt%20+%201%7d%7d\left%28%20j%20\right%29%7d%20%7d%20%7d%7d\end%7barray%7d)
令
则关于模型参数的一种估计方法为
\\ \overline%20%7b%7ba_%7bij%7d%7d%7d%20%20=%20%7b%7b\sum\limits_%7bt%20=%201%7d%7bT%20-%201%7d%20%7b%7b\xi%20_t%7d\left%28%20%7bi,j%7d%20\right%29%7d%20%7d%20\mathord%7b\left/%20%7b\vphantom%20%7b%7b\sum\limits_%7bt%20=%201%7d%7bT%20-%201%7d%20%7b%7b\xi%20_t%7d\left%28%20%7bi,j%7d%20\right%29%7d%20%7d%20%7b\sum\limits_%7bt%20=%201%7d%7bT%20-%201%7d%20%7b%7b\gamma%20_t%7d\left%28%20i%20\right%29%7d%20%7d%7d%7d%20\right.%20\kern-\nulldelimiterspace%7d%20%7b\sum\limits_%7bt%20=%201%7d%7bT%20-%201%7d%20%7b%7b\gamma%20_t%7d\left%28%20i%20\right%29%7d%20%7d%7d\ \overline%20%7b%7bb_j%7d%7d%20\left%28%20k%20\right%29%20=%20%7b%7b\sum\limits_%7bt%20=%201%7dT%20%7b\left%7b%20%7b%7b\gamma%20_t%7d\left%28%20j%20\right%29%7d%20\right%7d\left|%20%7b_%7b%7bo_t%7d%20=%20%7bv_k%7d%7d%7d%20\right.%7d%20%7d%20\mathord%7b\left/%20%7b\vphantom%20%7b%7b\sum\limits_%7bt%20=%201%7dT%20%7b\left%7b%20%7b%7b\gamma%20_t%7d\left%28%20j%20\right%29%7d%20\right%7d\left|%20%7b_%7b%7bo_t%7d%20=%20%7bv_k%7d%7d%7d%20\right.%7d%20%7d%20%7b\sum\limits_%7bt%20=%201%7dT%20%7b%7b\gamma%20_t%7d\left%28%20j%20\right%29%7d%20%7d%7d%7d%20\right.%20\kern-\nulldelimiterspace%7d%20%7b\sum\limits_%7bt%20=%201%7dT%20%7b%7b\gamma%20_t%7d\left%28%20j%20\right%29%7d%20%7d%7d\end%7barray%7d)
欢迎参与讨论并关注本博客和微博以及知乎个人主页后续内容继续更新哦~
转载请您尊重作者的劳动,完整保留上述文字以及文章链接,谢谢您的支持!
