Python:稀疏矩阵乘法和numpy.dot()之间的不一致

时间:2017-12-25 14:17:30

标签: python numpy scipy sparse-matrix

Ubuntu16.04_64bit + Python3.5.2 + numpy1.13.3 + scipy1.0.0 当我处理scipy.sparse.csc.csc_matrixnumpy.ndarray之间的矩阵乘法时,我遇到了这个问题。我将在这里举一个例子:

import numpy as np
import scipy.sparse

a = np.random.random(1000,1000)
b = np.random.random(1000,2000)
da = scipy.sparse.csc.csc_matrix(a)
db = scipy.sparse.csc.csc_matrix(b)

ab = a.dot(b)
dadb = da.dot(db)
dab = da.dot(b)

然后差异如下:

In [31]: np.sum(dadb.toarray() != ab)
Out[31]: 1869078

In [33]: np.sum(dab != dadb.toarray())
Out[33]: 0

In [34]: np.sum(dab != ab)
Out[34]: 1869078

为什么呢?它们之间的区别是什么?该怎么办?

1 个答案:

答案 0 :(得分:5)

您所看到的是浮点运算的典型特征(有很好的解释,请参阅What Every Computer Scientist Should Know About Floating-Point ArithmeticWhy Are Floating Point Numbers Inaccurate?的答案)。与实数算术不同,浮点运算中的运算顺序将(略微)改变结果,因为舍入误差以不同方式累积。这意味着计算相同结果的不同方式不能完全一致,但他们会大致同意。

如果您使用np.allclose而不是使用完全相等,则可以看到此内容:

>>> np.allclose(dab, ab)
True

>>> np.allclose(dadb.toarray(), ab)
True

简而言之,这些操作的行为符合预期。