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)类阵列

右侧阵列

cond浮动,可选

‘小’奇异值的分界值;用于确定小于以下的奇异值的有效秩 rcond * largest_singular_value 被认为是零。

overwrite_a布尔值,可选

丢弃中的数据 a (可以增强性能)。默认值为False。

overwrite_b布尔值,可选

丢弃中的数据 b (可以增强性能)。默认值为False。

check_finite布尔值,可选

是否检查输入矩阵是否仅包含有限个数字。禁用可能会带来性能提升,但如果输入确实包含无穷大或NAN,则可能会导致问题(崩溃、非终止)。

lapack_driver字符串,可选

使用哪个LAPACK驱动程序来解决最小二乘问题。选项包括 'gelsd''gelsy''gelss' 。默认设置 ('gelsd' )是个不错的选择。然而, 'gelsy' 在许多问题上可以稍微快一点。 'gelss' 在历史上曾被使用过。它通常很慢,但使用的内存较少。

0.17.0 新版功能.

退货
x(N,)或(N,K)ndarray

最小二乘解。返回形状与的形状匹配 b

residues(K,)ndarray或Float

中每列的2范数的平方 b - a x ,如果 M > Nndim(A) == n (如果b是1-D,则返回标量)。否则,返回(0,)形状的数组。

rank集成

有效职级 a

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

的奇异值 a 。A的条件数为 abs(s[0] / s[-1])

加薪
LinAlgError

如果计算不收敛。

ValueError

当参数不兼容时。

参见

scipy.optimize.nnls

带非负约束的线性最小二乘法

注意事项

什么时候 'gelsy' 被用作司机, residues 设置为(0,)形数组,并且 s 总是 None

示例

>>> 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