一句话描述:状态空间中经过从一个状态到另一个状态的转换的随机过程。该过程要求具备无记忆的性质:下一状态的概率分布只能由当前状态决定,在时间序列中它前面的事件均与之无关。
也就是说,马尔可夫链是一个随机系统,它必须满足两个条件:
在马尔可夫链的每一步,系统根据概率分布,可以从一个状态变到另一个状态,也可以保持当前状态。状态的改变叫做转移,与不同的状态改变相关的概率叫做转移概率。随机漫步就是马尔可夫链的例子。随机漫步中每一步的状态是在图形中的点,每一步可以移动到任何一个相邻的点,在这里移动到每一个点的概率都是相同的(无论之前漫步路径是如何的)
以下是随机漫步程序的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)
运行结果如下:
那么,如何用数学语言来描述马尔可夫链呢?
X ( n ) = ( x 1 ( n ) x 2 ( n ) … x k ( n ) ) X^{(n)}=\left(\begin{array}{llll} {x_{1}^{(n)}} & {x_{2}^{(n)}} & {\dots} & {x_{k}^{(n)}} \end{array}\right) X(n)=(x1(n)x2(n)…xk(n))
P = ( p 11 p 12 … p 1 k p 21 p 22 … p 2 k ⋮ ⋮ ⋮ p k 1 p k 2 … p k k ) P=\left(\begin{array}{cccc} {p_{11}} & {p_{12}} & {\dots} & {p_{1 k}} \\ {p_{21}} & {p_{22}} & {\dots} & {p_{2 k}} \\ {\vdots} & {\vdots} & {} & {\vdots} \\ {p_{k 1}} & {p_{k 2}} & {\dots} & {p_{k k}} \end{array}\right) P=⎝⎜⎜⎜⎛p11p21⋮pk1p12p22⋮pk2………p1kp2k⋮pkk⎠⎟⎟⎟⎞
根据无后效性,我们可以得出:
X ( n + 1 ) = X ( n ) P X^{(n+1)}=X^{(n)} P X(n+1)=X(n)P
从而
X ( n + 1 ) = X ( 0 ) P n X^{(n+1)}= X^{(0)}P^{n} X(n+1)=X(0)Pn
由于某一时刻状态转移的情况只依赖前一个状态,那么只要求出系统中任意两个状态之间的转移概率,这个马尔科夫链的模型就确定了。接下来我们可以看一个具体的例子。
有一个大的汽车租赁公司,有三家门店,你租的时候可以选择任何一个门店,还的时候也可以选择任何一家门店, 从不同门店借出和归还的概率如下:
归还 | 1 | 2 | 3 | |
---|---|---|---|---|
借出 | ||||
1 | 0.5 | 0.2 | 0.3 | |
2 | 0.3 | 0.1 | 0.6 | |
3 | 0.3 | 0.6 | 0.1 |
可以写出转移矩阵为
P = ( 0.5 0.2 0.3 0.3 0.1 0.6 0.3 0.6 0.1 ) P=\left(\begin{array}{ccc} {0.5} & {0.2} & {0.3} \\ {0.3} & {0.1} & {0.6} \\ {0.3} & {0.6} & {0.1} \end{array}\right) P=⎝⎛0.50.30.30.20.10.60.30.60.1⎠⎞
那么这个借还车的模型已经确定。
接下来我们用这一模型进行简单的预测。已知一辆车位于2号门店,三次借还以后,这辆车最可能在哪个门店呢?转移矩阵我们可以很快地求解。
设初始状态向量为
X ( 0 ) = ( 0 , 1 , 0 ) X^{(0)}=(0, 1 ,0) X(0)=(0,1,0)
可以很快地求出
X ( 1 ) = X ( 0 ) P = ( 0.3 , 0.1 , 0.6 ) X ( 2 ) = X ( 1 ) P = ( 0.36 , 0.43 , 0.21 ) X ( 3 ) = X ( 2 ) P = ( 0.372 , 0.241 , 0.387 ) X^{(1)}=X^{(0)} P=(0.3,0.1,0.6)\\ X^{(2)}=X^{(1)} P=(0.36,0.43,0.21)\\ X^{(3)}=X^{(2)} P=(0.372,0.241,0.387) X(1)=X(0)P=(0.3,0.1,0.6)X(2)=X(1)P=(0.36,0.43,0.21)X(3)=X(2)P=(0.372,0.241,0.387)
故三次借还后这辆车最可能在三号门店。
接下来我们研究多次借还后的情况。
用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增大,状态向量趋近于
X ( n ) = ( 0.375 , 0.3 , 0.325 ) X^{(n)}=(0.375, 0.3 ,0.325) X(n)=(0.375,0.3,0.325)
同时我们可以研究转移矩阵的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]]
即转移矩阵的每一行都趋向于 [ 0.375 , 0.3 , 0.325 ] [0.375,0.3,0.325] [0.375,0.3,0.325]
这种情况我们就称为马尔科夫链收敛。
首先,马尔科夫链要能收敛,需要满足以下条件:
1.可能的状态数有限。
2.状态间的转移概率固定不变。
3.能从任意状态转变到任意状态。
4.不能是简单的循环,例如从x到y再从y到x。
以上是马尔可夫链收敛的必要条件。
由前面的例子我们不难看出,由于 X ( 0 ) X^{( 0 )} X(0)的每个元素的取值范围为[0,1],并且所有元素的和为1,当 X ( 0 ) X^{( 0 )} X(0)与 P n P^{n} Pn相乘后,得到的向量一定会收敛到一个稳定值,且这个稳定值与初始 X ( 0 ) X^{( 0 )} X(0)无关。
接下来,我们给出此现象中转移矩阵满足的条件。
细致平衡条件(Detailed-Balance Condition):给定一个马尔可夫链,分布 π \pi π和概率转移矩阵 P P P,如果下面等式成立:
π i P i j = π j P j i \pi_{i} P_{i j}=\pi_{j} P_{j i} πiPij=πjPji
则此马尔可夫链具有一个平稳分布(Stationary Distribution)。
在物理学和化学中,马尔可夫链和马尔可夫过程被用于对动力系统进行建模,形成了马尔可夫动力学(Markov dynamics)。 在排队论(queueing theory)中,马尔可夫链是排队过程的基本模型 。在信号处理方面,马尔可夫链是一些序列数据压缩算法,例如Ziv-Lempel编码的数学模型 ,在金融领域,马尔可夫链模型被用于预测企业产品的市场占有率