使用 numpy.einsum 转置时间矩阵:x^T * x

Using numpy.einsum for transpose times matrix: x^T * x

对于二维矩阵 X(形状 (m,n)),我正在尝试计算 X.T * X,其中 * 是矩阵乘法。 Following the explanation on this post 我希望能够使用 np.einsum('ji,ik->jk', X, X) 来做到这一点,在 LHS 上写作 ji 首先对第一个 X 参数进行转置,然后将其乘以第二个X 个参数。

这不适用于错误((m,n) = (3,4)):

ValueError: operands could not be broadcast together with remapped shapes [original->remapped]: (4,3)->(4,newaxis,3) (4,3)->(3,4)

然而这有效:np.einsum('ij,jk->ik', X.T, X)。我在这里错过了什么?为什么它还要在中间添加一个轴?

使用 X.T * X(* 是矩阵乘法),您正在对第一个 X's transpose 的第二个轴相对于第二个 X 的第一个轴进行和约化。现在,第一个 X's transpose 的第二个轴将与第一个 X 的第一个轴相同。因此,我们只是对这两个 X's 的第一个轴进行总和减少,而它们的其余轴保持不变。

要在 einsum 上复制它,请保持字符串符号中的第一个字符相同,而两个输入的第二个轴的字符不同,例如 -

np.einsum('ji,jk->ik', X, X)

因此,j's 被求和减少,而其余轴 - ik 保留在输出中。

同样,这会比原生矩阵乘法慢:X.T.dot(X)。但是,我猜这个 post 更像是 einsum.

的学习对象