我理解最小二乘解之和的想法。解的参数反映了使平方误差最小化的系数。但我无法理解 lstsq
提供的
numpy.linalg
功能。例如,我尝试了以下方法:
m1 = np.asarray([[1,2],[3,4],[5,6],[7,8]])
m2 = np.asarray([[9,10],[11,12],[13,14],[15,16]])
solution = np.linalg.lstsq(m1, m2)[0]
solution
的值为:
array([[-7., -8.],
[ 8., 9.]])
这个输出是什么意思?我无法想象/理解这个结果。
我会冒险出去。该方法返回方程
m
的 c
和 y=mx+c
。当您为 b
参数传递二维数组时,您会得到两个拟合 - 一个用于第一列,一个用于第二列;就像您要求两个不同数据集/向量的拟合一样。
In [22]: sol
Out[22]:
array([[-7., -8.],
[ 8., 9.]])
In [23]: sol[:,0], sol[:,1]
Out[23]: (array([-7., 8.]), array([-8., 9.]))
In [24]: np.linalg.lstsq(m1,m2[:,0])[0]
Out[24]: array([-7., 8.])
In [25]: np.linalg.lstsq(m1,m2[:,1])[0]
Out[25]: array([-8., 9.])
In [30]: np.linalg.lstsq(m1, np.array([9,11,13,15]))[0]
Out[30]: array([-7., 8.])
In [31]: np.linalg.lstsq(m1, np.array([10,12,14,16]))[0]
Out[31]: array([-8., 9.])
你的问题或多或少是一个数学问题。
np.linalg.lstsq(m1, m2)
找到 x
,使得 m1(x) = m2
,类似于求解 Ax = b
。
由于
m1
和 m2
都是 4 x 2,为了使左侧乘法兼容,x
应该是 2 x 2。
正如他们所说,唯一的真理来源是代码...... 因此,通过检查 lstsq 实现我们发现:
def lstsq(a, b, rcond='warn'):
"Computes the vector `x` that approximatively solves the equation ``a @ x = b``."
在你的例子中:
m1 = np.asarray([[1,2],[3,4],[5,6],[7,8]])
m2 = np.asarray([[9,10],[11,12],[13,14],[15,16]])
您正在尝试求解 m2 = m1 * p
你得到的答案是向量 p