python - 程序仅在某些初始条件下才能正常工作
问题描述
如果方阵的项为非负且每行之和为 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.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,程序运行良好;它每次都打印出“Good”,我可以手动检查 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")
推荐阅读
- webpack - Nativescript 6 代码共享项目和懒加载模块
- c++ - static_cast 有什么区别
(i) 和 size_t(i) 在 std::vector 构造函数中? - python-3.x - pyspark:查找有条件的行之间的时间差异
- javascript - 为什么“1 << 32”在Javascript中等于1
- java - Spring 安全性不允许使用简单的匹配器和 permitAll 进行访问
- python - 这两种神经网络结构有什么区别?
- azure-machine-learning-service - Azure ML SDK DataReference - 文件模式 - 许多文件
- java - 用于自定义游戏中角色可能状态的设计模式
- c# - C# 无法使用 MySql.Data.MySqlClient 连接 mariaDB
- regex - 匹配列中的文本值并对另一列中匹配的值执行函数