gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 21:38:40 24 4
gpt4 key购买 nike

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

为什么?它们之间有什么区别?用它做什么?

最佳答案

您看到的是典型的浮点运算(有关详细解释,请参阅 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

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

关于Python:稀疏矩阵乘法和 numpy.dot() 之间的不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47969422/

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