为什么numpy最小二乘结果与使用直接公式不同?

Dol*_*ole 8 python numpy

我想计算给定数据的最小二乘估计.

有几种方法可以做到这一点,一种是使用numpy的最小二乘:

import numpy
np.linalg.lstsq(X,y)[0]
Run Code Online (Sandbox Code Playgroud)

其中X是矩阵和ya兼容维度的向量(float64类型).第二种方法是使用公式直接计算结果:

import numpy
numpy.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)
Run Code Online (Sandbox Code Playgroud)

我的问题:有些情况下,不同的公式给出截然不同的结果(尽管可能没有区别).有时使用一个公式,系数变得非常大,而另一个公式表现得更好.公式是一样的,那么为什么结果会如此分歧呢?这是某种类型的舍入错误,我该如何最小化它?

bpa*_*hev 5

虽然这两个公式在数学上是等价的,但它们在数值上并不相同!有更好的方法来解决线性方程组Ax = b,而不是将两边乘以A ^( - 1),就像高斯消元一样.numpy.linalg.lstsq使用这种(和更复杂的)方法来解决底层线性系统,并且它可以处理许多极端情况.所以尽可能使用它.

矩阵求逆在数值上非常不稳定.除非必须这样做,否则不要这样做.