gpt4 book ai didi

python等效数学方程给出不同的结果

转载 作者:行者123 更新时间:2023-12-01 06:27:25 24 4
gpt4 key购买 nike

为什么这两个应该相等的数学方程有时会给出不同的结果?

import numpy as np

for i in range(0, 20):
q = 90000
A = np.random.randint(0, q, (10, 10))
x = np.random.randint(0, q, (10, 1))%2

s = np.random.randint(0, q, (10, 1))
e1 = np.random.uniform(-0.01, 0.01, 10)
e1 = np.array([e1])


print((A.T.dot(s)+e1.T).T.dot(x))
print(A.T.dot(s).T.dot(x)+e1.dot(x))
print("\n")

这是使用新安装的 python 3.8 运行的代码 enter image description here

最佳答案

问题

这看起来像integer overflow ,这在 32 位 Python/numpy 安装上比在 64 位安装上发生得更快。你是对的,这两个数学公式是等价的,但它们相应的实现却不同

示例

这是一个简单的 int32 溢出示例:

np.int32(2**31 - 1) + np.int32(1)
# => -2147483648

从数学上来说,应该是2**31 # 2147483648

你的错误

通过为 randint 指定 dtype 参数,可以在 64 位上重现您的问题:

import numpy as np

for i in range(0, 20):
q = 90000
A = np.random.randint(0, q, (10, 10), dtype=np.int32)
x = np.random.randint(0, q, (10, 1), dtype=np.int32)%2

s = np.random.randint(0, q, (10, 1), dtype=np.int32)
e1 = np.random.uniform(-0.01, 0.01, 10)
e1 = np.array([e1])

print((A.T.dot(s)+e1.T).T.dot(x)[0,0])
print((A.T.dot(s).T.dot(x)+e1.dot(x))[0,0])
print("\n")

举个例子:

2207700288.9948306
-2087267007.0051694


-1701197217.992026
-1701197217.9920263


1592225479.9864094
1592225479.9864097


-2889566938.9977694
1405400357.002231

解决方案?

普通 Python 整数通常不会出现此问题,因为它们是无界的。

很难针对您的问题提出有效的解决方案。

您应该避免使用中间结果较大的公式,并且可以使用 np.int64 而不是 np.int32。您可能仍然会遇到溢出,但会晚一些。查看此相关answer .

关于python等效数学方程给出不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60069073/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com