我正在尝试通过Markov模型的多个转换来运行数据框。
数据框如下所示:
df = pd.DataFrame({'Bull Market': [.9, .8, .5],
'Bear Market': [.25, .05, .25],
'Stagnant Market': [.75, .15, .25]
},
index=["Bull Market", "Bear Market", "Stagnant Market"])
我有两次运行它的代码:
print(df.dot(df))
我需要在模型中运行X次。我很难在dot()上找到文档,但是根据我的确发现,看起来你不能运行X次。
任何帮助将不胜感激,谢谢!
答案 0 :(得分:0)
这不是马尔可夫链的工作方式。你需要一个起始状态(在这种情况下,[1,0,0],[0,1,0]或[0,0,1]),然后你将转换矩阵乘以状态向量,然后将转换矩阵乘以新获得的状态向量等。您不要将转换矩阵自身相乘。如果你需要计算在特定数量的转换之后发生的事情,你可以循环X次并执行X矩阵向量乘法。如果你想要稳定状态,你需要找到主导的特征向量,你可以使用numpy.linalg.eig来做。另请注意,这不适用于您拥有的转换矩阵,因为这些行不是概率分布。
编辑:好的,我想我知道你正在尝试做什么。由于矩阵向量乘法的工作方式,您也可以对矩阵求幂,然后将其乘以起始状态向量,得到与每次中间结果迭代相乘的结果相同的结果。您可以使用numpy.linalg.matrix_power来执行此操作。而且我看到你从维基百科那里获得了这个矩阵。你只是错误地复制了一些这些数字,即应该是0.025,而不是0.25。每一行总和为1都至关重要。
此代码重现了维基百科的示例:
import numpy as np
T = np.array([[0.9, 0.075, 0.025],
[0.15, 0.8, 0.05],
[0.25, 0.25, 0.5]])
start = np.array([0, 1, 0])
def find_state_after_n(start, T, n):
Tmult = np.linalg.matrix_power(T, n)
state = np.dot(start, Tmult)
return state
find_state_after_n(start, T, 3)
array([ 0.3575 , 0.56825, 0.07425])