numpy.linalg.lstsq#
- linalg.lstsq(a, b, rcond=None)[source]#
返回线性矩阵方程的最小二乘解。
计算近似求解方程
a @ x = b
的向量 x。该方程可以是欠定的、适定的或超定的(即,a 的线性无关行的数量可以小于、等于或大于其线性无关列的数量)。如果 a 是方阵且满秩,则 x(除了舍入误差外)是该方程的“精确”解。否则,x 最小化欧几里得 2 范数 \(||b - ax||\)。如果有多个最小化解,则返回 2 范数 \(||x||\) 最小的解。- 参数:
- a(M, N) array_like
“系数”矩阵。
- b{(M,), (M, K)} array_like
纵坐标或“因变量”值。如果 b 是二维的,则为 b 的每个 K 列计算最小二乘解。
- rcondfloat,可选
a 的小奇异值的截止比率。为了确定秩的目的,如果奇异值小于 a 的最大奇异值的 rcond 倍,则将其视为零。默认值使用机器精度乘以
max(M, N)
。传递-1
将使用机器精度。版本 2.0 中的更改: 以前,默认值为
-1
,但会发出警告,说明这将更改。
- 返回值:
- x{(N,), (N, K)} ndarray
最小二乘解。如果 b 是二维的,则解位于 x 的 K 列中。
- residuals{(1,), (K,), (0,)} ndarray
残差平方和:
b - a @ x
中每一列的平方欧几里得 2 范数。如果 a 的秩 < N 或 M <= N,则这是一个空数组。如果 b 为一维,则形状为 (1,) 的数组。否则形状为 (K,)。- rankint
矩阵 a 的秩。
- s(min(M, N),) ndarray
a 的奇异值。
- 引发:
- LinAlgError
如果计算不收敛。
另请参阅
scipy.linalg.lstsq
SciPy 中的类似函数。
注释
如果 b 是矩阵,则所有数组结果都作为矩阵返回。
示例
拟合一条直线,
y = mx + c
,穿过一些带噪声的数据点>>> import numpy as np >>> x = np.array([0, 1, 2, 3]) >>> y = np.array([-1, 0.2, 0.9, 2.1])
通过检查系数,我们看到直线的梯度应该大约为 1,并且与 y 轴的交点或多或少为 -1。
我们可以将直线方程改写为
y = Ap
,其中A = [[x 1]]
和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] >>> m, c (1.0 -0.95) # may vary
绘制数据以及拟合的直线
>>> 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()