numpy.linalg.lstsq#

linalg.lstsq(a, b, rcond=None)[源代码]#

返回线性矩阵方程的最小二乘解.

计算向量 x ,该向量近似解方程 a @ x = b .方程可能是欠定、适定或超定的(即,`a` 的线性独立行数可以小于、等于或大于其线性独立列数).如果 a 是方阵且满秩,则 x (但存在舍入误差)是方程的”精确”解.否则,`x` 最小化欧几里得 2-范数 \(||b - ax||\) .如果有多个最小化解,则返回具有最小 2-范数 \(||x||\) 的那个.

参数:
a(M, N) array_like

“系数”矩阵.

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

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

rcond浮点数, 可选

截断比率用于 a 的小奇异值.为了确定秩,如果奇异值小于 rcond 乘以 a 的最大奇异值,则将其视为零.默认使用机器精度乘以 max(M, N).传递 -1 将使用机器精度.

在 2.0 版本发生变更: 之前,默认值是 -1 ,但会给出警告,提示这将改变.

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

最小二乘解.如果 b 是二维的,解在 xK 列中.

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,并且大致在-1处与y轴相交.

我们可以将线方程重写为 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()
../../_images/numpy-linalg-lstsq-1.png