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

Dil*_*rix 4 python numpy matrix linear-algebra

对于二维矩阵X( shape (m,n)),我试图计算矩阵乘法 X.T * X在哪里。按照这篇文章的解释,我希望能够使用以下方法来做到这一点:在 LHS 上,首先对第一个参数进行转置,然后将其乘以第二个参数。*np.einsum('ji,ik->jk', X, X)jiXX

这不适用于错误(对于(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). 我在这里缺少什么?为什么它还要在中间添加一个轴?

Div*_*kar 7

使用(* 是矩阵乘法),您可以将 first 的第二个轴与 secondary 的第一个轴X.T * X进行求和。现在,first 的第二个轴将与first 的第一个轴相同。因此,我们只是对这两个轴的第一个轴进行求和,而其余的轴则保持不变。X's transposeXX's transposeXX's

要在 上复制该内容einsum,请保持字符串表示法中的第一个字符相同,而两个输入的第二个轴的第一个字符不同,如下所示 -

np.einsum('ji,jk->ik', X, X)
Run Code Online (Sandbox Code Playgroud)

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

同样,这会比本机矩阵乘法慢:X.T.dot(X)。但是,我猜这篇文章更多的是作为einsum.