python3上numpy中的float32数字的矩阵乘法不稳定性

时间:2019-04-25 11:52:27

标签: python-3.x numpy matrix-multiplication

当我使用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.5numpy1.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]中的值与数组的其他元素不同-尽管从数学上讲,人们希望它们重合。

我自己对这些差异的查询并不是特别成功,但我想我将其范围缩小了:

  • 使用dtype float64,结果数组中的值相同
  • 对于float32值,值的差异通常仅从小数点后第七位(float32精度结束的区域)开始

但是,对我来说,这些发现不能真正解释数组中的差异,因为正在进行相同的数学运算(如果我要在具有dtype的相同矩阵上计算相同的点积,则它们确实可以解释值的差异。 float64)。另外,对于不同的种子和矩阵大小,结果值可能实际上是重合的-因此,这种行为是不一致的。

  • 在UNIX计算机上,上面给出的代码片段返回相同的数字(至少在此特定配置中)

现在

1)是什么原因引起的,并且

2)如何在不将dtype更改为float64的情况下确保数组内的结果相同?

0 个答案:

没有答案