Как рассчитать суммы квадратов в Python? - PullRequest
1 голос
/ 04 апреля 2019

Во-первых, всегда ли формула 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,70523753042 + 0,432362713806

Я не понимаю, как ESS может быть больше, чем TSS

1 Ответ

1 голос
/ 05 апреля 2019

Вам не хватает термина, который равен нулю, когда вы используете линейную регрессию, так как это не так, вы должны добавить его. По ссылке, которую прокомментировал Винс, вы можете видеть, что 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...