1. 马尔科夫链概述
马尔科夫链定义本身比较简单,它假设某一时刻状态转移的概率只依赖于它的前一个状态。举个形象的比喻,假如每天的天气是一个状态的话,那个今天是不是晴天只依赖于昨天的天气,而和前天的天气没有任何关系。当然这么说可能有些武断,但是这样做可以大大简化模型的复杂度,因此马尔科夫链在很多时间序列模型中得到广泛的应用,比如循环神经网络RNN,隐式马尔科夫模型HMM等,当然MCMC也需要它。
如果用精确的数学定义来描述,则假设我们的序列状态是...Xt−2,Xt−1,Xt,Xt+1,......Xt−2,Xt−1,Xt,Xt+1,...,那么我们的在时刻Xt+1Xt+1的状态的条件概率仅仅依赖于时刻XtXt,即:
P(Xt+1|...Xt−2,Xt−1,Xt)=P(Xt+1|Xt)P(Xt+1|...Xt−2,Xt−1,Xt)=P(Xt+1|Xt)
既然某一时刻状态转移的概率只依赖于它的前一个状态,那么我们只要能求出系统中任意两个状态之间的转换概率,这个马尔科夫链的模型就定了。我们来看看下图这个马尔科夫链模型的具体的例子。
这个马尔科夫链是表示股市模型的,共有三种状态:牛市(Bull market), 熊市(Bear market)和横盘(Stagnant market)。每一个状态都以一定的概率转化到下一个状态。比如,牛市以0.025的概率转化到横盘的状态。这个状态概率转化图可以以矩阵的形式表示。如果我们定义矩阵阵PP某一位置P(i,j)P(i,j)的值为P(j|i)P(j|i),即从状态i转化到状态j的概率,并定义牛市为状态0, 熊市为状态1, 横盘为状态2. 这样我们得到了马尔科夫链模型的状态转移矩阵为:
讲了这么多,那么马尔科夫链模型的状态转移矩阵和我们蒙特卡罗方法需要的概率分布样本集有什么关系呢?这需要从马尔科夫链模型的状态转移矩阵的性质讲起。
2. 马尔科夫链模型状态转移矩阵的性质
得到了马尔科夫链模型的状态转移矩阵,我们来看看马尔科夫链模型的状态转移矩阵的性质。
仍然以上面的这个状态转移矩阵为例。假设我们当前股市的概率分布为:[0.3,0.4,0.3],即30%概率的牛市,40%概率的熊盘与30%的横盘。然后这个状态作为序列概率分布的初始状态t0t0,将其带入这个状态转移矩阵计算t1,t2,t3...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
运行结果:
3. 计算细节剖析:
关于代码的第五行 vector1 = vector1*matrix即我们要得到的结果进行计算。
vertor = ([[0.3,0.4,0.3]],matrix = [[0.9,0.075,0.025],[0.15,0.8,0.05],[0.25,0.25,0.5]],很明显这是一个1x3的矩阵乘3x3的矩阵,应该得到3x3矩阵,那么根据矩阵的乘法法则,第一次相乘的结果为:
可以看到与运行结果中的current round 1结果一致,重复vector1*matrix并输出vertor,观察后发现在某一次运算的时候,得到的结果不发生变化。
这是一个非常好的性质,也就是说,如果我们得到了这个稳定概率分布对应的马尔科夫链模型的状态转移矩阵,则我们可以用任意的概率分布样本开始,带入马尔科夫链模型的状态转移矩阵,这样经过一些序列的转换,最终就可以得到符合对应稳定概率分布的样本。
这个性质不光对我们上面的状态转移矩阵有效,对于绝大多数的其他的马尔科夫链模型的状态转移矩阵也有效。同时不光是离散状态,连续状态时也成立。
而且需要注意的是当我们更改vertor的初始矩阵就会发现,最后得到的结果竟然不发生变化。
例如我们将vertor的初始值改成(0.1,0.7,0.2)然后运行代码,可以看到:
最后的结果依然是(0.625,0.3125,0.0625)