scipy.linalg.

lstsq#

scipy.linalg.lstsq(a, b, cond=None, overwrite_a=False, overwrite_b=False, check_finite=True, lapack_driver=None)[原始碼]#

計算方程式 Ax = b 的最小平方法解。

計算向量 x,使得 2-範數 |b - A x| 最小化。

參數:
a(M, N) 類陣列

左手邊陣列

b(M,) 或 (M, K) 類陣列

右手邊陣列

condfloat,可選

「小」奇異值的截斷值;用於確定 a 的有效秩。小於 cond * largest_singular_value 的奇異值被視為零。

overwrite_abool,可選

捨棄 a 中的資料(可能提升效能)。預設值為 False。

overwrite_bbool,可選

捨棄 b 中的資料(可能提升效能)。預設值為 False。

check_finitebool,可選

是否檢查輸入矩陣是否僅包含有限數字。停用此選項可能會提高效能,但如果輸入包含無限大或 NaN,可能會導致問題(崩潰、無終止)。

lapack_driverstr,可選

用於解決最小平方問題的 LAPACK 驅動程式。選項為 'gelsd''gelsy''gelss'。預設值 ('gelsd') 是一個不錯的選擇。但是,在許多問題上,'gelsy' 可能稍快一些。'gelss' 過去曾被使用。它通常很慢但使用的記憶體較少。

在 0.17.0 版本中新增。

回傳值:
x(N,) 或 (N, K) ndarray

最小平方法解。

residues(K,) ndarray 或 float

b - a x 中每列的 2-範數平方,如果 M > Nrank(A) == n(如果 b 是 1 維的,則傳回純量)。否則,傳回 (0,)-形狀的陣列。

rankint

a 的有效秩。

s(min(M, N),) ndarray 或 None

a 的奇異值。a 的條件數為 s[0] / s[-1]

拋出:
LinAlgError

如果計算不收斂。

ValueError

當參數不相容時。

參見

scipy.optimize.nnls

帶有非負約束的線性最小平方

註解

'gelsy' 用作驅動程式時,residues 設定為 (0,)-形狀的陣列,且 s 始終為 None

範例

>>> import numpy as np
>>> from scipy.linalg import lstsq
>>> import matplotlib.pyplot as plt

假設我們有以下資料

>>> x = np.array([1, 2.5, 3.5, 4, 5, 7, 8.5])
>>> y = np.array([0.3, 1.1, 1.5, 2.0, 3.2, 6.6, 8.6])

我們想要將 y = a + b*x**2 形式的二次多項式擬合到此資料。我們首先形成「設計矩陣」M,其中包含常數 1 的列和包含 x**2 的列

>>> M = x[:, np.newaxis]**[0, 2]
>>> M
array([[  1.  ,   1.  ],
       [  1.  ,   6.25],
       [  1.  ,  12.25],
       [  1.  ,  16.  ],
       [  1.  ,  25.  ],
       [  1.  ,  49.  ],
       [  1.  ,  72.25]])

我們想要找到 M.dot(p) = y 的最小平方法解,其中 p 是長度為 2 的向量,其中包含參數 ab

>>> p, res, rnk, s = lstsq(M, y)
>>> p
array([ 0.20925829,  0.12013861])

繪製資料和擬合曲線。

>>> plt.plot(x, y, 'o', label='data')
>>> xx = np.linspace(0, 9, 101)
>>> yy = p[0] + p[1]*xx**2
>>> plt.plot(xx, yy, label='least squares fit, $y = a + bx^2$')
>>> plt.xlabel('x')
>>> plt.ylabel('y')
>>> plt.legend(framealpha=1, shadow=True)
>>> plt.grid(alpha=0.25)
>>> plt.show()
../../_images/scipy-linalg-lstsq-1.png