Как построить среднеквадратичную ошибку из созданных функций?

Я пытаюсь построить среднеквадратичную ошибку для разных тета-значений.

Это мой df, называемый подсказками:

tips = array([ 1.01,  1.66,  3.5 ,  3.31,  3.61,  4.71,  2.  ,  3.12,  1.96,
            3.23,  1.71,  5.  ,  1.57,  3.  ,  3.02,  3.92,  1.67,  3.71,
            3.5 ,  3.35,  4.08,  2.75,  2.23,  7.58,  3.18,  2.34,  2.  ,
            2.  ,  4.3 ,  3.  ,  1.45,  2.5 ,  3.  ,  2.45,  3.27,  3.6 ,
            2.  ,  3.07,  2.31,  5.  ,  2.24,  2.54,  3.06,  1.32,  5.6 ,
            3.  ,  5.  ,  6.  ,  2.05,  3.  ,  2.5 ,  2.6 ,  5.2 ,  1.56,
            4.34,  3.51,  3.  ,  1.5 ,  1.76,  6.73,  3.21,  2.  ,  1.98,
            3.76,  2.64,  3.15,  2.47,  1.  ,  2.01,  2.09,  1.97,  3.  ,
            3.14,  5.  ,  2.2 ,  1.25,  3.08,  4.  ,  3.  ,  2.71,  3.  ,
            3.4 ,  1.83,  5.  ,  2.03,  5.17,  2.  ,  4.  ,  5.85,  3.  ,
            3.  ,  3.5 ,  1.  ,  4.3 ,  3.25,  4.73,  4.  ,  1.5 ,  3.  ,
            1.5 ,  2.5 ,  3.  ,  2.5 ,  3.48,  4.08,  1.64,  4.06,  4.29,
            3.76,  4.  ,  3.  ,  1.  ,  4.  ,  2.55,  4.  ,  3.5 ,  5.07,
            1.5 ,  1.8 ,  2.92,  2.31,  1.68,  2.5 ,  2.  ,  2.52,  4.2 ,
            1.48,  2.  ,  2.  ,  2.18,  1.5 ,  2.83,  1.5 ,  2.  ,  3.25,
            1.25,  2.  ,  2.  ,  2.  ,  2.75,  3.5 ,  6.7 ,  5.  ,  5.  ,
            2.3 ,  1.5 ,  1.36,  1.63,  1.73,  2.  ,  2.5 ,  2.  ,  2.74,
            2.  ,  2.  ,  5.14,  5.  ,  3.75,  2.61,  2.  ,  3.5 ,  2.5 ,
            2.  ,  2.  ,  3.  ,  3.48,  2.24,  4.5 ,  1.61,  2.  , 10.  ,
            3.16,  5.15,  3.18,  4.  ,  3.11,  2.  ,  2.  ,  4.  ,  3.55,
            3.68,  5.65,  3.5 ,  6.5 ,  3.  ,  5.  ,  3.5 ,  2.  ,  3.5 ,
            4.  ,  1.5 ,  4.19,  2.56,  2.02,  4.  ,  1.44,  2.  ,  5.  ,
            2.  ,  2.  ,  4.  ,  2.01,  2.  ,  2.5 ,  4.  ,  3.23,  3.41,
            3.  ,  2.03,  2.23,  2.  ,  5.16,  9.  ,  2.5 ,  6.5 ,  1.1 ,
            3.  ,  1.5 ,  1.44,  3.09,  2.2 ,  3.48,  1.92,  3.  ,  1.58,
            2.5 ,  2.  ,  3.  ,  2.72,  2.88,  2.  ,  3.  ,  3.39,  1.47,
            3.  ,  1.25,  1.  ,  1.17,  4.67,  5.92,  2.  ,  2.  ,  1.75,
            3.  ])

Это моя квадратичная функция потерь:

def squared_loss(y_obs, theta):
"""
Calculate the squared loss of the observed data and a summary statistic.

Parameters
------------
y_obs: an observed value
theta : some constant representing a summary statistic

Returns
------------
The squared loss between the observation and the summary statistic.
"""
return (y_obs - theta) ** 2

