数学模型——初步理解马尔可夫链(Markov chain)

什么是马尔可夫链

一句话描述:状态空间中经过从一个状态到另一个状态的转换的随机过程。该过程要求具备无记忆的性质:下一状态的概率分布只能由当前状态决定,在时间序列中它前面的事件均与之无关。

也就是说,马尔可夫链是一个随机系统,它必须满足两个条件:

  • 系统任意时刻可以用有限个可能状态之一来描述
  • 系统无后效性,即某阶段的状态一旦确定,则此后过程的演变不再受此前各种状态及决策的影响

在马尔可夫链的每一步,系统根据概率分布,可以从一个状态变到另一个状态,也可以保持当前状态。状态的改变叫做转移,与不同的状态改变相关的概率叫做转移概率。随机漫步就是马尔可夫链的例子。随机漫步中每一步的状态是在图形中的点,每一步可以移动到任何一个相邻的点,在这里移动到每一个点的概率都是相同的(无论之前漫步路径是如何的)

以下是随机漫步程序的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))

  • 概率向量的每个元素都是概率,并且元素之和为1。
  • 系统的可能状态数有k个。
  • 向量中各个元素分别表示表示第n次观测时第i个状态的概率
  • X ( 0 ) X^{(0)} X(0)被称为初始状态

转移概率矩阵

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=p11p21pk1p12p22pk2p1kp2kpkk

  • p i j ( i , j = 1 , 2 , … , k ) p_{i j}(i, j=1,2, \dots, k) pij(i,j=1,2,,k)表示这次观测前状态为i,现在观测是状态为j的概率
  • P矩阵元素非负
  • 每一行的元素之和都为1

根据无后效性,我们可以得出:
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编码的数学模型 ,在金融领域,马尔可夫链模型被用于预测企业产品的市场占有率

猜你喜欢

转载自blog.csdn.net/wmhsjtu/article/details/104100893