#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)