numpy.linalg.lstsq¶
-
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是二维的,则解决方案在x的K列中。
残差:{(),(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
, whereA = [[x 1]]
andp = [[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()