2 回答

TA貢獻1858條經驗 獲得超8個贊
我將忽略問題的 Vandermonde 部分(bubble的評論指出它有一個解析逆),而是回答關于其他矩陣的更一般的問題。
我認為這里可能會混淆一些事情,因此我將區分以下幾點:
V x = b
使用LU的精確解V x = b
使用QR的確切解決方案V x = b
使用 QR 的最小二乘解V x = b
使用SVD的最小二乘解V^T V x = V^T b
使用LU的精確解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.solve
with assume_a="pos"
。否則,你最終會做 5。
我還沒有找到在numpy
或中執行 3 的單個函數scipy
。Lapack 例程是 xGELS,它似乎沒有在scipy
. 你應該可以通過scupy.linalg.qr_multiply
后跟來做到這一點scipy.linalg.solve_triangular
。

TA貢獻1835條經驗 獲得超7個贊
嘗試scipy.linalg.lstsq()
使用lapack_driver='gelsy'
!
讓我們回顧一下求解線性最小二乘法的不同例程和方法:
numpy.linalg.lstsq()
包裝 LAPACK'sxGELSD()
,如第2841+行的 umath_linalg.c.src 所示。該例程使用分而治之的策略將矩陣 V 簡化為雙對角形式,并計算該雙對角矩陣的 SVD。scipy's
scipy.linalg.lstsq()
包裝 LAPACK'sxGELSD()
,xGELSY()
andxGELSS()
:lapack_driver
可以修改參數以從一個切換到另一個。據LAPACK的標桿,xGELSS()
是慢xGELSD()
和xGELSY()
大約5比快xGELSD()
。xGELSY()
利用列旋轉使用 V 的 QR 分解。好消息是這個開關已經在 scipy 1.1.0 中可用!LAPACK
xGELS()
使用矩陣 V 的 QR 分解,但它假設該矩陣具有滿秩。根據 LAPACK 的基準,on 可以預期dgels()
比 快約 5 倍dgelsd()
,但它也更容易受到矩陣條件數的影響并且可能變得不準確。請參閱C++ (LAPACK, sgels) 和 Python (Numpy, lstsq) 結果之間的區別中的詳細信息和進一步參考。xGELS() 在scipy 的 cython-lapack 接口中可用。
雖然非常誘人,但計算和使用V^T·V
來求解正規方程可能不是要走的路。實際上,精度受到該矩陣的條件數的威脅,大約是矩陣 V 的條件數的平方。由于Vandermonde 矩陣往往是嚴重病態的,除了離散傅立葉變換的矩陣,它可能變得危險......最后,您甚至可以繼續使用xGELSD()
以避免與條件相關的問題。如果切換到xGELSY()
,請考慮估計錯誤。
添加回答
舉報