有人知道这种行为的文档吗?
import numpy as np
A = np.random.uniform(0,1,(10,5))
w = np.ones(5)
Aw = A*w
Sym1 = Aw.dot(Aw.T)
Sym2 = (A*w).dot((A*w).T)
diff = Sym1 - Sym2
Run Code Online (Sandbox Code Playgroud)
diff.max()接近机器精度非零,例如4.4e-16.
这(与0的差异)通常很好......在有限精度的世界里,我们不应该感到惊讶.
此外,我猜想numpy对于对称产品很聪明,可以节省触发器并确保对称输出......
但我处理混乱的系统,这种小的差异在调试时很快变得明显.所以我想确切地知道发生了什么.
python floating-point numpy linear-algebra floating-accuracy
格拉姆矩阵是结构X @ X.T对称的矩阵。在处理密集矩阵时,numpy.dot产品实现足够智能,可以识别自乘以利用对称性,从而加快计算速度(请参阅此)。scipy.sparse然而,使用矩阵时观察不到这样的效果:
random.seed(0)\nX = random.randn(5,50)\nX[X < 1.5] = 0\nX = scipy.sparse.csr_matrix(X)\nprint(f\'sparsity of X: {100 * (1 - X.count_nonzero() / prod(X.shape)):5.2f} %\')\n# sparsity of X: 92.00 %\n\n%timeit X @ X.T\n# 248 \xc2\xb5s \xc2\xb1 10.8 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 1000 loops each)\n\nX2 = X.copy()\n%timeit X @ X2.T\n# 251 \xc2\xb5s \xc2\xb1 9.38 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 1000 loops each)\nRun Code Online (Sandbox Code Playgroud)\n\n所以我想知道:在Python中计算稀疏格拉姆矩阵的最快方法是什么?值得注意的是,仅计算下三角形(或等效的上三角形)就足够了。 …