numpy.linalg.lstsq

原文:https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.lstsq.html

译者:飞龙 UsyiyiCN

校对:(虚位以待)

numpy.linalg.lstsq(a, b, rcond=-1)[source]

将最小二乘解返回到线性矩阵方程。

Solves the equation a x = b by computing a vector x that minimizes the Euclidean 2-norm || b - a x ||^2. 方程可以是欠,好或过度确定(即,a的线性独立行的数量可以小于,等于或大于其线性独立列的数量) 。如果a是平方和满秩,则x(但是对于舍入误差)是等式的“精确”解。

参数:

a:(M,N)array_like

“系数”矩阵。

b:{(M,),(M,K)} array_like

纵坐标或“因变量”值。如果b是二维的,则对于b的每个K列计算最小二乘解。

rcond:float,可选

a的小奇异值的截止比。如果奇异值小于a的最大奇异值的rcond倍,则奇异值被设置为零。

返回:

x:{(N,),(N,K)} ndarray

最小二乘解。如果b是二维的,则解决方案在xK列中。

残差:{(),(1,),(K,)} ndarray

残差总和;在b - a * x中的每一列的平方欧几里得2-范数。如果a的秩为如果b是一维的,则这是一个(1,)形状数组。否则形状为(K,)。

rank:int

矩阵的秩a

s:(min(M,N),)ndarray

a的奇异值

上升:

LinAlgError

如果计算不收敛。

笔记

如果b是矩阵,则所有数组结果作为矩阵返回。

例子

适合一条线,y = mx + c t0 >,通过一些嘈杂的数据点:

>>> x = np.array([0, 1, 2, 3])
>>> y = np.array([-1, 0.2, 0.9, 2.1])

通过检查系数,我们看到线应该具有大约1的梯度,并且以或多或少-1切割y轴。

We can rewrite the line equation as y = Ap, where A = [[x 1]] and p = [[m], [c]]. 现在使用lstsq解决p

>>> A = np.vstack([x, np.ones(len(x))]).T
>>> A
array([[ 0.,  1.],
       [ 1.,  1.],
       [ 2.,  1.],
       [ 3.,  1.]])
>>> m, c = np.linalg.lstsq(A, y)[0]
>>> print(m, c)
1.0 -0.95

绘制数据与拟合线:

>>> import matplotlib.pyplot as plt
>>> plt.plot(x, y, 'o', label='Original data', markersize=10)
>>> plt.plot(x, m*x + c, 'r', label='Fitted line')
>>> plt.legend()
>>> plt.show()

源代码pngpdf

../../_images/numpy-linalg-lstsq-1.png