用Python简化Markov Transition Matrix平衡

作为马尔可夫模型的复习,我’ve been watching 斯科特·E·佩奇教授’s 优秀的 YouTube上的视频。他用手完成所有计算– and now I’已经编写了一些代码以更快地执行它。

在视频2中,我们给了一个假设学生在教室中从警觉到无聊的转换矩阵:

提醒:t 无聊:t
提醒:t + 1  0.8  0.25
无聊:t + 1  0.2  0.75

可以在Python中表示为:

1
2
矩阵  = [[0.8, 0.25],
           [0.2, 0.75]]

学生的向量又是一个简单的列表:

1
students_vector = [1,0]

让’s计算一个阶段:

1
2
3
4
5
6
7
8
9
定义 markov_stage(矩阵, 向量):
    “计算马尔可夫过程的一次迭代”
    v1 = [] #空白列表存储下一个阶段
    对于 x Xrange((矩阵)): #对于矩阵的每一行
        #将行中的每个元素乘以vector和sum的每个元素
        #“ 压缩”功能非常适合
        v1.附加(([一种*b 对于 a,b 压缩(矩阵[x],向量)]))
    打印 v1
    返回 v1

调用产生:

1
2
3
4
5
>>> student_vector = markov_stage(student_vector)
[0.8, 0.2]
>>>
>>> student_vector = markov_stage(student_vector)
[0.6900000000000002, 0.31000000000000005]

或者,让’尝试通过循环找到平衡状态  markov_stage 直到值基本上停止变化(达到一定的小数位数精度)为止:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
定义 马尔科夫均衡(矩阵, 向量, acc):
    “试图找到马尔可夫过程的平衡。
      接受矩阵[i,j],向量[v1,v2,vx ..]和
      精确到任意小数点”
 
    #“它” =迭代
    #我们必须至少执行2次迭代才能判断
    #看起来是否稳定(基本上只是比较两者)
    它的 = [markov_stage(矩阵, 向量)] #输入第一次迭代
    它的.附加(markov_stage(矩阵, 它的[-1])) #追加另一个
 
    #now循环,条件是四舍五入时,向量不相同
    #和以前一样
    ([回合(x,acc) 对于 x 它的[-1]] != [回合(x,acc) 对于 x 它的[-2]]):
        它的.附加(markov_stage(矩阵, 它的[-1])) #我们可以调用该函数
                                                  #从以前
 
    结果 = “马尔可夫过程经过{0}个阶段才能达到{1} d.p.平衡”
    打印 结果.格式((它的), acc) #输出一个不错的结果

产生的精度设置为小数点后2位:

1
2
3
4
5
6
7
8
9
10
>>> 马尔科夫均衡(矩阵,student_vector,2)
[0.8, 0.2]
[0.6900000000000002, 0.31000000000000005]
[0.6295000000000002, 0.37050000000000005]
[0.5962250000000002, 0.4037750000000001]
[0.5779237500000002, 0.42207625000000015]
[0.5678580625000003, 0.4321419375000002]
[0.5623219343750003, 0.4376780656250002]
[0.5592770639062503, 0.44072293609375024]
马可夫 处理 8 阶段 达到 2 d.p. 平衡

我可能本可以用Numpy编写的–它将使用较少的内存(并且可能具有用于向量矩阵行乘法的内置函数)来更快地进行计算,但是这样做很有趣。一世’尝试扩展 马尔科夫均衡  给出一些更详细的统计信息,例如“churn”正如佩奇教授所提到的。

发表评论