原文:https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.lstsq.html
校对:(虚位以待)
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
rcond:float,可选
|
---|---|
返回: | x:{(N,),(N,K)} ndarray
残差:{(),(1,),(K,)} ndarray
rank:int
s:(min(M,N),)ndarray
|
上升: | 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()