Least-Squares

NumPy 如何解決欠定係統的最小二乘法?

  • October 16, 2016

假設我們有形狀為 (2, 5) 的 X 和形狀為 (2,)

的 y

這有效:np.linalg.lstsq(X, y)

我們希望這僅在 X 的形狀為 (N,5) 其中 N>=5 時才有效。但是為什麼以及如何?

我們確實按預期返回了 5 個權重,但是這個問題是如何解決的呢?

是不是就像我們有 2 個方程和 5 個未知數?

numpy 怎麼能解決這個問題?

它必須做一些像插值這樣的事情來創建更多的人工方程?…

我的理解是numpy.linalg.lstsq依賴於LAPACK例程dgelsd

問題是要解決:

minimize(over;x)|Axb|2

當然,這對於秩小於向量長度的矩陣 A沒有唯一b . 在未確定係統的情況下,dgelsd提供解決方案 z 這樣:

  • Az=b
  • |z|2|x|2 對所有人 x 滿足 Ax=b . (IE z 是待定係統的最小範數解。

例如,如果系統是 x+y=1 , numpy.linalg.lstsq 將返回 x=.5,y=.5 .

dgelsd 是如何工作的?

該例程dgelsd計算 A 的奇異值分解(SVD)。

我將概述使用 SVD 解決線性系統的想法。奇異值分解是因式分解 UΣV=A 在哪裡 UV 是正交矩陣和 Σ 是一個對角矩陣,其中對角元素被稱為奇異值。

矩陣的有效秩 A 將是有效非零的奇異值的數量(即,相對於機器精度等與零有很大差異……)。讓 S 是非零奇異值的對角矩陣。因此,SVD 為:

A=U[S0 00]V

A 是(誰)給的:

A=V[S10 00]U

考慮解決方案 x=Ab . 然後:

Axb=U[S0 00]VV[S10 00]Ubb =U[I0 00]Ubb 

這里基本上有兩種情況:

  1. 非零奇異值的個數(即矩陣的大小 I ) 小於的長度 b . 這裡的解決方案並不准確;我們將以最小二乘的方式求解線性系統。
  2. Axb=0

最後一部分有點棘手……需要跟踪矩陣尺寸並使用它 U 是一個正交矩陣。

偽逆等價

什麼時候 A 具有線性獨立的行,(例如,我們有一個胖矩陣),然後: A=A(AA)1

對於未定係統,您可以證明偽逆為您提供了最小範數解。

什麼時候 A 具有線性獨立的列,(例如,我們有一個瘦矩陣),然後: A=(AA)1A

引用自:https://stats.stackexchange.com/questions/240573