在https://math.stackexchange.com/a/2233298/340174中提到,如果通过 LU 分解完成线性方程“M·x = b”(矩阵 M 是平方)的求解速度很慢(但使用 QR 甚至更慢)分解)。现在我注意到numpy.linalg.solve
实际上是在使用 LU 分解。事实上,我想为最小二乘的非平方 Vandermonde 设计矩阵 V 求解“V·x = b”。我不想正则化。我看到多种方法:
numpy.linalg.lstsq
使用基于 SVD 的 Fortran "xGELSD"求解 "V·x = b" 。SVD 应该比 LU 分解还要慢,但我不需要计算“(V^T·V)”。
numpy.linalg.solve
使用 LU 分解求解 "(V^T·V)·x = (V^T·b)" 。
用 求解“A·x = b” numpy.linalg.solve
,使用LU分解,但直接根据https://math.stackexchange.com/a/3155891/340174计算“A=xV^T·V”
或者,我可以使用 scipy 的最新solve
版本(https://docs.scipy.org/doc/scipy-1.2.1/reference/generated/scipy.linalg.solve.html),它可以对对称矩阵“A "(我猜这比使用 LU 分解要快),但是我的 scipy 停留在 1.1.0 上,所以我无法访问它。
从https://stackoverflow.com/a/45535523/4533188看来,它似乎solve
比 快lstsq
,包括计算“V^T·V”,但是当我尝试它时,lstsq
速度更快。也许我做错了什么?
解决线性问题的最快方法是什么?
statsmodels.regression.linear_model.OLS.fit
是使用 Moore-Penrose 伪逆或 QR-factorization + 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)”的直接计算
猛跑小猪
qq_花开花谢_0
相关分类