numpy.linalg.solve
实际上是使用LU分解的。事实上,我想对于非方阵Vandermonde设计矩阵V最小二乘地解决“V·x = b”。我不需要正则化。我看到多种方法:
- 使用
numpy.linalg.lstsq
求解“V·x = b”,它使用基于SVD的Fortran“xGELSD”。SVD应该比LU分解更慢,但我不需要计算“(V^T·V)”。 - 使用
numpy.linalg.solve
求解“(V^T·V)·x = (V^T·b)”,它使用LU分解。 - 使用
numpy.linalg.solve
求解“A·x = b”,它使用LU分解,但根据https://math.stackexchange.com/a/3155891/340174直接计算“A=xV^T·V”
solve
(https://docs.scipy.org/doc/scipy-1.2.1/reference/generated/scipy.linalg.solve.html),它可以对称矩阵“A”使用对角线枢轴,(比使用LU分解快,我猜)。但是我的scipy版本停留在1.1.0,所以我无法访问它。根据https://dev59.com/9qTia4cB1Zd3GeqP8hkE#45535523,似乎
solve
比lstsq
更快,包括计算“V^T·V”,但是当我尝试时,lstsq
更快。也许我做错了什么?
如何最快地解决我的线性问题?
statsmodels.regression.linear_model.OLS.fit
使用Moore-Penrose伪逆或QR分解+np.linalg.inv
+np.linalg.svd
+numpy.linalg.solve
,对我来说效率不够高。sklearn.linear_model.LinearRegression
使用scipy.linalg.lstsq。scipy.linalg.lstsq
也使用xGELSD。- 我预计计算“(V^T·V)”的逆矩阵将会非常耗时,因此放弃了直接计算“x=(V^T·V)^-1·(V^T·b)”。
np.linalg.pinv
,这几乎是"(V^T·V)^-1·V^T"。 - bubble