NumPy参考 >例行程序 >线性代数(numpy.linalg) > numpy.linalg.lstsq
numpy.linalg.
lstsq
(a,b,rcond ='warn' )[源代码] ¶将最小二乘解返回线性矩阵方程。
通过计算最小化平方的欧几里德2范数的向量x求解方程
。该方程式可以是欠定的,良好的或过度确定的(即a的线性独立行的数量可以小于,等于或大于其线性独立列的数量)。如果a是正方形且具有全秩,则x(但针对四舍五入误差)是方程式的“精确”解。
“系数”矩阵。
普通或“因变量”值。如果b是二维的,则为b的K列中的每列计算最小二乘解。
a的小奇异值的截止比。对于等级确定的目的,如果是小于的奇异值被视为零rcond倍的最大奇异值一个。
在版本1.14.0中更改:如果未设置,则给出FutureWarning。以前的默认值-1
将使用机器精度作为rcond参数,新的默认值将使用机器精度乘以max(M,N)。要使警告静音并使用新的默认值,请使用rcond=None
,以继续使用旧的行为,请使用rcond=-1
。
最小二乘解。如果b是二维的,则解在x的K列中。
残差之和;的每个列的平方欧几里德2-范数
。如果秩一个是<N或M <= N,这是一个空数组。如果b为一维,则为(1,)形状数组。否则,形状为(K,)。b - a*x
矩阵a的等级。
奇异值的一个。
如果计算不收敛。
笔记
如果b是矩阵,则所有数组结果都作为矩阵返回。
例子
通过一些嘈杂的数据点拟合一条线:y = mx + c
>>> x = np.array([0, 1, 2, 3])
>>> y = np.array([-1, 0.2, 0.9, 2.1])
通过检查系数,我们看到该线应具有大约1的坡度,并将y轴或多或少地切为-1。
我们可以将线方程改写为,,
和。现在用于解决p:y = Ap
A = [[x 1]]
p = [[m], [c]]
lstsq
>>> 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()