【问题标题】:Terminal probabilities of a probability matrix Numpy概率矩阵 Numpy 的终端概率
【发布时间】:2021-05-11 13:30:09
【问题描述】:

我有一个矩阵 m,它表示从状态转换到状态的概率。

例如对于下面的示例,我将始终卡在状态 1、3、4,而状态 2 我将随机转换到 4 个状态之一。

import numpy as np
m = np.eye(4)
m[1] = 0.25
print(m)
[[1.   0.   0.   0.  ]

 [0.25 0.25 0.25 0.25]

 [0.   0.   1.   0.  ]

 [0.   0.   0.   1.  ]]

如何找到表示无限转换后最终状态的矩阵?

例如如果我这样做,我会得到状态 1,3,4 --> 100% 坚持 1,3,4 但状态 2 --> 1/3 机会最终出现在所有其他状态的直观结果。由于来自状态 2 的所有案例最终通过多次转换在 1、3、4 之间平均分配。

t = m
for _ in range(100_000):
    t = t @ t
print(t)
[[1.         0.         0.         0.        ]

 [0.33333333 0.         0.33333333 0.33333333]

 [0.         0.         1.         0.        ]

 [0.         0.         0.         1.        ]]

如何在不使用重复乘法的情况下进行计算?我认为它对应于矩阵的特征向量/特征值,但是当我计算它时,我得到了一些非常不同的东西。

np.linalg.eig(m)
[[0.        , 0.9486833 , 0.        , 0.        ],

[1.        , 0.31622777, 0.31622777, 0.31622777],

[0.        , 0.        , 0.9486833 , 0.        ],

[0.        , 0.        , 0.        , 0.9486833 ]]

有没有一种方法可以使用 numpy 进行计算?我需要它来处理任意矩阵,但是会有一个已知的终端状态列表和从所有其他状态到达这些状态的正概率。

目前我正在考虑使用重复乘法方法,但感觉不太理想,应该有一个函数/技巧可以在不循环的情况下计算。

我正在阅读这篇文章,但没有完全理解该方法是什么以及如何实施它。

https://math.dartmouth.edu/archive/m20x06/public_html/Lecture14.pdf

我也看过这个问题。人们似乎给出了一些手工求解的技巧,但没有给出通用算法:

https://math.stackexchange.com/questions/2003258/calculating-the-probability-of-reaching-each-absorbing-state-in-markov-chain

【问题讨论】:

  • 嗨 JohanC,这是我能想到的方法,但想知道是否有更容易计算的技巧。
  • 你说“更容易”是什么意思?
  • @amzon-ex 利用矩阵代数的某些属性,减少了暴力方法,更优雅。
  • 采取你的观点@JohanC,这更像是一个数学问题。请参阅下面的答案以获得解决方案,这可能更像是一个数学问题。我确实尝试搜索和塑造找到我能理解的东西,并了解如何在 numpy 中实现。当这是一个数学问题时,经常看到这里,他们指出了具体的解决技巧,而不是一些更通用的算法。 math.stackexchange.com/questions/1457848/…

标签: python numpy matrix probability markov-chains


【解决方案1】:

我的朋友指出了以下技巧。

特征分解意味着我们可以将原始矩阵写为

V x D x V^-1

其中 D 是具有特征值的对角矩阵,V 是特征向量。

如果我们将它自己无限次相乘,它是

V x D^inf x V^-1

我们可以使用下面的 numpy 来计算。

d, v = np.linalg.eig(m)
v @ np.diag(d >= 1).astype(int) @ np.linalg.inv(v)

由于如果对角线值

【讨论】:

  • 我想你会想要寻找与 eigenvalue = 1 相关的特征向量——这些特征向量是所谓的平稳分布或稳态向量。另外,我认为您需要注意矩阵结构的约定——使用列总和为 1 的转换矩阵可能很方便,而不是行总和为 1,因为您的例子表明。所以也许看看你的例子的转置的特征值/向量。
  • 特征值/向量分解在计算上需要做很多工作——我认为你应该能够通过检查转换矩阵来找到吸收状态,或者更一般地说,吸收子集。也许有一种图论方法来查看转换矩阵。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-10
  • 2018-04-26
  • 2022-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多