什么是马尔可夫链
一句话描述:状态空间中经过从一个状态到另一个状态的转换的随机过程。该过程要求具备无记忆的性质:下一状态的概率分布只能由当前状态决定,在时间序列中它前面的事件均与之无关。
也就是说,马尔可夫链是一个随机系统,它必须满足两个条件:
- 系统任意时刻可以用有限个可能状态之一来描述
- 系统无后效性,即某阶段的状态一旦确定,则此后过程的演变不再受此前各种状态及决策的影响
在马尔可夫链的每一步,系统根据概率分布,可以从一个状态变到另一个状态,也可以保持当前状态。状态的改变叫做转移,与不同的状态改变相关的概率叫做转移概率。随机漫步就是马尔可夫链的例子。随机漫步中每一步的状态是在图形中的点,每一步可以移动到任何一个相邻的点,在这里移动到每一个点的概率都是相同的(无论之前漫步路径是如何的)
以下是随机漫步程序的python语言实现:
from random import choice
import matplotlib.pyplot as plt
class RandomWork():
def __init__(self,num_points=5000):
self.num_points=num_points
self.x_values=[0]
self.y_values=[0]
def fill_walk(self):
while len(self.x_values)<self.num_points:
x_direction=choice([1,-1])
x_distance=choice([0,1,2,3,4])
x_step=x_direction*x_distance
y_direction=choice([1,-1])
y_distance=choice([1,2,3,4])
y_step=y_direction*y_distance
next_x=self.x_values[-1]+x_step
next_y=self.y_values[-1]+y_step
self.x_values.append(next_x)
self.y_values.append(next_y)
rw=RandomWork()
rw.fill_walk()
plt.plot(rw.x_values,rw.y_values)
运行结果如下:
那么,如何用数学语言来描述马尔可夫链呢?
数学表达
状态向量
- 概率向量的每个元素都是概率,并且元素之和为1。
- 系统的可能状态数有k个。
- 向量中各个元素分别表示表示第n次观测时第i个状态的概率
被称为初始状态
转移概率矩阵
表示这次观测前状态为i,现在观测是状态为j的概率
- P矩阵元素非负
- 每一行的元素之和都为1
根据无后效性,我们可以得出:
从而
由于某一时刻状态转移的情况只依赖前一个状态,那么只要求出系统中任意两个状态之间的转移概率,这个马尔科夫链的模型就确定了。接下来我们可以看一个具体的例子。
一个简单的模型
有一个大的汽车租赁公司,有三家门店,你租的时候可以选择任何一个门店,还的时候也可以选择任何一家门店, 从不同门店借出和归还的概率如下:
归还 | 1 | 2 | 3 | |
借出 | ||||
1 | 0.5 | 0.2 | 0.3 | |
2 | 0.3 | 0.1 | 0.6 | |
3 | 0.3 | 0.6 | 0.1 |
可以写出转移矩阵为
那么这个借还车的模型已经确定。
接下来我们用这一模型进行简单的预测。已知一辆车位于2号门店,三次借还以后,这辆车最可能在哪个门店呢?转移矩阵我们可以很快地求解。
设初始状态向量为
可以很快地求出
故三次借还后这辆车最可能在三号门店。
接下来我们研究多次借还后的情况。
马尔可夫链细致平稳条件
用python实现15次借还后的预测
import numpy as np
import random as rm
def markov():
init_array = np.array([0,1,0])
transfer_matrix = np.array([[0.5, 0.2, 0.3],
[0.3, 0.1, 0.6],
[0.3, 0.6, 0.1]])
restmp = init_array
for i in range(15):
res = np.dot(restmp, transfer_matrix)
print (i, "\t", res)
restmp = res
markov()
可以得到结果为
0 [0.3 0.1 0.6]
1 [0.36 0.43 0.21]
2 [0.372 0.241 0.387]
3 [0.3744 0.3307 0.2949]
4 [0.37488 0.28489 0.34023]
5 [0.374976 0.307603 0.317421]
6 [0.3749952 0.2962081 0.3287967]
7 [0.37499904 0.30189787 0.32310309]
8 [0.37499981 0.29905145 0.32594874]
9 [0.37499996 0.30047435 0.32452569]
10 [0.37499999 0.29976284 0.32523717]
11 [0.375 0.30011858 0.32488142]
12 [0.375 0.29994071 0.32505929]
13 [0.375 0.30002965 0.32497035]
14 [0.375 0.29998518 0.32501482]
我们发现,当n增大,状态向量趋近于
同时我们可以研究转移矩阵的n次幂
def matrixpower():
transfer_matrix = np.array([[0.5, 0.2, 0.3],
[0.3, 0.1, 0.6],
[0.3, 0.6, 0.1]])
restmp = transfer_matrix
for i in range(15):
res = np.dot(restmp, transfer_matrix)
print (i, "\t", res)
restmp = res
matrixpower()
得到的结果是
0 [[0.4 0.3 0.3 ]
[0.36 0.43 0.21]
[0.36 0.18 0.46]]
1 [[0.38 0.29 0.33 ]
[0.372 0.241 0.387]
[0.372 0.366 0.262]]
2 [[0.376 0.303 0.321 ]
[0.3744 0.3307 0.2949]
[0.3744 0.2682 0.3574]]
3 [[0.3752 0.2981 0.3267 ]
[0.37488 0.28489 0.34023]
[0.37488 0.31614 0.30898]]
4 [[0.37504 0.30087 0.32409 ]
[0.374976 0.307603 0.317421]
[0.374976 0.291978 0.333046]]
5 [[0.375008 0.299549 0.325443 ]
[0.3749952 0.2962081 0.3287967]
[0.3749952 0.3040206 0.3209842]]
6 [[0.3750016 0.3002223 0.3247761 ]
[0.37499904 0.30189787 0.32310309]
[0.37499904 0.29799162 0.32700934]]
7 [[0.37500032 0.29988821 0.32511147]
[0.37499981 0.29905145 0.32594874]
[0.37499981 0.30100457 0.32399562]]
8 [[0.37500006 0.30005577 0.32494417]
[0.37499996 0.30047435 0.32452569]
[0.37499996 0.29949779 0.32550225]]
9 [[0.37500001 0.29997209 0.3250279 ]
[0.37499999 0.29976284 0.32523717]
[0.37499999 0.30025112 0.32474889]]
10 [[0.375 0.30001395 0.32498605]
[0.375 0.30011858 0.32488142]
[0.375 0.29987444 0.32512556]]
11 [[0.375 0.29999302 0.32500698]
[0.375 0.29994071 0.32505929]
[0.375 0.30006278 0.32493722]]
12 [[0.375 0.30000349 0.32499651]
[0.375 0.30002965 0.32497035]
[0.375 0.29996861 0.32503139]]
13 [[0.375 0.29999826 0.32500174]
[0.375 0.29998518 0.32501482]
[0.375 0.30001569 0.32498431]]
14 [[0.375 0.30000087 0.32499913]
[0.375 0.30000741 0.32499259]
[0.375 0.29999215 0.32500785]]
即转移矩阵的每一行都趋向于
这种情况我们就称为马尔科夫链收敛。
首先,马尔科夫链要能收敛,需要满足以下条件:
1.可能的状态数有限。
2.状态间的转移概率固定不变。
3.能从任意状态转变到任意状态。
4.不能是简单的循环,例如从x到y再从y到x。
以上是马尔可夫链收敛的必要条件。
由前面的例子我们不难看出,由于的每个元素的取值范围为[0,1],并且所有元素的和为1,当
与
相乘后,得到的向量一定会收敛到一个稳定值,且这个稳定值与初始
无关。
接下来,我们给出此现象中转移矩阵满足的条件。
细致平衡条件(Detailed-Balance Condition):给定一个马尔可夫链,分布和概率转移矩阵
,如果下面等式成立:
则此马尔可夫链具有一个平稳分布(Stationary Distribution)。
马尔可夫链的应用
在物理学和化学中,马尔可夫链和马尔可夫过程被用于对动力系统进行建模,形成了马尔可夫动力学(Markov dynamics)。 在排队论(queueing theory)中,马尔可夫链是排队过程的基本模型 。在信号处理方面,马尔可夫链是一些序列数据压缩算法,例如Ziv-Lempel编码的数学模型 ,在金融领域,马尔可夫链模型被用于预测企业产品的市场占有率