【发布时间】:2019-03-26 22:24:06
【问题描述】:
在https://math.stackexchange.com/a/2233298/340174 中提到,如果通过 LU 分解求解线性方程“M·x = b”(矩阵 M 为正方形)会很慢(但使用 QR 分解会更慢)。现在我注意到numpy.linalg.solve 实际上是在使用 LU 分解。事实上,我想为最小二乘的非平方范德蒙德设计矩阵 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”
另外,我可以使用来自 scipy (https://docs.scipy.org/doc/scipy-1.2.1/reference/generated/scipy.linalg.solve.html) 的最新 solve,它可以对对称矩阵“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 分解 +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) 的直接计算)"
【问题讨论】:
-
范德蒙德矩阵有analytically expressed逆矩阵。我没有深入研究,也不知道这种情况下的浮点错误,但这种方法应该是最快的。另外,你可以看看
np.linalg.pinv这几乎是“(V^T·V)^-1·V^T” -
@bubble 这是一个很好的资源,但proof 不是仅用于方阵吗? OP 提到了一个非平方范德蒙德设计矩阵