亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

解決線性最小二乘法的最快方法

解決線性最小二乘法的最快方法

慕妹3146593 2021-12-17 10:40:22
在https://math.stackexchange.com/a/2233298/340174中提到,如果通過 LU 分解完成線性方程“M·x = b”(矩陣 M 是平方)的求解速度很慢(但使用 QR 甚至更慢)分解)?,F在我注意到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)”的直接計算
查看完整描述

2 回答

?
猛跑小豬

TA貢獻1858條經驗 獲得超8個贊

我將忽略問題的 Vandermonde 部分(bubble的評論指出它有一個解析逆),而是回答關于其他矩陣的更一般的問題。

我認為這里可能會混淆一些事情,因此我將區分以下幾點:

  1. V x = b使用LU的精確解

  2. V x = b使用QR的確切解決方案

  3. V x = b使用 QR 的最小二乘解

  4. V x = b使用SVD的最小二乘解

  5. V^T V x = V^T b使用LU的精確解

  6. V^T V x = V^T b使用 Cholesky 的精確解

您鏈接到的第一個 maths.stackexchange 答案是關于案例 1 和 2。當它說 LU 很慢時,這意味著相對于特定類型矩陣的方法,例如正定矩陣、三角矩陣、帶狀矩陣……

但我認為你實際上是在問 3-6。最后一個 stackoverflow 鏈接指出 6 比 4 快。正如您所說,4 應該比 3 慢,但 4 是唯一適用于 rank-deficient 的V。一般來說,6 應該比 5 快。

我們應該確保你做了 6 而不是 5。要使用 6,你需要使用scipy.linalg.solvewith assume_a="pos"。否則,你最終會做 5。

我還沒有找到在numpy或中執行 3 的單個函數scipy。Lapack 例程是 xGELS,它似乎沒有在scipy. 你應該可以通過scupy.linalg.qr_multiply后跟來做到這一點scipy.linalg.solve_triangular。


查看完整回答
反對 回復 2021-12-17
?
qq_花開花謝_0

TA貢獻1835條經驗 獲得超7個贊

嘗試scipy.linalg.lstsq()使用lapack_driver='gelsy'!

讓我們回顧一下求解線性最小二乘法的不同例程和方法:

雖然非常誘人,但計算和使用V^T·V來求解正規方程可能不是要走的路。實際上,精度受到該矩陣的條件數的威脅,大約是矩陣 V 的條件數的平方。由于Vandermonde 矩陣往往是嚴重病態的,除了離散傅立葉變換的矩陣,它可能變得危險......最后,您甚至可以繼續使用xGELSD()以避免與條件相關的問題。如果切換到xGELSY(),請考慮估計錯誤


查看完整回答
反對 回復 2021-12-17
  • 2 回答
  • 0 關注
  • 199 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號