Шаг градиента для велопроката

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

Условие

Городской велопрокат оценивает длительность поездки по её длине. Для поездки с расстоянием x километров модель предсказывает длительность в минутах по формуле p = w*x + b.

Для одной выбранной поездки с известной фактической длительностью y используется функция потерь L = (y - p)^2. Производные этой функции равны dL/dw = -2*x*(y-p) и dL/db = -2*(y-p).

Нужно выполнить один стохастический шаг градиентного спуска только по поездке с номером k: w_new = w - eta*dL/dw, b_new = b - eta*dL/db. Остальные строки нужны только как журнал поездок и на вычисление не влияют. Длительность -1 означает пропуск, однако для поездки с номером k длительность всегда известна.

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

Формат ввода

В первой строке находятся два целых числа n и k — число поездок в журнале и номер поездки, по которой выполняется шаг.

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

В следующих n строках находятся два числа: x — расстояние поездки в километрах, и y — её фактическая длительность в минутах. Поездки нумеруются от 1 до n в порядке строк.

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

Выведите два числа w_new и b_new через пробел. Каждое число должно быть округлено до четырёх знаков после точки.

Ограничения

1 <= n <= 2000.

1 <= k <= n.

-10.00 <= w, b <= 10.00.

0.001 <= eta <= 0.200.

0.00 <= x <= 50.00, не более двух знаков после точки.

y равно -1 либо является целым числом от 0 до 300.

Для строки с номером k выполняется 0 <= y <= 300.

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

Куда дальше