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 > N
和ndim(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的向量,它保存参数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()