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 > N
且rank(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 的向量,其中包含參數a
和b
。>>> 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()