首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >概率矩阵Numpy的终端概率

概率矩阵Numpy的终端概率
EN

Stack Overflow用户
提问于 2021-02-08 05:19:08
回答 1查看 124关注 0票数 1

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

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

代码语言:javascript
复制
import numpy as np
m = np.eye(4)
m[1] = 0.25
print(m)
代码语言:javascript
复制
[[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之间均匀分配。

代码语言:javascript
复制
t = m
for _ in range(100_000):
    t = t @ t
print(t)
代码语言:javascript
复制
[[1.         0.         0.         0.        ]

 [0.33333333 0.         0.33333333 0.33333333]

 [0.         0.         1.         0.        ]

 [0.         0.         0.         1.        ]]

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

代码语言:javascript
复制
np.linalg.eig(m)
代码语言:javascript
复制
[[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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-08 06:13:31

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

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

V x D x V^-1

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

如果我们将它自身乘以无限次,它就是

V x D^inf x V^-1

我们可以使用下面的表达式在numpy中进行计算。

代码语言:javascript
复制
d, v = np.linalg.eig(m)
v @ np.diag(d >= 1).astype(int) @ np.linalg.inv(v)

因为如果对角线的值小于1,那么当我们乘法时,它们将趋于0(假设我们有一个具有有效概率的矩阵,并且所有状态都可以到达终端状态)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66093216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档