【发布时间】: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
我也看过这个问题。人们似乎给出了一些手工求解的技巧,但没有给出通用算法:
【问题讨论】:
-
嗨 JohanC,这是我能想到的方法,但想知道是否有更容易计算的技巧。
-
你说“更容易”是什么意思?
-
@amzon-ex 利用矩阵代数的某些属性,减少了暴力方法,更优雅。
-
采取你的观点@JohanC,这更像是一个数学问题。请参阅下面的答案以获得解决方案,这可能更像是一个数学问题。我确实尝试搜索和塑造找到我能理解的东西,并了解如何在 numpy 中实现。当这是一个数学问题时,经常看到这里,他们指出了具体的解决技巧,而不是一些更通用的算法。 math.stackexchange.com/questions/1457848/…
标签: python numpy matrix probability markov-chains