簡體   English   中英

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

[英]Python: Inconsistency between sparse matrix multiplication and numpy.dot()

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

為什么? 它們之間有什么區別? 怎么辦呢?

您所看到的是典型的浮點算術(有關詳細說明,請參閱每位計算機科學家應了解的有關浮點算術的知識,或有關為何為何浮點數不正確的答案 )。 與真實算術不同,浮點算術中的運算順序將(略)更改結果,因為舍入誤差以不同的方式累積。 這意味着不能期望使用不同的方法來計算相同結果的方式完全一致,但它們會大致一致。

如果使用np.allclose而不是完全相等,則可以看到以下內容:

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

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

簡而言之,這些操作的行為符合預期。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM