当我使用numpy
计算矩阵的点积时,遇到了一个奇怪的现象。简而言之,对于数学上相同的计算,numpy
给了我不同的结果。
以下代码段说明了此问题:
import numpy as np
np.set_printoptions(precision=10)
np.random.seed(2) # for reproducibility
# create matrices:
A = np.random.rand(300, 1)
A = A/np.sum(A)
A = np.repeat(A, 15, 1)
B = np.random.rand(300, 300)
# convert data to float32:
A_star = A.astype("float32")
B_star = B.astype("float32")
# do the matrix multiplication A'BA and take the diagonal:
res_star = np.diag(A_star.transpose().dot(B_star.dot(A_star)))
# print the results:
print(res_star)
在Windows计算机上以python3.5
在numpy1.11.1
中运行此命令将打印以下数组:
[0.5000683069 0.5000683069 0.5000683069 0.5000683069 0.5000683069
0.5000683069 0.5000683069 0.5000683069 0.5000683069 0.5000683069
0.5000683069 0.5000683069 0.5000681877 0.5000681877 0.5000683069]
请注意,res_star[12:14]
中的值与数组的其他元素不同-尽管从数学上讲,人们希望它们重合。
我自己对这些差异的查询并不是特别成功,但我想我将其范围缩小了:
float64
,结果数组中的值相同float32
值,值的差异通常仅从小数点后第七位(float32
精度结束的区域)开始但是,对我来说,这些发现不能真正解释数组中的差异,因为正在进行相同的数学运算(如果我要在具有dtype的相同矩阵上计算相同的点积,则它们确实可以解释值的差异。 float64
)。另外,对于不同的种子和矩阵大小,结果值可能实际上是重合的-因此,这种行为是不一致的。
现在
1)是什么原因引起的,并且
2)如何在不将dtype更改为float64
的情况下确保数组内的结果相同?