在numpy中制作嵌套点积的更好方法?

在numpy中制作嵌套点积的更好方法?,numpy,Numpy,我发现这种情况经常发生在我身上:我想计算一个排序为(X^TX)^{-1}XX^T的矩阵乘法,或者类似这样的东西。我最终做了类似的事情 X = np.array([[1,2],[3,4]]) a = np.dot(np.transpose(X), X) b = np.dot(np.linalg.inv(a), X) answer = np.dot(b, np.transpose(X)) 有没有更好的方法不用求助于np.matrix类型就可以做到这一点?有没有一种不用输入np的转置方法?让我们稍微

我发现这种情况经常发生在我身上:我想计算一个排序为
(X^TX)^{-1}XX^T
的矩阵乘法,或者类似这样的东西。我最终做了类似的事情

X = np.array([[1,2],[3,4]])
a = np.dot(np.transpose(X), X)
b = np.dot(np.linalg.inv(a), X)
answer = np.dot(b, np.transpose(X))

有没有更好的方法不用求助于
np.matrix
类型就可以做到这一点?有没有一种不用输入np的转置方法?

让我们稍微探讨一下选项

inv=np.linalg.inv
def array1(X):
    a = np.dot(X.T, X)
    b = np.dot(inv(a), X)
    return np.dot(b, X.T)
基本上是您的代码,但是使用
方法
表达式
dot
.T
表示法

使用
X
进行测试:

In [12]: array1(X)
Out[12]: 
array([[-13.5, -32.5],
       [ 10. ,  24. ]])
矩阵的等价物是什么

In [17]: M=np.matrix(X)

In [18]: (M.T*M).I*M*M.T
Out[18]: 
matrix([[-13.5, -32.5],
        [ 10. ,  24. ]])
矩阵
版本更紧凑,但更清晰吗?不是更快

In [22]: timeit array1(X)
10000 loops, best of 3: 48.7 µs per loop

In [23]: timeit (M.T*M).I*M*M.T
10000 loops, best of 3: 95.4 µs per loop
einsum
等效物上的第一次刺杀

In [32]: np.einsum('ij,jk,lk',inv(np.einsum('ji,jk',X,X)),X,X)
Out[32]: 
array([[-13.5, -32.5],
       [ 10. ,  24. ]])

In [33]: timeit np.einsum('ij,jk,lk',inv(np.einsum('ji,jk',X,X)),X,X)
10000 loops, best of 3: 55.1 µs per loop
基本上与
dot
版本相同

矩阵版本向我展示了我可以将阵列版本简化为:

inv(X.T.dot(X)).dot(X.dot(X.T))

(相同的计时)

您可以使用
.T
符号代替
转置
这看起来像普通的最小二乘法。看一看pandas/statsmodels方法,不必写出这么多线性代数。有没有很好的理由不允许使用
np.dot(inv(np.dot(X.T,X)),X,X.T)
?即将多个矩阵传递给 NP.dot[])/Cux>顺序执行,下面的C(或C++或F)库不执行这种链接。code>np.dot
通过调用优化的库来提高速度。但在使用大型阵列时,这主要是一个优势,而不是2x2示例。