在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)的最新解决方案,该解决方案可以对对称矩阵“ A”使用对角线旋转(我想这比使用LU分解要快),但是我的scipy停留在1.1.0上,所以我不无法访问.
从https://*.com/a/45535523/4533188开始,包括计算“ V ^ T·V”在内,求解似乎比lstsq快,但是当我尝试使用它时,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)”的直接计算.
解决方法:
我将忽略该问题的Vandermonde部分(气泡评论指出它具有解析的逆函数),而是回答有关其他矩阵的更一般的问题.
我认为这里可能会混淆一些事情,因此我将区分以下几点:
>使用LU的V x = b的精确解
>使用QR精确求解V x = b
>使用QR的V x = b的最小二乘解
>使用SVD的V x = b的最小二乘解
>使用LU的V ^ T V x = V ^ T b的精确解
>使用Cholesky精确求解V ^ T V x = V ^ T b
您链接的第一个maths.stackexchange答案是关于案例1和案例2.当它说LU很慢时,表示相对于特定类型矩阵的方法,例如正定,三角形,带状…
但是我想您实际上是在询问3-6.最后一个*链接指出6比4快.正如您所说,4应该比3慢,但是4是唯一适用于秩不足的V的链接.通常6应该比5快.
我们应该确保您做的是6,而不是5.要使用6,您需要将scipy.linalg.solve与假定_a =“ pos”一起使用.否则,您将完成5.
我还没有找到一个在numpy或scipy中执行3的功能. Lapack例程是xGELS,似乎没有暴露于科学.您应该可以先使用scupy.linalg.qr_multiply,然后再执行scipy.linalg.solve_triangular.