我想计算给定数据的最小二乘估计值。
有几种方法可以做到这一点,一种是使用 numpy 的最小二乘法:
import numpy
np.linalg.lstsq(X,y)[0]
其中 X 是矩阵,y 是兼容维度的向量(类型 float64)。第二种方式是直接使用公式计算结果:
import numpy
numpy.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)
我的问题:在某些情况下,不同的公式会给出截然不同的结果(尽管可能没有区别)。有时系数变得非常大,使用一个公式,而另一个表现得更好。公式是一样的,为什么结果会相差那么大呢?这是某种类型的舍入误差吗?我该如何最小化它?
最佳答案
虽然这两个公式在数学上是等价的,但它们在数值上不等价!有比两边都乘以 A^(-1) 更好的方法来求解线性方程组 Ax = b,例如 Gaussian Elimination . numpy.linalg.lstsq
使用这种(以及更复杂的)方法来求解底层线性系统,此外它还可以处理很多极端情况。所以尽可能使用它。
矩阵求逆在数值上非常不稳定。除非必须,否则不要这样做。
关于python - 为什么 numpy 最小二乘结果与使用直接公式不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38648730/