Python 程序只在一定的初始条件下正确工作
如果一个方阵的条目是非负的,且每行的和为1,则称为随机方阵。例如,以下矩阵是随机的:Python 程序只在一定的初始条件下正确工作,python,numpy,linear-algebra,Python,Numpy,Linear Algebra,如果一个方阵的条目是非负的,且每行的和为1,则称为随机方阵。例如,以下矩阵是随机的: [0.3, 0.7] [0.9, 0.1] 众所周知,随机矩阵的任何幂仍然是随机的。我写了一个程序来验证这个事实,但我遇到了一个问题:这个程序适用于一些随机矩阵,但不适用于其他矩阵。这是我的密码: import numpy as np def main(p): # Stochastic matrix A A = np.array([[0.3, 0.7],
[0.3, 0.7]
[0.9, 0.1]
众所周知,随机矩阵的任何幂仍然是随机的。我写了一个程序来验证这个事实,但我遇到了一个问题:这个程序适用于一些随机矩阵,但不适用于其他矩阵。这是我的密码:
import numpy as np
def main(p):
# Stochastic matrix A
A = np.array([[0.3, 0.7],
[0.2, 0.8]])
# Identity matrix
B = np.array([[1, 0],
[0, 1]])
# Check if powers of A are stochastic
for i in range(p):
B = B @ A
print(B)
if (sum(B[0,]) == 1) and (sum(B[1,]) == 1):
print("Good")
else:
print("Bad")
return(0)
main(5)
对于这个特殊的A,程序运行得很好;它每次都打印“好”,我可以用手检查A的所有幂都是随机的
然而,如果我们使用
A = np.array([[0.3, 0.7],
[0.5, 0.5]])
然后有东西坏了;当我手动检查时,A的幂仍然是随机的。但该程序打印出一个“好”和四个“坏”。你能帮我找出问题所在吗?我相信是浮点精度。经验教训:避免将两个浮点数与
==
进行比较
Numpy为此提供了allclose
方法:
if np.allclose(B.sum(axis=1),1):
print("Good")
else:
print("Bad")
谢谢你的回答。这是因为其中一些数字有无限的二进制展开式,而在浮点运算中这些数字得到近似值?@Ovi是的,没错!当你对更多的数字进行
sum
时,这个问题就会传播开来。