马尔可夫链的定义、举例和应用

马尔可夫链通常用来建模排队理论和统计学中的建模,还可作为信号模型用于熵编码技术,如算法编码。

定义

马尔可夫链是满足马尔可夫性质的随机过程。马尔可夫链描述了一种状态序列,其每个状态值取决于前面有限个状态。一阶马尔可夫过程就是下一个状态的的转移只依赖于当前状态。

举例

假设一个集合具有状态S[1-6], 每个状态的表示:
S1 = {AA, AA},
S2 = {AA, Aa}
S3 = {AA, aa}
S4 = {Aa, Aa}
S5 = {Aa, aa}
S6 = {aa, aa}.

每个状态是包含两个元素的集合,通过集合内的元素,可以其他状态,比如S2可以重组为**{AA, Aa}**, {AA, AA}, {Aa, Aa}

规定状态转移矩阵为:

StateNext(S1)Next(S2)Next(S3)Next(S4)Next(S5)Next(S6)
Current(S1) 100000
Current(S2) 1/41/201/400
Current(S3) 000100
Current(S4) 1/161/41/81/41/41/16
Current(S5) 0001/41/21/4
Current(S6) 000001

上图中,每一行代表的是当前状态的一下一步转移到不同状态的概率。注意一个含有M个状态的一阶过程有M的平方个状态转移。

基于以上的信息,我们再定义一个当前状态为S3,那么如何预测接下来10步的状态情况?

应用马尔可夫链

如果当前状态是 S3, 那么连续的计算10步。

#!/usr/bin/env python

import numpy as np
from matplotlib import pyplot

# state transition matrix
P = np.matrix([[1., 0., 0., 0., 0., 0.],
               [1./4, 1./2, 0., 1./4, 0., 0.],
               [0., 0., 0., 1., 0., 0.],
               [1./16, 1./4, 1./8, 1./4, 1./4, 1./16],
               [0., 0., 0., 1./4, 1./2, 1./4],
               [0., 0., 0., 0., 0., 1.]])

# Init state
v = np.matrix([[0, 0, 1, 0, 0, 0]])

# Get the data
plot_data = []
for step in range(5):
    result = v * P**step
    plot_data.append(np.array(result).flatten())

# Convert the data format
plot_data = np.array(plot_data)

# Create the plot
pyplot.figure(1)
pyplot.xlabel('Steps')
pyplot.ylabel('Probability')
lines = []
for i, shape in zip(range(6), ['x', 'h', 'H', 's', '8', 'r+']):
    line, = pyplot.plot(plot_data[:, i], shape, label="S%i" % (i+1))
    lines.append(line)
pyplot.legend(handles=lines, loc=1)
pyplot.show()
  • 运行:
pip install numpy matplotlib
python markov_chain_example.py
  • 结果:

从上图可以注意到:
第0步S3为1, 其他状态为0。
第1步,根据状态转移矩阵,S4为1,其他状态为0。
第2步,根据状态转移矩阵,各状态均有可能。

结论

马尔可夫链可以用来生成预测的序列。此外,我们注意到,有下面两个问题:

矩阵运算

在代码中,我们注意到,

result = v * P**step

其中,P**N是对状态转移矩阵P N次方(numpy.linalg.matrix_power)

为什么状态转移矩阵的列求和不为1

首先,当前状态为不同状态时,并不能保证下一状态都转移到S1或者某一特定的状态,因此,每列的和应该是0~状态的数量

Refers

隐马尔可夫模型(HMM)攻略

Python Markov Chain Packages

王海良@Chatopera 聊天机器人 机器学习 智能客服
Chatopera 联合创始人 & CEO,运营聊天机器人平台 https://bot.chatopera.com,让聊天机器人上线!2015年开始探索聊天机器人的商业应用,实现基于自然语言交互的流程引擎、语音识别、自然语言理解,2018年出版《智能问答与深度学习》一书。