linalg.
lstsq
将最小二乘法返回到线性矩阵方程。
计算近似求解方程的向量x a @ x = b . 方程可以是欠定、好定或过定(即线性独立的行数) a 独立于或小于它的列数。如果 a 是方形的,并且是满等级的,那么 x (但对于舍入误差)是方程的“精确”解。否则, x 最小化欧氏2范数 .
a @ x = b
“系数”矩阵。
坐标或“因变量”值。如果 b 是二维的,最小二乘解是为每个 K 列 b .
小奇异值的截止比 a . 为了确定等级,如果奇异值小于 rcond 乘以最大奇异值 a .
在 1.14.0 版更改: 如果未设置,则给出未来警告。先前的违约 -1 将机器精度用作 rcond 参数,新默认值将使用机器精度时间 max(M, N) . 要使警告静音并使用新的默认值,请使用 rcond=None ,若要继续使用旧行为,请使用 rcond=-1 .
-1
rcond=None
rcond=-1
最小二乘法。如果 b 是二维的,解在 K 列 x .
残差平方和:中每列的欧氏2范数平方 b - a @ x . 如果排名 a 小于n或m小于等于n,这是一个空数组。如果 b 是一维的,这是一个(1,1)形状数组。否则,形状为(k,)。
b - a @ x
矩阵秩 a .
的奇异值 a .
如果计算不收敛。
参见
scipy.linalg.lstsq
在SciPy中有类似的功能。
笔记
如果 b 是一个矩阵,然后所有数组结果都作为矩阵返回。
实例
安装一条线, y = mx + c ,通过一些噪声数据点:
y = mx + c
>>> 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 :
y = Ap
A = [[x 1]]
p = [[m], [c]]
>>> 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, rcond=None)[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()