numpy.linalg.lstsq#
- linalg.lstsq(a, b, rcond=None)[源代码]#
返回线性矩阵方程的最小二乘解.
计算近似求解方程
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, optional
a 的小奇异值的截止比率.出于秩确定的目的,如果奇异值小于 rcond 乘以 a 的最大奇异值,则奇异值被视为零.默认值使用机器精度乘以
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 的奇异值.
- Raises:
- LinAlgError
如果计算不收敛.
参见
scipy.linalg.lstsqSciPy 中的类似函数.
注释
如果 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()