【问题标题】:Linear regression with near singular matrix inversion具有近似奇异矩阵求逆的线性回归
【发布时间】:2020-12-10 02:22:00
【问题描述】:

我有一个回归问题来估计y = a*x+b 的斜率,并尝试了两种不同的方法来计算a。方法一将两个数据簇的均值估计为两个点,据此计算a。方法2使用标准回归方程。

import numpy as np
import statistics

# find the slope a of y = a*x + b
x = "28.693756 28.850006 28.662506 28.693756 28.756256 28.662506 28.787506 \
    28.818756 28.818756 28.787506 28.787506 28.787506 28.693756 28.787506 \
    28.818756 28.725006 28.725006 28.850006 28.756256 28.725006 28.881256 \
    28.818756 28.756256 28.693756 28.756256 28.787506 28.693756 28.662506 \
    28.662506 28.787506 28.850006 28.756256 28.725006 28.818756 28.600006 \
    28.725006 28.725006 28.850006 28.881256 28.881256 28.818756 28.756256 \
    28.756256 28.787506 28.787506 28.787506 28.756256 28.787506 28.725006 \
    28.725006 28.725006 28.756256 28.818756 28.756256 28.693756 28.818756 \
    28.756256 28.756256 28.693756 28.850006 28.631256 28.693756 28.693756 \
    28.850006 28.756256 28.725006 28.693756 28.756256 28.850006 28.787506 \
    28.600006 28.631256"
x = [float(t) for t in x.split()]
y = [33.8]*36 + [38.7]*36

print(" ")
print("Method 1 ")
x1, x2 = statistics.mean(x[:36]), statistics.mean(x[36:])
y1, y2 = statistics.mean(y[:36]), statistics.mean(y[36:])
slope = (y1-y2)/(x1-x2)
print(f"a = {slope}")

print(" ")
print('Method 2')
x = np.array(x)
y = np.array(y)
X = np.c_[np.ones(x.shape), x]

XXinv = np.linalg.inv(X.transpose().dot(X)).dot(X.transpose())
_beta = XXinv.dot(y)
iv = np.linalg.inv(X.transpose().dot(X)).tolist()
print(f"a = {_beta[1]}")

xx = X.transpose().dot(X)
svd = np.linalg.svd(xx)[1]
print(f"SVD(XX) = {svd}")

代码的结果是:

Method 1
a = 1128.9599999997959

Method 2
a = 1.2136744782028899
SVD(XX) = [5.96125150e+04 3.80959618e-04]

从数据图中,线应该接近垂直线性,方法 1 的结果比方法 2 更有意义。此外,即使数据斜率最小的线(如图所示)也有 17.5 的斜率。对于正常情况,方法 2 效果很好。但是在这种情况下,它给出了 1.21 的如此小的斜率,这是没有意义的。

我能想到的唯一原因是 SVD 值中显示的近奇点。但为什么?或任何修复?

【问题讨论】:

    标签: linear-regression linear-algebra svd coefficients singular


    【解决方案1】:

    您的线性方程组是超定的(方程多于未知数),因此没有精确解。方法 2 的解决方案是“最佳拟合”,可以最大限度地减少预测值和实际值之间的平方误差。

    用解决方案 1 获得的直线在视觉上似乎更合适,但从数学上讲,它并不能最小化平方误差。原因是某些点(例如 28.600006、38.7)与预测线相距甚远,该误差在平方后将显着影响平方误差之和 (SSE),而回归试图将其最小化。

    相反,通过拟合斜率为 1.21367 的“中间”线,回归可避免非常大的误差并产生“中等大小”的误差,当平方时,可最小化 SSE。但是,从视觉角度来看,结果线似乎与解决方案 1 一样不适合数据点。

    【讨论】:

    • 感谢您的回复。您基于 dy 的 SSE 观点解决了我的困惑。我忘记了回归正在最小化 dy 的 SSE。现在我也知道我的问题的解决方法是使用到线的距离作为错误而不是使用 dy。对于所有线性回归问题,这对于处理奇异或接近奇异的情况可能也是一个不错的选择。
    • 是的,在这种情况下Orthogonal Distance Regression会给你更好的结果。
    猜你喜欢
    • 1970-01-01
    • 2018-02-17
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-26
    • 1970-01-01
    相关资源
    最近更新 更多