当 x = y 时,Numpy 和 R 在线性回归中给出非零截距
Numpy and R give non-zero intercept in linear regression when x = y
我正在测试一些代码,除其他外,这些代码对某些数据运行 y = m * x + b
形式的线性回归。为简单起见,我将 x 和 y 数据设置为彼此相等,期望模型 return 斜率为 1,截距为 0。然而,这不是我所看到的。这是一个超级简单的例子,主要取自 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(我的 "native" 语言)中进行了尝试,并观察到类似的结果:
> 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
我的问题是,为什么以及在什么情况下会发生这种情况?它是寻找完美拟合模型的产物,还是回归输出中总是添加了一些我们通常看不到的噪声?在这种情况下,答案几乎肯定足够接近于零,所以我主要是出于学术好奇心。但是,我也想知道在某些情况下是否可以将这种影响放大到相对于数据而言是非平凡的。
我现在可能已经透露了这一点,但我对低级编程语言基本不了解,虽然我曾经粗略地了解如何进行这种线性代数"by hand",它早已从我脑海中消失了。
我正在测试一些代码,除其他外,这些代码对某些数据运行 y = m * x + b
形式的线性回归。为简单起见,我将 x 和 y 数据设置为彼此相等,期望模型 return 斜率为 1,截距为 0。然而,这不是我所看到的。这是一个超级简单的例子,主要取自 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(我的 "native" 语言)中进行了尝试,并观察到类似的结果:
> 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
我的问题是,为什么以及在什么情况下会发生这种情况?它是寻找完美拟合模型的产物,还是回归输出中总是添加了一些我们通常看不到的噪声?在这种情况下,答案几乎肯定足够接近于零,所以我主要是出于学术好奇心。但是,我也想知道在某些情况下是否可以将这种影响放大到相对于数据而言是非平凡的。
我现在可能已经透露了这一点,但我对低级编程语言基本不了解,虽然我曾经粗略地了解如何进行这种线性代数"by hand",它早已从我脑海中消失了。