马尔科夫模型
示例
天气变化种类:晴天,多云,雷雨,状态之间可以发生转换,昨天和今天转换的情况
今天能得到明天的情况,明天能得到后天的情况
这里我们就定义好了一个一阶马尔科夫
模型:
状态:晴天,多云,雷雨
状态转换概率:三种天气状态间的转换概率
初始概率:晴天
第n天的天气只和 第n-1天有关
计算今天(t=1)的天气状况:
今天为晴天的概率=初始晴天概率X晴天转晴天概率 + 初始多云概率X多云转晴天概率 + 初始雷雨概率X雷雨转晴天概率
隐马尔科夫
示例:游戏难度加大了
我们漂到了一个岛上,这里没有天气预报,只有一片片的海藻。
这些海藻状态能观察到四种状态:Dry, Dryish, Damp, Soggy,海藻的状态跟天气的变换有一定的关系。
既然海藻是能看到的,那它就是观察状态
,天气信息看不到就是隐藏状态
。 观察状态 和 隐藏状态 并不是一一对应的。
隐马尔科夫:通过 观察状态 求解 隐藏状态。
Z:隐藏状态,X:观察状态
当前的隐藏状态只和前一状态有关:
P
(
Z
t
∣
Z
t
−
1
,
x
t
−
1
,
Z
t
−
2
,
x
t
−
2
,
.
.
.
,
Z
1
,
x
1
,
)
=
P
(
Z
t
∣
Z
t
−
1
)
P(Z_t | Z_{t-1}, x_{t-1}, Z_{t-2}, x_{t-2}, ..., Z_{1}, x_{1}, ) = P(Z_t | Z_{t-1})
P(Zt∣Zt−1,xt−1,Zt−2,xt−2,...,Z1,x1,)=P(Zt∣Zt−1)
某个观察状态只和生成它的状态有关:
P
(
x
t
∣
Z
t
,
x
t
,
Z
t
−
1
,
x
t
−
1
,
Z
t
−
2
,
x
t
−
2
,
.
.
.
,
Z
1
,
x
1
,
)
=
P
(
x
t
∣
Z
t
)
P(x_t | Z_t, x_t, Z_{t-1}, x_{t-1}, Z_{t-2}, x_{t-2}, ..., Z_{1}, x_{1}, ) = P(x_t | Z_{t})
P(xt∣Zt,xt,Zt−1,xt−1,Zt−2,xt−2,...,Z1,x1,)=P(xt∣Zt)
隐马尔科夫模型的组成
三个必备:初始概率(π),隐藏状态转移 概率矩阵(A),生成 观测状态 概率矩阵(B)。
H
M
M
=
(
π
,
A
,
B
)
HMM = (\pi, A, B)
HMM=(π,A,B)
要解决的问题:
模型为 λ = ( A , B , π ) \lambda = (A, B, \pi) λ=(A,B,π)
- 给定模型 ( A , B , π ) (A, B, \pi) (A,B,π) 及 观测序列 O = o 1 , o 2 , . . . , o t O = {o_1, o_2,..., o_t} O=o1,o2,...,ot 计算其出现的概率 P ( O ∣ l a m b d a ) P(O | \ lambda) P(O∣ lambda);
- 给定观测序列 O = o 1 , o 2 , . . . , o t O = {o_1, o_2,..., o_t} O=o1,o2,...,ot,求解参数 ( A , B , π ) (A, B, \pi) (A,B,π) 使得 P ( O ∣ l a m b d a ) P(O | \ lambda) P(O∣ lambda) 最大;
- 已知模型 ( A , B , π ) (A, B, \pi) (A,B,π) 和观测序列 O = o 1 , o 2 , . . . , o t O = {o_1, o_2,..., o_t} O=o1,o2,...,ot,求状态序列,使得 P ( O ∣ l a m b d a ) P(O | \ lambda) P(O∣ lambda) 最大。
暴力求解
我们要求的是在给定模型下观测序列出现的概率,那如果我能把 所有的隐藏序列都给列出来,也就可以知道联合概率分布
P
(
O
∣
l
a
m
b
d
a
)
P(O | \ lambda)
P(O∣ lambda)
求观察序列的概率
前向算法
示例
有3个盒子,每个盒子都有红色和白色两种球,分别为:
盒子1: 5红5白
盒子2: 4红6白
盒子3: 7红3白
A 选几号盒子;A[0][0] = 0.5,前一次选一号盒子,第二次还选1号 的概率为 0.5;
B 盒子里球的颜色概率;B[0][0] = 0.5,一号盒子里红色球的概率为 0.5;
得到的观测序列: O = {红,白,红}
观测状态集合: V = {红,白},M = 2
隐藏状态集合: Q = {盒子1, 盒子2, 盒子3},N = 3
α ( 1 ) \alpha(1) α(1) 表示 上述在三个盒子,下一次还拿 盒子1 的概率,乘以 盒子1 里拿到红球的概率;以此类推。
求解参数
Baum-Welch 算法
给定观测序列 O = o 1 , o 2 , . . . , o t O = {o_1, o_2,..., o_t} O=o1,o2,...,ot,求解参数 ( A , B , π ) (A, B, \pi) (A,B,π) 使得 P ( O ∣ l a m b d a ) P(O | \ lambda) P(O∣ lambda) 最大;
这回我们就要估计模型参数,但是由于状态序列未知,相当于是一个含有隐变量
的参数估计问题,这就需要EM算法了。
Q函数是完全数据的对数似然函数 关于给定模型参数和观测变量的前提下 对隐变量的条件概率分布的期望,接下来只需要对它进行极大化。
维特比算法
https://www.zhihu.com/question/20136144
HMM 代码
http://hmmlearn.readthedocs.io/en/latest/
import numpy as np
from hmmlearn import hmm
#
# 隐藏状态:3个盒子
states = ["box 1", "box 2", "box3"]
n_states = len(states)
# 观测状态:2种球
observations = ["red", "white"]
n_observations = len(observations)
模型参数
start_probability = np.array([0.2, 0.4, 0.4])
transition_probability = np.array([
[0.5, 0.2, 0.3],
[0.3, 0.5, 0.2],
[0.2, 0.3, 0.5]
])
emission_probability = np.array([
[0.5, 0.5],
[0.4, 0.6],
[0.7, 0.3]
])
#用于离散观测状态
model = hmm.MultinomialHMM(n_components=n_states)
model.startprob_=start_probability
model.transmat_=transition_probability
model.emissionprob_=emission_probability
维特比算法,看到的是[0,1,0]
seen = np.array([[0,1,0]]).T
logprob, box = model.decode(seen, algorithm="viterbi")
# 得到的结果跟我们算的是一样的
print (np.array(states)[box]) # ['box3' 'box3' 'box3']
predict也可以
box2 = model.predict(seen)
print (np.array(states)[box2]) # ['box3' 'box3' 'box3']
得到观测序列的概率 ln0.13022≈−2.0385
print (model.score(seen)) # -2.03854530992
EM算法求解模型参数
tol : 停机阈值
n_iter : 最大迭代次数
n_components : 隐藏状态数目
model2 = hmm.MultinomialHMM(n_components=n_states, n_iter=20, tol=0.01)
X2 = np.array([[0,1,0,1],[0,0,0,1],[1,0,1,1]])
model2.fit(X2)
print ('startprob_',model2.startprob_)
print ('-----------------------------------------')
print ('transmat_',model2.transmat_)
print ('-----------------------------------------')
print ('emissionprob_',model2.emissionprob_)
print ('-----------------------------------------')
print ('score',model2.score(X2))
startprob_ [ 1.00830546e-21 9.99155974e-01 8.44026026e-04]
-----------------------------------------
transmat_ [[ 3.54305307e-01 4.25087407e-01 2.20607286e-01]
[ 9.66579437e-01 1.41083293e-04 3.32794799e-02]
[ 4.18739654e-01 1.17370397e-01 4.63889949e-01]]
-----------------------------------------
emissionprob_ [[ 0.10352942 0.89647058]
[ 0.99860862 0.00139138]
[ 0.80494989 0.19505011]]
-----------------------------------------
score -6.69039955756