1.来源
马尔可夫链是俄国数学家Andrey Andreyevich Markov研究并提出的一个用数学方法就能解释自然变化的一般规律模型,被命名为马尔科夫链(Markov Chain)。
2.定义
马尔可夫链是随机过程的一种,他要求随机过程具有“无记忆性”,也被叫做“马尔可夫性质”。
随机过程就是使用统计模型对一些事物的过程进行预测和处理,例如天气预报预测今天是否下雨,通过今天股票的涨跌预测明天的股票情况等。
“无记忆性”也就是指在一个时间序列中,本时刻发生的事情只和前一时刻发生的事情相关,和其他时刻发生的事情无关。例如在一个时间段中发生了[A,B,C,D,E,F]这几件事,那么C事件的发生只和B事件发生有关,用数学的语言描述就是:
因为一个状态只和他的前一个状态有关,对于两个状态来说只要确定他们之间的转换概率,这个马尔可夫模型就确定了。
类似上图这样一个事件A于B的转换过程,图中的箭头表示两个状态之间转换的概率。如果我们求出A经两次运动后还在A的概率为多少,可以算出是0.7*0.9+0.3*0.3=0.72.如过要求的起始状态和终止状态不是A,也就是求两次运动后的状态概率分别是多少?这样单纯的计算可能就变得很复杂了,因此我们就要引入转移概率矩阵的概念了。
如下图,我们就可以用一个矩阵来表示这个转换过程:
这个矩阵称之为转移概率矩阵,其每一行的值的和为1,每一行为初始状态,每一列为终止状态。如果我们此时再求上述问题就变成了:
这样就变得十分清楚了。我们也可以得出,两次运动后A到B的概率为0.28。
有了转移概率矩阵,求任意时刻的状态概率,只需要用初始状态乘以相应的转移概率矩阵的次方即可。
下面我们再来说一个转移概率矩阵的性质:稳定性,也就是转移概率矩阵经过一定有限次数序列的转换,最终一定可以得到一个稳定的概率分布 ,且与初始状态概率分布无关。我们用代码来说明这个性质。
#计算不同初始状态对转移概率矩阵稳定性的影响
import numpy as np
import pylab as pl
p01= np.array([0.5, 0.2, 0.3]) #p0数据 1,矩阵中每一行概率之和总等于1
p02=np.array([0.1,0.4,0.5]) #p0数据 2, 两个初始状态,用于分别计算和画图
p= np.array([[0.9, 0.075, 0.025], [0.15, 0.8, 0.05],[0.25, 0.25, 0.5]])
n=30
c= np.array(['r','g','b']) #定义画图颜色数组
def calanddraw(p0,p ):#2 计算并画图函数
for i in range(n):#3
p0= np.mat(p0) * np.mat(p)#迭代变量 确定p0与p 的关系
#print(p0[0])
for j in range(len(np.array(p0)[0])):
#print(p0[0,j])
pl.scatter(i,p0[0,j], c = c[j], s=.5)#确定画点属性 矩阵索引几行几列
pl.subplot(121)
calanddraw(p01,p)#调用数据画图
pl.subplot(122)
calanddraw(p02,p)#调用数据画图
pl.show()
输出结果:
我们可以看到对于两个不同的初始状态[0.5,0.2,0.3],[0.1,0.4,0.5],同一个转移概率矩阵[[0.9, 0.075, 0.025], [0.15, 0.8, 0.05],[0.25, 0.25, 0.5]],在执行30次循环后,左右两幅图的对应颜色的曲线都收敛于相同的值。
这就是转移概率矩阵的稳定性,他也要求转移概率矩阵具备三个条件: 常返性 非周期性 两两连通。
3.实例
某工厂一台自动加工机,其有两种工作状态:正常状态和故障状态,在每个整数钟点的起始时刻检查机器的工作情况,若机器处于正常状态,则让它继续工作;若机器处于故障状态,则对它进行检修,假设处于正常状态的机器,在1小时后发生故障的概率为0.05.对于故障机器有两种检修方案可供选择,一种是加急检修,在1小时内排除故障的概率为0.9;一种是常规检修,在1小时内排除故障的概率为0. 6.已知这台机器正常工作1小时可收益10元,加急检修1小时费用为9元,常规检修 1小时费用为6元。那么,当机器出现故障时,应选择哪种检修方案排除故障?
这是一个和马尔可夫链有关的决策问题,决策目标是使机器的生产获得最大的收益可供选择的行动方案包括: d1:加急检修,d2: 常规检修.
我们需要算出机器在每个时刻的状态,行动方案d1的转移概率矩阵=[[0.95,0.05],[0.9,0.1]],d2的转移概率矩阵=[[0.95,0.05],[0.6,0.4]],可以看出不同的维修方案对应的矩阵不一样,因此在决策时就要算出[n,n+1)(n>=0)时刻的收益 ]。
根据之前的推导我们我们知道n时刻的状态等于初始状态乘以转移概率矩阵。d1方案的收益为[[10],[-9]],d2方案的收益为[[10],[-6]]。
将n时刻的状态乘以收益就可以得到不同方案在n时刻的平局收益。
因此我们有如下代码:
import numpy as np
import pylab as pl
def MarkovChain():
P = np.array([[0.95, 0.05], [0.9, 0.1]]) #转移矩阵
P1 = np.array([[10], [-9]])
q=np.array([[0.95,0.05],[0.6,0.4]])
q1=np.array([[10],[-6]])
n = 10 #预测n天的事件发生概率
a1=[]
a2=[]
for j in range(n):
j=j+1
Init_State = np.array([1, 0]) #初始状态分布
Init_State1 = np.array([1, 0])
for i in range(j):
S = np.dot( Init_State, P)
Init_State = S
W=np.dot(Init_State1,q)
Init_State1=W
W=np.dot(Init_State1,q1)
S = np.dot( Init_State,P1)
a1.append(S)
a2.append(W)
print(f'第{j}天d1收益分布:{S.T}')
print(f'第{j}天d2收益分布:{W.T}')
a1=np.mat(a1)
a2=np.mat(a2)
for i in range(n):
pl.scatter(i,[a1[i][0]],c='r') #d1的收益
pl.scatter(i,[a2[i][0]],c='b') #d2的收益
pl.show()
MarkovChain()
运行结果:
根据这个结果我们就能得到每个时刻的平均收益,然后根据收益最大化这个目标进行决策。
4.总结
马尔科夫链,之所以被称之为“链”,我认为就是因为各个事件之间的相互转换过程构成了一条“链子”,而叫他马尔可夫链,是因为他具有马尔可夫的性质。
他与RNN的一个区别就是,有无记忆性。
马尔科夫链可以应用在语言模型:N-Gram模型中,他基于独立输入假设:第 n 个词的出现只与前面 第N-1 个词相关,而与其它任何词都不相关,这正好体现了马尔可夫性。
参考博客:简述马尔可夫链【通俗易懂】 - 知乎