abu*_*kaj 8 python numpy floating-accuracy numerical-methods matrix-multiplication
我必须将矩阵相乘A
(100x8000),B
(8000x27)和C
(27x1)。
由于矩阵B
和C
是常数并且A
是可变的,因此我更喜欢将其计算为:ABC = np.dot(A, np.dot(B, C))
。但是我不知道,它可能是数值恶化(在以下方面准确性)比np.dot(np.dot(a, B), C)
。
可能重要的是:矩阵A
并B
包含8000个分别(分别)100个和27个相关特征的样本。
乘法在数值上(在精度上)是否最优?如果是,我该如何确定?
可以假定A
和B
矩阵都是非负的。此外:
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)C
和A(BC)
。因为BC = const
,您可以拥有一个T = BC
形状常数8000x1
,然后相乘而AT
无需重新计算T
。