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

#python #plot #mse

#python #график #mse

Вопрос:

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

Это мой df, называемый tips:

 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. Обратите внимание, что заданы значения theta_values . Обязательно пометьте оси на своем графике. Не забудьте использовать переменную tips, которую мы определили ранее.

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

plt.plot(mean_squared_error(theta_values, tips))
  

Это дает мне следующее:
Ошибка значения: не удалось передать операнды вместе с формами (244,) (100,)

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

Спасибо!

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

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

Ответ №1:

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

Используя

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

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

РЕДАКТИРОВАТЬ: для размещения обновления операционной системы, предполагая, что график должен быть квадратом ошибки (SE) против тета. Весь код для вычисления показан ниже; вместе с выводимым графиком. Напоминание, что отображается, — это ошибка в квадрате (т. Е. Ошибка между y_true (предполагается, что это tips) и 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()
  

График квадратов ошибок тэты и подсказок

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

1. Пожалуйста, посмотрите на редактирование, о котором идет речь, чтобы увидеть мой вывод с 244 вместо этого. Кроме того, ничего не отображается, «theta_values» является заданным, поэтому его вообще не следует трогать. Спасибо!

2. Тогда я думаю, что с вопросом что-то не так…. Сравнивать массивы разных размеров ненормально … прямо сейчас у вас есть массив tips размером (244,) и массив theta размером (100,). При попытке вычислить MSE между массивом «tips» и массивом «theta» у вас больше наблюдений в одном наборе данных, чем в другом, поэтому буквально эти дополнительные наблюдения нельзя сравнивать… я продолжу решать проблему построения графика, как если бы в массиве «тета» было (244,) значения

3. @user3085496 кроме того, вы сейчас пытаетесь отобразить «среднеквадратичную ошибку» , которая для набора данных представляет собой одно значение…. итак, если вы хотите отобразить MSE с одним значением , вы можете просто выполнить plt.bar(), чтобы получить гистограмму … если вы хотите отобразить, как изменяется ошибка в квадрате с помощью theta или какого-либо другого параметра, тогда вам нужно будет немного переписать свой код, но, пожалуйста, дайте мне знать, какую из этих целей вы хотитепытаемся достичь.

4. Я понял, как это сделать. Предполагается, что это plt.plot(theta_values, mean_squared_error(t, tips) для t в theta_values)