矩阵乘法在数值上是否最优?

abu*_*kaj 8 python numpy floating-accuracy numerical-methods matrix-multiplication

TL; DR:问题是关于乘法精度

我必须将矩阵相乘A(100x8000),B(8000x27)和C(27x1)。

由于矩阵BC是常数并且A是可变的,因此我更喜欢将其计算为:ABC = np.dot(A, np.dot(B, C))。但是我不知道,它可能是数值恶化(在以下方面准确性)比np.dot(np.dot(a, B), C)

可能重要的是:矩阵AB包含8000个分别(分别)100个和27个相关特征的样本。

乘法在数值上(在精度上)是否最优?如果是,我该如何确定?

特殊情况

可以假定AB矩阵都是非负的。此外:

C = np.linalg.solve(cov(B, k), X)
Run Code Online (Sandbox Code Playgroud)

其中X是27x1矩阵,其中包含27个(可能是相关的)未知分布的随机变量cov = lambda X, k: np.dot(X.T, X) + k * np.eye(X.shape[1]),并且k是将表达式最小化的非负常数:

sum((X[i, 0] - np.dot(np.dot(B[:, [i]].T, drop(B, i)),
                      np.linalg.solve(cov(drop(B, i), k),
                                      np.delete(X, i, axis=0))) **2
    for i in range(27))
Run Code Online (Sandbox Code Playgroud)

drop()函数定义为lambda X, i: np.delete(X, i, axis=1)

更特殊的情况

可以假设np.cov(B.T, B)是的协方差矩阵X,它遵循多元高斯分布。

For*_*Bru -1

三个矩阵相乘不是总是比两个矩阵相乘慢吗?

你实际上只有两个选择:(AB)CA(BC)。因为BC = const,您可以拥有一个T = BC形状常数8000x1,然后相乘而AT无需重新计算T