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

标签 python r numpy linear-algebra linear-regression

我正在测试一些代码,其中除其他外,运行 y = m * x + b 形式的线性回归。就一些数据而言。为了简单起见,我将 x 和 y 数据设置为彼此相等,期望模型返回斜率 1 和截距 0。然而,我所看到的并非如此。这是一个 super 精简的示例,主要取自 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 找到最佳拟合线的精确斜率(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 

我的问题是,为什么以及在什么情况下会发生这种情况?这是寻找完美拟合模型的产物,还是回归输出中总是添加了我们通常看不到的一点噪音?在这种情况下,答案几乎肯定足够接近于零,所以我主要是受到学术好奇心的驱动。但是,我也想知道是否存在这种影响相对于数据而言不平凡的情况。

我现在可能已经透露了这一点,但我基本上对底层编程语言一无所知,虽然我曾经粗略地了解过如何“手工”进行这种线性代数,但它已经很久了以前的事已经从我的脑海中消失了。

最佳答案

看起来是数值错误,y轴截距非常小。

Python(包括 numpy)默认使用 double float 。这些数字被格式化为具有 52 位系数(有关浮点解释,请参阅 this,有关“基数”的科学计数法解释,请参阅 this)

就您的情况而言,您发现 y 轴截距约为 4e-16。事实证明,52 位系数的精度大约为 2e-16。基本上,在回归中,您从与自身非常相似的数字中减去 1 数量级的数字,并达到双浮点的数值精度。

关于python - 当 x = y 时,Numpy 和 R 在线性回归中给出非零截距,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29281817/

相关文章:

python - 使用paramiko检查与远程主机的连接是否存在

r - 使用 org-mode 构建分析

python - 具有 3 个电阻值的公差叠加组合

css - 使用 CallBack 或其他方式突出显示 Shiny DataTable 中的行

python - 转换为 FEATHER 文件会创建巨大的文件

python - 在 numpy 中计算矩阵积的轨迹的最佳方法是什么?

python - 检查数组是否是数组列表的元素

python - 如何在Python中计算两个词的意思距离

python - 错误 : video system not initialized (kivy, ipython)

python - 用python画动态图