Ошибка отзывов до и после шага градиента

тема: Градиентный шаг · уровень: средний

Условие

Для отзывов мобильного приложения известны число отметок «полезно» и оценка пользователя от 1 до 5. Часть пользователей не указала оценку. Такие отзывы остаются во входных данных, но не участвуют в обучении и вычислении ошибки.

Модель предсказывает оценку отзыва по формуле p_i = w * x_i + b, где x_i — число отметок «полезно», w — вес, b — свободный коэффициент. Для отзывов с известной оценкой используется среднеквадратичная ошибка

L(w, b) = (1 / m) * Σ(p_i - y_i)^2,

где сумма берётся по m отзывам с известной оценкой y_i.

Нужно вычислить значение функции потерь до одного шага градиентного спуска и после него. Производные функции потерь равны

dL/dw = (2 / m) * Σ((p_i - y_i) * x_i),

dL/db = (2 / m) * Σ(p_i - y_i).

Шаг выполняется одновременно для обоих параметров: w_new = w - eta * dL/dw, b_new = b - eta * dL/db. Если значения функции потерь до и после шага точно равны, всё равно следует вывести оба значения в указанном порядке.

Формат ввода

В первой строке дано целое число n — число отзывов.

Во второй строке через пробел даны вещественные числа w, b и eta — начальные параметры модели и скорость обучения.

В следующих n строках даны x_i и y_i через пробел. x_i — целое число отметок «полезно». Значение y_i является целой оценкой от 1 до 5 либо символом -, если оценка отсутствует.

Формат вывода

Выведите через пробел два числа: значение функции потерь до шага и значение функции потерь после шага.

Каждое число необходимо округлить до четырёх знаков после десятичной точки. Если пятый знак после точки равен 5 или больше, четвёртый знак увеличивается на 1.

Ограничения

1 ≤ n ≤ 2000.

0 ≤ x_i ≤ 100.

Для известной оценки 1 ≤ y_i ≤ 5.

Хотя бы у одного отзыва оценка известна, поэтому m ≥ 1 и деления на ноль не возникает.

-1.0000 ≤ w, b ≤ 1.0000.

0.0000 ≤ eta ≤ 0.0100.

Длина записи оценки не превосходит 1 символа.

Решить задачу с автопроверкой на Python →

Куда дальше