一、马尔科夫性质和马尔科夫链
1. 马尔科夫性质
在概率论和统计学中,“马尔科夫性质” 是指一个随机过程没有状态记忆
的性质。它是以俄国数学家马尔科夫命名的。如果一个随机过程的未来状态
的条件概率分布只和当前状态有关而跟它之前发生的事件无关
(也就是说当前位置N+1的状态只和前一个位置N的状态有关),那么说这个随机过程具有马尔科夫性质。这样的一个随机过程也叫“马尔科夫过程”
。“马尔科夫假设” 是用来描述一个可能具有马尔科夫性质的模型,比如隐马尔科夫模型(https://en.wikipedia.org/wiki/Hidden_Markov_model)。
例子:如果一个袋子里有2个红球和1个绿球。昨天取出了1个球,今天也取出了1个球,明天将要取出1个球。所有的取出都是不放回的。如果已经知道今天取出的时红球,但是不知道昨天取出的是什么球。那么明天取出红球的概率是1/2。所有可能的情况如下:
另一方面,如果同时知道今天和昨天取出的是红球,那么明天肯定取出绿球。这种差异显示出明天取出的球的颜色不仅依赖于当前的值,同时依赖于过去的信息。很明显,这个随机过程不具有马尔科夫性质
。但是如果把“不放回”这个条件改为“放回”,那么这个随机过程就具有马尔科夫性质。
2. 马尔科夫链
马尔科夫链是一个具有离散状态空间或者一个离散索引集合的马尔科夫过程。马尔科夫链是最出名的一种马尔科夫过程。
马尔科夫链并没有一个精确定义。通常是在离散时间
或者连续时间上以及可数状态空间
上(不考虑时间性质)将马尔科夫过程定义为马尔科夫链。也有是在离散时间上以及可数状态空间(可数也就是离散)或连续状态空间上(不考虑状态空间)将马尔科夫过程定义为马尔科夫链。
马尔科夫链的精确数学定义如下:
设
{
X
n
,
n
=
1
,
2
,
.
.
.
}
\{X_n, n = 1,2,...\}
{Xn,n=1,2,...}是一个随机序列,状态空间E为有限或可列集,对于任意正整数m,n,若
i
,
j
,
i
k
∈
E
i,j,i_k\in E
i,j,ik∈E,有
P { X n + m = j ∣ X n = i , X n − 1 = i n − 1 , . . . , X 1 = i 1 } = P { X n + m = j ∣ X n = i } P\{X_{n+m}=j|X_n=i,X_{n-1}=i_{n-1},...,X_1=i_1\} = P\{X_{n+m}=j|X_n=i\} P{Xn+m=j∣Xn=i,Xn−1=in−1,...,X1=i1}=P{Xn+m=j∣Xn=i}
则称 { X n , n = 1 , 2 , . . . } \{X_n, n = 1,2,...\} {Xn,n=1,2,...}是一个马尔科夫链。
在马尔可夫链的每一步,系统根据概率分布,可以从一个状态变到另一个状态,也可以保持当前状态。状态的改变叫做转移
,与不同的状态改变相关的概率叫做转移概率
。
3. 状态转移矩阵
由于某一时刻状态转移的概率只依赖于它的前一个状态,那么我们求出系统中任意两个状态之间的转移概率,这个马尔科夫链的模型就确定下来了。看一个具体的例子:
这个马尔科夫链表示股市模型,共有三种状态:牛市(Bull market), 熊市(Bear market)和横盘(Stagnant market)。每一个状态都以一定的概率转化到下一个状态。比如,牛市以0.025的概率转化到横盘的状态。这个状态概率转化图可以以矩阵的形式表示。如果我们定义矩阵阵P某一位置A(i,j)的值表示状态i转化到状态j的概率,并定义牛市为状态0, 熊市为状态1, 横盘为状态2. 这样我们得到了马尔科夫链模型的状态转移矩阵
为:
P = ( 0.9 0.075 0.025 0.15 0.8 0.05 0.25 0.25 0.5 ) P=\left( \begin{array}{ccc} 0.9&0.075&0.025 \\ 0.15&0.8& 0.05 \\ 0.25&0.25&0.5 \end{array} \right) P=⎝⎛0.90.150.250.0750.80.250.0250.050.5⎠⎞
每一行和每一列的各个位置分别表示0,1,2的状态。因为每一行的概率和也都为1
。
以上面的这个状态转移矩阵为例。假设我们当前股市的概率分布为:[0.3,0.4,0.3],即30%概率的牛市,40%概率的熊盘与30%的横盘。然后这个状态作为序列概率分布的初始状态t0,将其带入这个状态转移矩阵计算t1,t2,t3…的状态。代码如下:
import numpy as np
matrix = np.matrix([[0.9,0.075,0.025],[0.15,0.8,0.05],[0.25,0.25,0.5]], dtype=float)
vector1 = np.matrix([[0.3,0.4,0.3]], dtype=float)
for i in range(100):
vector1 = vector1*matrix
print("Current round:" , i+1)
print(vector1)
部分输出结果如下:
Current round: 1
[[ 0.405 0.4175 0.1775]]
Current round: 2
[[ 0.4715 0.40875 0.11975]]
......
Current round: 59
[[ 0.62499999 0.3125 0.0625]]
Current round: 60
[[ 0.625 0.3125 0.0625]]
......
Current round: 99
[[ 0.625 0.3125 0.0625]]
Current round: 100
[[ 0.625 0.3125 0.0625]]
可以发现,从第60轮开始,我们的状态概率分布就不变了,一直保持在[0.625 0.3125 0.0625],即62.5%的牛市,31.25%的熊市与6.25%的横盘。那么这个是巧合吗?
我们现在换一个初始概率分布试一试,现在我们用[0.7,0.1,0.2]作为初始概率分布,然后这个状态作为序列概率分布的初始状态t0,将其带入这个状态转移矩阵计算t1,t2,t3…的状态。部分输出结果如下:
Current round: 1
[[ 0.695 0.1825 0.1225]]
Current round: 2
[[ 0.6835 0.22875 0.08775]]
......
Current round: 56
[[ 0.62500001 0.31249999 0.0625 ]]
Current round: 57
[[ 0.625 0.3125 0.0625]]
......
Current round: 99
[[ 0.625 0.3125 0.0625]]
Current round: 100
[[ 0.625 0.3125 0.0625]]
可以看出,尽管这次我们采用了不同初始概率分布,最终状态的概率分布趋于同一个稳定的概率分布[0.625 0.3125 0.0625], 也就是说我们的马尔科夫链模型的状态转移矩阵收敛到的稳定概率分布与我们的初始状态概率分布无关
。这就是马尔科夫链的收敛性质
。这是一个非常好的性质,也就是说,如果我们得到了这个稳定概率分布对应的马尔科夫链模型的状态转移矩阵,则我们可以用任意的概率分布样本开始,带入马尔科夫链模型的状态转移矩阵,这样经过一些序列的转换,最终就可以得到符合对应稳定概率分布的样本。
这个性质不光对我们上面的状态转移矩阵有效,对于绝大多数的其他的马尔科夫链模型的状态转移矩阵也有效。同时不光是离散状态,连续状态时也成立。
同时,对于一个确定的状态转移矩阵P,它的n次幂 P n P^n Pn在当n大于一定的值的时候也可以发现是确定的,我们还是以上面的例子为例,计算代码如下:
matrix = np.matrix([[0.9,0.075,0.025],[0.15,0.8,0.05],[0.25,0.25,0.5]], dtype=float)
for i in range(10):
matrix = matrix*matrix
print("Current round:" , i+1)
print(matrix)
输出结果如下:
Current round: 1
[[ 0.8275 0.13375 0.03875]
[ 0.2675 0.66375 0.06875]
[ 0.3875 0.34375 0.26875]]
Current round: 2
[[ 0.73555 0.212775 0.051675]
[ 0.42555 0.499975 0.074475]
[ 0.51675 0.372375 0.110875]]
......
Current round: 6
[[ 0.625 0.3125 0.0625]
[ 0.625 0.3125 0.0625]
[ 0.625 0.3125 0.0625]]
Current round: 7
[[ 0.625 0.3125 0.0625]
[ 0.625 0.3125 0.0625]
[ 0.625 0.3125 0.0625]]
......
Current round: 9
[[ 0.625 0.3125 0.0625]
[ 0.625 0.3125 0.0625]
[ 0.625 0.3125 0.0625]]
Current round: 10
[[ 0.625 0.3125 0.0625]
[ 0.625 0.3125 0.0625]
[ 0.625 0.3125 0.0625]]
我们可以发现,在n≥6以后,
P
n
P^n
Pn的值稳定不再变化,而且每一行都为[0.625 0.3125 0.0625]
,这和我们前面的稳定分布是一致的。这个性质同样不光是离散状态,连续状态时也成立。
用数学语言总结下马尔科夫链的收敛性质:如果一个非周期的马尔科夫链
有状态转移矩阵P
, 并且它的任何两个状态是连通的,那么
lim
n
→
∞
P
i
j
n
\lim_{n \to \infty}P_{ij}^n
limn→∞Pijn 与i无关,我们有:
(1) lim n → ∞ P i j n = π ( j ) \lim_{n \to \infty}P_{ij}^n = \pi(j) limn→∞Pijn=π(j)
(2) lim n → ∞ P n = ( π ( 1 ) π ( 2 ) … π ( j ) … π ( 1 ) π ( 2 ) … π ( j ) … … … … … … π ( 1 ) π ( 2 ) … π ( j ) … … … … … … ) \lim_{n \to \infty}P^n = \left( \begin{array}{ccc} \pi(1)&\pi(2)&\ldots&\pi(j)&\ldots \\ \pi(1)&\pi(2)&\ldots&\pi(j)&\ldots \\ \ldots&\ldots&\ldots&\ldots&\ldots \\ \pi(1)&\pi(2)&\ldots&\pi(j)&\ldots \\ \ldots&\ldots&\ldots&\ldots&\ldots \end{array} \right) limn→∞Pn=⎝⎜⎜⎜⎜⎛π(1)π(1)…π(1)…π(2)π(2)…π(2)………………π(j)π(j)…π(j)………………⎠⎟⎟⎟⎟⎞
(3) π ( j ) = ∑ i = 0 ∞ π ( i ) P i j \pi(j) = \sum\limits_{i=0}^{\infty}\pi(i)P_{ij} π(j)=i=0∑∞π(i)Pij
(4) π = [ π ( 1 ) , π ( 2 ) , . . . , π ( j ) , . . . ] ∑ i = 0 ∞ π ( i ) = 1 \pi = [\pi(1),\pi(2),...,\pi(j),...]\;\; \sum\limits_{i=0}^{\infty}\pi(i) = 1 π=[π(1),π(2),...,π(j),...]i=0∑∞π(i)=1
上面的性质中需要解释的有:
(1)非周期的马尔科夫链:这个主要是指马尔科夫链的状态转化不是循环的
,如果是循环的则永远不会收敛
。幸运的是我们遇到的马尔科夫链一般都是非周期性的。用数学方式表述则是:对于任意某一状态i,d为集合
{
n
∣
n
≥
1
,
P
i
i
n
>
0
}
\{n \mid n \geq 1,P_{ii}^n>0 \}
{n∣n≥1,Piin>0} 的最大公约数,如果 d=1 ,则该状态为非周期的
(2)任何两个状态是连通的:这个指的是从任意一个状态可以通过有限步到达其他的任意一个状态,不会出现条件概率一直为0导致不可达的情况。
(3)马尔科夫链的状态数可以是有限的,也可以是无限的。因此可以用于连续概率分布和离散概率分布。
(4)
π
(
j
)
\pi(j)
π(j)通常称为马尔科夫链的平稳分布
。
三、隐马尔科夫模型
HMM属于生成模型,用来描述一个含有隐含未知参数的马尔可夫过程
,在正常的马尔可夫模型中,状态对于观察者来说是直接可见的。这样状态的转换概率便是全部的参数。而在隐马尔可夫模型中,状态并不是直接可见的,但受状态影响的某些变量则是可见的。每一个状态在可能输出的符号上都有一概率分布。因此输出符号的序列能够透露出状态序列的一些信息。
使用HMM模型时我们的问题一般有这两个特征:
- 我们的问题是基于序列的,比如时间序列,或者状态序列。
- 我们的问题中有两类数据,一类序列数据是可以观测到的,即
观测序列
;而另一类数据是不能观察到的,即隐藏状态序列
,简称状态序列
。
1. HMM模型做了两个很重要的假设如下:
(1) 齐次马尔科夫链假设。
即任意时刻的隐藏状态只依赖于它前一个隐藏状态
。当然这样假设有点极端,因为很多时候我们的某一个隐藏状态不仅仅只依赖于前一个隐藏状态,可能是前两个或者是前三个。但是这样假设的好处就是模型简单,便于求解。如果在时刻t的隐藏状态是
i
t
=
q
i
i_t=q_i
it=qi,然后在时刻t+1的隐藏状态是
i
t
+
1
=
q
j
i_{t+1}=q_j
it+1=qj, 则从时刻t到时刻t+1的HMM状态转移概率
a
i
j
a_{ij}
aij可以表示为:
a
i
j
=
P
(
i
t
+
1
=
q
j
∣
i
t
=
q
i
)
a_{ij} = P(i_{t+1} = q_j | i_t= q_i)
aij=P(it+1=qj∣it=qi)。这样
a
i
j
a_{ij}
aij可以组成马尔科夫链的(隐藏)状态转移矩阵
:
A
=
[
a
i
j
]
N
×
N
A=\Big [a_{ij}\Big ]_{N \times N}
A=[aij]N×N
(2) 观测独立性假设。
即任意时刻的观察状态只仅仅依赖于当前时刻的隐藏状态
,这也是一个为了简化模型的假设。如果在时刻t的隐藏状态是
i
t
=
q
j
i_t=q_j
it=qj, 而对应的观察状态为
o
t
=
v
k
o_t = v_k
ot=vk, 则该时刻观察状态
v
k
v_k
vk在隐藏状态
q
j
q_j
qj下生成的概率为
b
j
(
k
)
b_j(k)
bj(k),满足:
b
j
(
k
)
=
P
(
o
t
=
v
k
∣
i
t
=
q
j
)
b_j(k) = P(o_t = v_k | i_t= q_j)
bj(k)=P(ot=vk∣it=qj)。这样
b
j
(
k
)
b_j(k)
bj(k)可以组成观测状态生成的概率矩阵
:
B
=
[
b
j
(
k
)
]
N
×
M
B = \Big [b_j(k) \Big ]_{N \times M}
B=[bj(k)]N×M
除此之外,我们需要一组在时刻t=1的隐藏状态概率分布
Π
:
Π
=
[
π
(
i
)
]
N
\Pi:\Pi = \Big [ \pi(i)\Big ]_N
Π:Π=[π(i)]N,其中
π
(
i
)
=
P
(
i
1
=
q
i
)
\pi(i) = P(i_1 = q_i)
π(i)=P(i1=qi)
一个HMM模型,可以由隐藏状态初始概率分布
Π
\Pi
Π, 状态转移概率矩阵
A和观测状态概率矩阵
B决定。
Π
\Pi
Π,A决定状态序列,B决定观测序列。因此,HMM模型可以由一个三元组
λ
\lambda
λ表示如下:
λ
=
(
A
,
B
,
Π
)
\lambda = (A, B, \Pi)
λ=(A,B,Π)
2. HMM 模型实例:
假设我们有3个盒子,每个盒子里都有红色和白色两种球,这三个盒子里球的数量分别是:
盒子 | 1 | 2 | 3 |
---|---|---|---|
红球数 | 5 | 4 | 7 |
白球数 | 5 | 6 | 3 |
按照下面的方法从盒子里抽球,开始的时候,从第一个盒子抽球的概率是0.2,从第二个盒子抽球的概率是0.4,从第三个盒子抽球的概率是0.4。以这个概率抽一次球后,将球放回。然后从当前盒子转移到下一个盒子进行抽球。
规则是:
- 如果当前抽球的盒子是第一个盒子,则以0.5的概率仍然留在第一个盒子继续抽球,以0.2的概率去第二个盒子抽球,以0.3的概率去第三个盒子抽球。
- 如果当前抽球的盒子是第二个盒子,则以0.5的概率仍然留在第二个盒子继续抽球,以0.3的概率去第一个盒子抽球,以0.2的概率去第三个盒子抽球。
- 如果当前抽球的盒子是第三个盒子,则以0.5的概率仍然留在第三个盒子继续抽球,以0.2的概率去第一个盒子抽球,以0.3的概率去第二个盒子抽球。
如此下去,直到重复三次,得到一个球的颜色的观测序列: O = { 红 , 白 , 红 } O=\{红,白,红\} O={红,白,红}。
注意在这个过程中,观察者只能看到球的颜色序列,却不能看到球是从哪个盒子里取出的
。所以球的颜色序列就是观测序列
,选择的盒子序列就是隐藏状态序列
。那么按照我们上一节HMM模型的定义,我们的观察集合是:
V
=
{
红
,
白
}
,
M
=
2
V=\{红,白\},M=2
V={红,白},M=2。我们的状态集合是:
Q
=
{
盒
子
1
,
盒
子
2
,
盒
子
3
}
,
N
=
3
Q =\{盒子1,盒子2,盒子3\}, N=3
Q={盒子1,盒子2,盒子3},N=3。而观察序列和状态序列的长度为3。
初始状态分布为: Π = ( 0.2 , 0.4 , 0.4 ) T \Pi = (0.2,0.4,0.4)^T Π=(0.2,0.4,0.4)T
状态转移概率分布矩阵为: A = ( 0.5 0.2 0.3 0.3 0.5 0.2 0.2 0.3 0.5 ) A = \left( \begin{array} {ccc} 0.5 & 0.2 & 0.3 \\ 0.3 & 0.5 & 0.2 \\ 0.2 & 0.3 &0.5 \end{array} \right) A=⎝⎛0.50.30.20.20.50.30.30.20.5⎠⎞
观测状态概率矩阵为: B = ( 0.5 0.5 0.4 0.6 0.7 0.3 ) B = \left( \begin{array} {ccc} 0.5 & 0.5 \\ 0.4 & 0.6 \\ 0.7 & 0.3 \end{array} \right) B=⎝⎛0.50.40.70.50.60.3⎠⎞。这里每行两个元素是两个因为观测集合的长度为2。且观测状态的概率和为1。 一共三行,表示观测序列长度为3。每个元素表示在该时刻,处于某隐藏状态下,生成该观测状态的概率。具体来说就是在确定了盒子的条件下,分别取出红球和白球的概率。
3. HMM观测序列的生成
从上一节的例子,我们也可以抽象出HMM观测序列生成的过程。
输入的是HMM的模型 λ = ( A , B , Π ) \lambda = (A, B, \Pi) λ=(A,B,Π),观测序列的长度T,输出是观测序列 O = { o 1 , o 2 , . . . o T } O =\{o_1,o_2,...o_T\} O={o1,o2,...oT}
生成的过程如下:
(1) 根据初始状态概率分布Π生成隐藏状态
i
1
i_1
i1;
(2) for t from 1 to T:
a. 按照隐藏状态
i
t
i_t
it 的观测状态分布
b
i
t
(
k
)
b_{i_t}(k)
bit(k) 生成观察状态
o
t
o_t
ot;
b. 按照隐藏状态
i
t
i_t
it 的状态转移概率分布
a
i
t
a_{i_t}
ait 产生隐藏状态
i
t
+
1
i_t+1
it+1;
(3) 所有的
o
t
o_t
ot 一起形成观测序列
O
=
{
o
1
,
o
2
,
.
.
.
o
T
}
O =\{o_1,o_2,...o_T\}
O={o1,o2,...oT}。
4. HMM模型的三个基本问题
HMM模型一共有三个经典的问题需要解决:
(1) 评估观察序列概率
。即给定模型
λ
=
(
A
,
B
,
Π
)
\lambda=(A,B,\Pi)
λ=(A,B,Π) 和观测序列
O
=
{
o
1
,
o
2
,
.
.
.
o
T
}
O =\{o_1,o_2,...o_T\}
O={o1,o2,...oT},计算在模型
λ
\lambda
λ 下观测序列
O
O
O 出现的概率
p
(
O
∣
λ
)
p(O|\lambda)
p(O∣λ)。这个问题的求解需要用到前向后向算法。这个问题是HMM模型三个问题中最简单的。
(2) 模型参数学习问题
。即给定观测序列
O
=
{
o
1
,
o
2
,
.
.
.
o
T
}
O =\{o_1,o_2,...o_T\}
O={o1,o2,...oT},估计模型
λ
=
(
A
,
B
,
Π
)
\lambda=(A,B,\Pi)
λ=(A,B,Π) 的参数,使该模型下观测序列的条件概率
p
(
O
∣
λ
)
p(O|\lambda)
p(O∣λ) 最大。这个问题的求解需要用到基于EM算法的鲍姆-韦尔奇算法。这个问题是HMM模型三个问题中最复杂的。
(3) 预测问题
,也称为解码问题。即给定模型
λ
=
(
A
,
B
,
Π
)
\lambda=(A,B,\Pi)
λ=(A,B,Π) 和观测序列
O
=
{
o
1
,
o
2
,
.
.
.
o
T
}
O =\{o_1,o_2,...o_T\}
O={o1,o2,...oT},求给定观测序列条件下,最可能出现的对应的隐藏状态序列,这个问题的求解需要用到基于动态规划的维特比算法。这个问题是HMM模型三个问题中复杂度居中的算法。
这三个详见下一篇:隐马尔科夫模型的三个基本问题
参考:
THE END.