Как вычислить суммы квадратов в Python?

#python #numpy #statistics #regression #data-science

#python #numpy #Статистика #регрессия #наука о данных

Вопрос:

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

Комментарии:

1. В Википедии говорится, что TSS = ESS RSS только при определенных условиях en.wikipedia.org/wiki/Explained_sum_of_squares

2. @Vince W Я полагаю, в этом случае уравнение должно сработать. Подобная экспоненциальная модель может быть легко преобразована в простую линейную модель путем получения логарифма обеих частей формулы y = a * b ^ x . И википедия говорит, что TSS = ESS RSS верно для простой линейной регрессии. По крайней мере, я так это вижу.

3. К сожалению, я не знаю, как вам помочь. Я дважды проверил ваши соответствия с помощью np.polyfit(x, y, 1) и np.polyfit (x, np.log (y), 1) и я получаю тот же ответ для вашего линейного случая, а также для вашего логарифмического случая (обратите внимание, что я получаю то же самое, a,b не совпадающее A,B , для вашего логарифмического случая). Если TSS = ESS RSS, то, похоже, вы правильно вычисляете свои коэффициенты, что означает, что должно быть что-то неправильное в том, как вы вычисляете остальные

Ответ №1:

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

Комментарии:

1. Правильно, спасибо. Я не вычислял дополнительный член для линейной модели, и уравнение все еще работало. Итак, я решил, что это действительно не нужно. Это была ошибка. Это необходимо для экспоненциальной модели.