Это моя функция среднеквадратичной ошибки:

def mean_squared_error(theta, data):
    
    return sum(squared_loss(data, theta)) / len(data)

Вот в чем проблема: в ячейке ниже постройте среднеквадратичную ошибку для разных значений тета. Обратите внимание, что заданы значения theta_values. Не забудьте пометить оси на графике. Не забудьте использовать переменную tip, которую мы определили ранее.

theta_values = np.linspace(0, 6, 100)

plt.plot(mean_squared_error(theta_values, tips))

Это дает мне следующее: ValueError: операнды не могут быть переданы вместе с формами (244,) (100,)

Если график правильный, наблюдаемая точка минимизации должна быть 3. Кто-нибудь знает, что я могу сделать, чтобы мой график появился? Я думал что-то вроде цикла for, но не совсем уверен.

Спасибо!

Редактировать: попытка 244 в theta_values, хотя theta_values ​​должна быть задана и не трогаться.

введите здесь описание изображения


person user3085496    schedule 23.09.2020    source источник


Ответы (1)


Ошибка возникает из-за того, что вы пытаетесь передать 2 массива разных размеров, используя функцию среднеквадратичной ошибки. Ваши подсказки df имеют размер 244, и когда вы создали свой массив theta values, вы установили его равным 100 равноотстоящим значениям от 0 до 6, в результате чего размер равен 100.

Используя

theta_values = np.linspace(0, 6, 244)

вы создадите переменную theta_values с 244 значениями, которая будет правильно отображаться в кадре данных подсказок и не вызовет проблем при расчете вашего MSE.

РЕДАКТИРОВАТЬ: Чтобы приспособиться к обновлению OP, предполагая, что график предназначен для квадрата ошибки (SE) по сравнению с тета. Весь код для вычисления показан ниже; вместе с выходным графиком. Напоминаем, что на графике изображена ошибка в квадрате (т. е. ошибка между y_true (предполагается, что это советы) и y_pred (предполагается, что это тета) в квадрате) по сравнению с тета. Выходные данные, кажется, показывают меньше колебаний вокруг 3 (как предлагает OP), но требуется больше разъяснений от OP.

import numpy as np
import matplotlib.pyplot as plt

tips = np.array([ 1.01,  1.66,  3.5 ,  3.31,  3.61,  4.71,  2.  ,  3.12,  1.96,
               3.23,  1.71,  5.  ,  1.57,  3.  ,  3.02,  3.92,  1.67,  3.71,
               3.5 ,  3.35,  4.08,  2.75,  2.23,  7.58,  3.18,  2.34,  2.  ,
               2.  ,  4.3 ,  3.  ,  1.45,  2.5 ,  3.  ,  2.45,  3.27,  3.6 ,
               2.  ,  3.07,  2.31,  5.  ,  2.24,  2.54,  3.06,  1.32,  5.6 ,
               3.  ,  5.  ,  6.  ,  2.05,  3.  ,  2.5 ,  2.6 ,  5.2 ,  1.56,
               4.34,  3.51,  3.  ,  1.5 ,  1.76,  6.73,  3.21,  2.  ,  1.98,
               3.76,  2.64,  3.15,  2.47,  1.  ,  2.01,  2.09,  1.97,  3.  ,
               3.14,  5.  ,  2.2 ,  1.25,  3.08,  4.  ,  3.  ,  2.71,  3.  ,
               3.4 ,  1.83,  5.  ,  2.03,  5.17,  2.  ,  4.  ,  5.85,  3.  ,
               3.  ,  3.5 ,  1.  ,  4.3 ,  3.25,  4.73,  4.  ,  1.5 ,  3.  ,
               1.5 ,  2.5 ,  3.  ,  2.5 ,  3.48,  4.08,  1.64,  4.06,  4.29,
               3.76,  4.  ,  3.  ,  1.  ,  4.  ,  2.55,  4.  ,  3.5 ,  5.07,
               1.5 ,  1.8 ,  2.92,  2.31,  1.68,  2.5 ,  2.  ,  2.52,  4.2 ,
               1.48,  2.  ,  2.  ,  2.18,  1.5 ,  2.83,  1.5 ,  2.  ,  3.25,
               1.25,  2.  ,  2.  ,  2.  ,  2.75,  3.5 ,  6.7 ,  5.  ,  5.  ,
               2.3 ,  1.5 ,  1.36,  1.63,  1.73,  2.  ,  2.5 ,  2.  ,  2.74,
               2.  ,  2.  ,  5.14,  5.  ,  3.75,  2.61,  2.  ,  3.5 ,  2.5 ,
               2.  ,  2.  ,  3.  ,  3.48,  2.24,  4.5 ,  1.61,  2.  , 10.  ,
               3.16,  5.15,  3.18,  4.  ,  3.11,  2.  ,  2.  ,  4.  ,  3.55,
               3.68,  5.65,  3.5 ,  6.5 ,  3.  ,  5.  ,  3.5 ,  2.  ,  3.5 ,
               4.  ,  1.5 ,  4.19,  2.56,  2.02,  4.  ,  1.44,  2.  ,  5.  ,
               2.  ,  2.  ,  4.  ,  2.01,  2.  ,  2.5 ,  4.  ,  3.23,  3.41,
               3.  ,  2.03,  2.23,  2.  ,  5.16,  9.  ,  2.5 ,  6.5 ,  1.1 ,
               3.  ,  1.5 ,  1.44,  3.09,  2.2 ,  3.48,  1.92,  3.  ,  1.58,
               2.5 ,  2.  ,  3.  ,  2.72,  2.88,  2.  ,  3.  ,  3.39,  1.47,
               3.  ,  1.25,  1.  ,  1.17,  4.67,  5.92,  2.  ,  2.  ,  1.75,
               3.  ])

