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

Python 当x=y时,Numpy和R在线性回归中给出非零截距,python,r,numpy,linear-algebra,linear-regression,Python,R,Numpy,Linear Algebra,Linear Regression,我正在测试一些代码,其中包括对一些数据运行线性回归,形式为y=m*x+b。为了简单起见,我将x和y数据设置为彼此相等,期望模型返回1表示斜率,0表示截距。然而,这不是我所看到的。这里有一个非常简单的例子,主要取自 Numpy找到了最佳拟合的真实直线的准确斜率(1),但报告了一个截距,虽然很小,但不是零。此外,即使数据可以由线性方程y=1*x+0完美建模,但由于找不到该精确方程,numpy报告了一个微小但非零的残值 作为一种理智的检查,我用R(我的“母语”)尝试了这一点,并观察到类似的结果: &g

我正在测试一些代码,其中包括对一些数据运行线性回归,形式为
y=m*x+b
。为了简单起见,我将x和y数据设置为彼此相等,期望模型返回1表示斜率,0表示截距。然而,这不是我所看到的。这里有一个非常简单的例子,主要取自

Numpy找到了最佳拟合的真实直线的准确斜率(1),但报告了一个截距,虽然很小,但不是零。此外,即使数据可以由线性方程
y=1*x+0
完美建模,但由于找不到该精确方程,numpy报告了一个微小但非零的残值

作为一种理智的检查,我用R(我的“母语”)尝试了这一点,并观察到类似的结果:

> 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 
>xylm(y~x)
电话:
lm(公式=y~x)
系数:
(截距)x
-3.972e-16 1.000e+00
我的问题是,为什么以及在什么情况下会发生这种情况?这是一个寻找完美拟合模型的人工制品,还是总是有一点点我们通常看不到的噪声添加到回归输出中?在这种情况下,答案几乎肯定接近于零,所以我主要受学术好奇心的驱使。然而,我也想知道,在某些情况下,相对于数据,这种影响是否会被放大到不寻常的程度


我现在可能已经揭示了这一点,但我基本上不了解低级编程语言,虽然我曾经对如何“手工”完成这类线性代数有过粗略的理解,但它早已从我的脑海中消失。

它看起来像数字错误,y截距非常小

Python(包括numpy)默认情况下使用双精度浮点数。这些数字的格式为52位系数(有关浮点解释和“base”的科学符号解释,请参阅)


在你的例子中,你发现了~4e-16的y截距。事实证明,52位系数的精度大约为2e-16。基本上,在回归中,你从相似的东西中减去一个1级的数字,得到了双浮点的数值精度。

我认为这基本上是正确的。看看
2-(sqrt(2)^2)
,根据@user20650的评论和随后的研究,这似乎是正确的答案。。。但它实在太简单了,没有多大用处。因为已经两周了,我想接受一个答案,但是如果你能更新一下,让它更具解释性和实用性,我将不胜感激。
> 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