当x = y时,Numpy和R在线性回归中给出非零截距

时间:2015-03-26 15:01:13

标签: python r numpy linear-algebra linear-regression

我正在测试一些代码,其中包括对某些数据运行形式y = m * x + b的线性回归。为了简单起见,我将x和y数据设置为彼此相等,期望模型返回一个用于斜率,零返回为截距。但是,这不是我所看到的。这是一个超级简化的示例,主要来自numpy docs:

>>> y = np.arange(5)
>>> x = np.arange(5)
>>> A = np.vstack([x, np.ones(5)]).T
>>> np.linalg.lstsq(A, y)
(array([  1.00000000e+00,  -8.51331872e-16]), array([  7.50403936e-31]), 2, array([ 5.78859314,  1.22155205]))
>>> #     ^slope           ^intercept                  ^residuals        ^rank    ^singular values

Numpy找到最佳拟合线(一)的确切斜率,但报告截距虽然非常小,但不是零。此外,即使数据可以通过线性方程y = 1 * x + 0完美建模,因为没有找到这个精确的方程,numpy会报告一个微小但非零的残差值。

作为一个完整性检查,我在R(我的"本地语言#34;语言)中尝试了这一点,并观察到类似的结果:

> x <- c(0 : 4)
> y <- c(0 : 4)
> lm(y ~ x)

Call:
lm(formula = y ~ x)

Coefficients:
(Intercept)            x  
 -3.972e-16    1.000e+00 

我的问题是,为什么以及在什么情况下会发生这种情况?它是寻找具有完美契合度的模型的神器,还是总是有一点点噪声添加到回归输出中,我们通常只是看不到?在这种情况下,答案几乎肯定足够接近于零,所以我主要受到学术好奇心的驱使。但是,我也想知道是否存在这种效应可以放大到相对于数据而言非常重要的情况。

我现在可能已经透露了这一点,但我基本上不了解低级编程语言,而我曾经粗略地理解如何做这种线性代数&#34;手工和#34;,它早就消失了。

1 个答案:

答案 0 :(得分:3)

看起来像数字误差,y截距非常小。

Python和包含的numpy默认使用双精度浮点数。这些数字被格式化为具有52位系数(对于浮点解释,请参见this,对于&#34; base&#34;的科学记数法解释,请this。)

在你的情况下,你发现了~4e-16的y轴截距。事实证明,52位系数的精度大约为2e-16。基本上,在回归中,你从类似于自身的东西中减去1的数字,并且达到双浮点的数值精度。