【问题标题】:How to calculate sums of squares in Python?如何在 Python 中计算平方和?
【发布时间】:2019-08-26 15:20:40
【问题描述】:

首先,公式TSS = ESS + RSS 总是正确的吗?即使是指数模型?如果是的话,我只是不明白我哪里错了。

我有 2 个 x 和 y 值数组,其中 y 取决于 x。

x = np.array([1.5, 2.1, 2.4, 2.7, 3.2, 3.4, 3.6, 3.7, 4.0, 4.5, 5.1, 5.6])
y = np.array([0.6, 1.2, 1.3, 1.4, 1.45, 1.5, 1.6, 1.8, 1.9, 1.95, 2.1, 2.2])

我有一个函数可以确定系数 a 和 b 并返回一个线性回归方程(或者如果需要只返回 a 和 b)

def Linear(x, y, getAB = False):
    AVG_X = np.average(x)
    AVG_Y = np.average(y)
    DISP_X = np.var(x)
    DISP_Y = np.var(y)
    STD_X = np.std(x)
    STD_Y = np.std(y)

    AVG_prod = np.average(x*y)
    cov = AVG_prod - (AVG_X*AVG_Y)

    b = cov/DISP_X
    a = AVG_Y - b*AVG_X

    if getAB:
        return a, b

    return lambda X: a + b*X

我有一个函数可以确定系数 a 和 b 并返回指数回归方程

def Exponential(x, y, getAB = False):
    LOG_Y_array = [math.log(value) for value in y]

    A, B = Linear(x, LOG_Y_array, getAB = True)

    a = math.exp(A)
    b = math.exp(B)

    if getAB:
        return a, b

    return lambda X: a * (b**X)

我根据指数模型创建了计算出的 y 值数组

Exponential_Prediction = Exponential(x, y)
Exponential_Prediction_y = [Exponential_Prediction(value) for value in x]

最后,这就是我计算 TSS、ESS 和 RSS 的方式

TSS = np.sum((y - np.average(y))**2)
ESS_Exp = np.sum((Exponential_Prediction_y - np.average(y))**2)
RSS_Exp = np.sum((y-Exponential_Prediction_y)**2)

这一切都很清楚,除了这个的输出

print(str(TSS) + " = " + str(ESS_Exp) + " + " + str(RSS_Exp))

是 2.18166666667 = 2.75523753042 + 0.432362713806

我不明白 ESS 怎么可能超过 TSS

【问题讨论】:

  • 维基百科说 TSS = ESS + RSS 仅在某些条件下 en.wikipedia.org/wiki/Explained_sum_of_squares
  • @Vince W 我想在这种情况下,等式应该有效。通过获取公式 y = a*b^x 两边的对数,可以很容易地将这样的指数模型转换为简单的线性模型。维基百科说 TSS = ESS + RSS 对于简单的线性回归是正确的。至少我是这么看的。
  • 很遗憾,我不知道如何帮助您。我使用np.polyfit(x, y, 1) 和 np.polyfit(x, np.log(y), 1) 加倍检查了你的拟合度,我对线性情况和对数情况得到了相同的答案(注意我得到相同的@987654330 @ 与您的 Log 案例不同的 A,B)。如果 TSS = ESS + RSS 那么看起来你正在正确计算你的系数,这意味着你计算其余部分的方式一定有问题

标签: python numpy statistics regression data-science


【解决方案1】:

当您使用线性回归时,您缺少一个为零的项,因为您不是,所以您必须添加它。在 Vince 评论的链接中,您可以看到 TSS = ESS + RSS + 2*sum((y - yhat)*(yhat - ybar))。

您需要包含该额外术语才能使其相加:

extra_term = 2 * np.sum((y - Exponential_Prediction_y) * (Exponential_Prediction_y - y.mean())) 
print(str(TSS) + " = " + str(ESS_Exp) + " + " + str(RSS_Exp) + " + " + str(extra_term))

【讨论】:

  • 是的,谢谢。我没有计算线性模型的额外项,方程仍然有效。所以,我决定它不是真的需要。那是一个错误。指数模型需要它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-27
  • 2013-12-18
  • 2012-09-25
  • 1970-01-01
  • 2011-11-19
  • 2021-05-05
相关资源
最近更新 更多