我理解最小二乘解之和的想法。解的参数反映了使平方误差最小化的系数。但我无法理解
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.]])
这个输出是什么意思?我无法想象/理解这个结果。
NumPy 中的
lstsq
函数用于找出线性方程组的最小二乘解。虽然你给出的例子是矩阵方程 (
mX = b
),但让我们先从更简单的线性方程组来理解这个输出:
分解一下
假设你有以下方程组:
x + 2y = 9
3x + 4y = 11
5x + 6y = 13
7x + 8y = 15
这个方程组可以用矩阵形式表示为
mX = b
:
-
m
(系数矩阵):[[1, 2], [3, 4], [5, 6], [7, 8]]
-
X
(未知数向量):[[x], [y]]
-
b
(常数向量):[[9], [11], [13], [15]]
lstsq 的作用
在这个问题中,没有一个
x
和
y
的解能够完全满足所有四个方程。
lstsq
的作用是找到
x
和
y
的值,使所有方程的误差的平方和最小。这也被称为“拟合最佳直线”(如果我们将方程绘制在图表上)。
解的解释
你得到的
solution
数组:
array([[-7., -8.],
[ 8., 9.]])
代表
解矩阵
的
两列
。要理解这一点,最好把原始问题想象成是解出两个独立的线性方程组,其中
m1
保持不变,但
m2
被分成两列:
-
第一个方程组:
m1 * X1 = m2[:, 0]
(基本上是解出x
的系数) -
第二个方程组:
m1 * X2 = m2[:, 1]
(基本上是解出y
的系数)
lstsq
返回的每一列都对应于这些独立方程组的最小二乘解。所以:
-
solution[:, 0]
([-7., 8.]
) 是使m1 * X = m2[:, 0]
的误差最小的X1
(即x
的系数)。 -
solution[:, 1]
([-8., 9.]
) 是使m1 * X = m2[:, 1]
的误差最小的X2
(即y
的系数)。
总之:
lstsq
没有给出单一的解向量,而是给出了解矩阵,其中每一列代表原始方程组每一列的最小二乘解。