1 什么叫马尔科夫链?
讲马尔可夫链不得不提到随机过程,它本身就是随机过程课本中的重要内容,犹如牛顿定律在力学中的地位。那何为随机过程呢?
我们知道,人类认知世界是从运动开始的,从宏观的天体运动到微观的分子运动,它都是一个“东西”随时间变化的过程,牛顿的出现,很好地体系化地解释了我们所熟悉的大部分运动,并赋能人类能够对一些运动进行准确计算并预测运动。但是世界上仍存在大量的非确定因素的“运动”过程,之所以给给运动加引号是因为这是个概性描述,比如经典掷色子,每一次掷色子都视为一次事物的变化,归为“运动”,即随时间事物产生的变化。我们都知道无穷大样本下1-6每个数字出现的概率都是1/6,但想知道每一次掷色子的结果,我们永远无法准确计算预知,我们能想到的最好办法,就是用:概率(论),来描述这个结果。犹如牛顿定律在力学中所扮演的进行力学分析的角色,随机过程就是在概率论中,对事物变化研究运动的方法,对不确定性下的运动进行准确的数学描述。如同力学中对速度,加速度等概念的数学定义,随机过程中也定义了两个最重要的概念:概率空间、随机变量,在此不深入聊。
牛顿力学中,是确定性过程研究一个量随时间确定的变化,而随机过程描述的是一个量随时间可能的变化。在这个过程里,每一个时刻变化的方向都是不确定的,随机过程就是由这一系列不确定的随机变量组成的。每一个时刻系统的状态都由一个随机变量表述,整个过程则构成一个随机过程的实现。
知道了什么是随机过程后,我们可以试想一个最简单的随机过程,这个过程由N步组成,每一步都有两个选择(0,1),那么可能的路径就有2的N次方个,这个随机过程就要由2^N这个指数级别个数的概率来描述,我们一看指数级别!?维度这么大岂不直接爆炸???此刻,马尔科夫过程(Markov Processes)被推了出来:随机过程的每一步的结果与且仅与上一步有关,与其它无关。
makov过程用数学语言表述就是马尔可夫链(Markov chain)。马尔科夫链条中,随机过程的变化只取决于当下的变化而非历史,这种性质使得巨大的计算瞬时简化。
2 马尔可夫链 (Markov Chain)的具体例子
我们用一个具体现实中的例子来描述Markov Chain这样一个过程。假设进进他每天有三个状态:玩耍,学习,睡觉(这就是状态分布)。已知他今天在玩儿,那他明天学习、玩耍、睡觉的概率是多少?后天乃至N天后学习、玩耍、睡觉的概率是多少?
当然,想要知道N天后学习、玩耍、睡觉的概率是多少,我们需要有两个条件:
一个预知条件:知道进进第一天的状态(状态分布矩阵S),
一个假设:即我状态的转移都是有规律的,也就是今天学习,明天就玩儿或者睡觉或者还是继续学习的概率是确定的,简而言之,我们有预知确定的状态转移概率矩阵P。
上面这个矩阵就是确定的转移概率矩阵P,它是时间齐次性的,换句话说,也就是转移概率矩阵P它是保持不变的,第一天到第二天的转移概率矩阵跟第二天到第三天的转移概率矩阵是一样的。
有了这个转移概率矩阵P,再加上已知的第一天的状态分布矩阵(进进第一天在 玩 or 学 or 睡的概率),就可以计算出进进第N天的状态分布了(进进第N天在 玩 or 学 or 睡的概率)。
ok,我们现在已经拥有了测算进进n天后,是在玩还是在学,还是在睡的所有条件了,也就是初始状态分布矩阵S和转移概率矩阵P。假设进进第一天的状态分布矩阵 S1 = [0.3, 0.4, 0.3],里面的数字分别代表第一天这天进进在玩的概率,学的概率,和睡的概率。
那么
第二天进进玩学睡的状态分布矩阵 S2 = S1 * P (俩矩阵相乘)。
第三天进进玩学睡的状态分布矩阵 S3 = S2 * P (只和S2有关)。
第四天进进玩学睡的状态分布矩阵 S4 = S3 * P (只和S3有关)。
…
第n天进进玩学睡的状态分布矩阵 Sn = Sn-1 * P (只和Sn-1有关)。
可以看到:马尔可夫链就是这样一个任性的过程,它将来的状态分布只取决于现在,跟过去无关!这就是马尔科夫过程(Markov Processes)的体现,每天的进进可能的状态集合就构成了马尔可夫链(Markov chain)。
3 马尔可夫链的性质
以上面的例子继续深入,上面的例子中,初始状态分布矩阵S1 = [0.3, 0.4, 0.3],即第一天进进在玩的概率是30%,在学的概率是40%,在睡觉的概率是30%,我们以此来计算100天后,也就是第一百天进进在玩or学or睡觉的概率分布。
代码如下:
import numpy as np
matrix = np.matrix([[0.05, 0.75, 0.2],
[0.8, 0.05, 0.15],
[0.25, 0.5, 0.25]])
vector1 = np.matrix([[0.3, 0.4, 0.3]])
for i in range(100):
vector1 = vector1 * matrix
print('第{}轮'.format(i+1))
print(vector1)
运行结果如下:
...
第96轮
[[0.39781591 0.41341654 0.18876755]]
第97轮
[[0.39781591 0.41341654 0.18876755]]
第98轮
[[0.39781591 0.41341654 0.18876755]]
第99轮
[[0.39781591 0.41341654 0.18876755]]
第100轮
[[0.39781591 0.41341654 0.18876755]]
从结果可以发现,已知一天初始状态和转移矩阵往后测算,当测算到某一天开始,往后的状态概率分布就不变了,一直保持[0.39781591, 0.41341654, 0.18876755]。这会不会是巧合?假如初始状态分布矩阵S1 不是 [0.3, 0.4, 0.3],结果还会是[0.39781591, 0.41341654, 0.18876755]吗?我们进行第二次试验,这次试验中,我们将始状态分布矩阵S1 = [0.2, 0.6, 0.2]。
代码如下:
import numpy as np
matrix = np.matrix([[0.05, 0.75, 0.2],
[0.8, 0.05, 0.15],
[0.25, 0.5, 0.25]])
vector1 = np.matrix([[0.2, 0.6, 0.2]])
for i in range(100):
vector1 = vector1 * matrix
print('第{}轮'.format(i+1))
print(vector1)
运行结果:
...
第96轮
[[0.39781591 0.41341654 0.18876755]]
第97轮
[[0.39781591 0.41341654 0.18876755]]
第98轮
[[0.39781591 0.41341654 0.18876755]]
第99轮
[[0.39781591 0.41341654 0.18876755]]
第100轮
[[0.39781591 0.41341654 0.18876755]]
奇妙的事情发生了!在不同的初始概率分布下,最终状态的概率分布趋于同一个稳定的概率分布 [0.39781591, 0.41341654, 0.18876755]。
由此我们得到一个非常重要的性质:马尔可夫链模型的状态转移矩阵收敛到的稳定概率分布与初始状态概率分布无关。也就是说,在上面的那个例子中的初试状态矩阵,可以用任意的概率分布样本开始,只要马尔可夫链模型的状态转移矩阵确知,在一定规模的转换之后,我们就可以得到符合对应稳定概率分布的样本。
现在我们可以用数学语言总结下马尔科夫链的收敛性质了:
如果一个非周期的马尔科夫链有状态转移矩阵P, 并且它的任何两个状态是连通的,那么与i无关,我们有:
- π是方程πP = P的唯一非负解,其中:
上面的性质中需要解释的有:
- 非周期的马尔科夫链:这个主要指马尔科夫链的状态转化不是循环的,如果是循环的则永远不会收敛。幸运的是我们遇到的马尔科夫链一般都是非周期性的。用数学方式表述则是:对于任意某一状态i,d为集合
- 任何两个状态是连通的:这个指的是从任意一个状态可以通过有限步到达其他的任意一个状态,不会出现条件概率一直为0导致不可达的情况。
- 马尔科夫链的状态数可以是有限的,也可以是无限的。因此可以用于连续概率分布和离散概率分布。
- 标签:状态,概率,Chain,0.41341654,入门教程,矩阵,0.39781591,Markov,0.18876755 From: https://blog.51cto.com/u_12853553/5896530