theta_values = np.linspace(0, 6, 244)


def sqr_err(y_true, y_pred):
    """

    :param y_true: true values of y
    :param y_pred: predicted values of y
    :return: array of lenght original data containing mean squared error for each predictions
    """
    if len(y_true) != len(y_pred):
        raise IndexError("Mismathced array sizes, you inputted arrays with sizes {} and {}".format(len(y_true),
                                                                                                  len(y_pred)))
    else:
        length = len(y_true)

    sqrerror_out = [(y_pred[i]-y_true[i])**2 for i in range(length)]

    return np.array(sqrerror_out)


theta_value = np.linspace(0, 6, 244)

Squared_error = sqr_err(tips, theta_value)

plt.figure()
plt.plot(theta_values, Squared_error)
plt.xlabel('Theta Values')
plt.ylabel('Squared Error')
plt.show()

График квадрата ошибки тета и советы

person Taylr Cawte    schedule 23.09.2020
comment
Пожалуйста, посмотрите на рассматриваемое редактирование, чтобы увидеть вместо этого мой вывод с 244. Кроме того, ничего не появляется, theta_values ​​задано, поэтому его вообще не следует трогать. Спасибо! - person user3085496; 23.09.2020
comment
Тогда я думаю, что с вопросом что-то не так... Сравнение массивов разного размера - это ненормально... прямо сейчас у вас есть массив подсказок размера (244) и массив тета размера (100). Если вы пытаетесь вычислить MSE между подсказками и тета-массивом, у вас больше наблюдений в одном наборе данных, чем в другом, поэтому буквально эти дополнительные наблюдения нельзя сравнивать... я продолжу решать задачу построения графика, как если бы (244, ) значения в массиве тета - person Taylr Cawte; 24.09.2020
comment
@ user3085496 Кроме того, вы прямо сейчас пытаетесь построить график среднеквадратичной ошибки, которая для набора данных представляет собой одиночное значение.... поэтому, если вы хотите построить график единичного значения MSE вы можете просто выполнить plt.bar(), чтобы получить гистограмму... если вы хотите построить график изменения квадрата ошибки с тета или каким-либо другим параметром тогда вам нужно будет немного переписать свой код, но, пожалуйста, дайте мне знать, какую из этих целей вы пытаетесь достичь. - person Taylr Cawte; 24.09.2020
comment
Я понял, как это сделать. Предполагается, что это plt.plot(theta_values, mean_squared_error(t, Tips) для t в theta_values) - person user3085496; 24.09.2020