Шаг градиента для прогноза кешбэка

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

Условие

Сеть супермаркетов строит простую модель для прогноза размера кешбэка по чеку. В первой таблице содержится число товаров, участвующих в акции, а во второй — фактически начисленный кешбэк. Строки второй таблицы могут идти в другом порядке.

Для чека с числом акционных товаров $x_i$ модель предсказывает кешбэк $\hat y_i = wx_i + b$. Некоторые чеки ещё не обработаны программой лояльности: для них во второй таблице указано NA. Такие чеки не участвуют в вычислении функции потерь и градиента.

Пусть $S$ — множество чеков, для которых известен кешбэк, а $k=|S|$. Функция потерь с L2-регуляризацией имеет вид

$$L(w,b)=\frac{1}{k}\sum_{i\in S}(wx_i+b-y_i)^2+\lambda w^2.$$

Необходимо выполнить ровно один шаг градиентного спуска с коэффициентом обучения $\eta$:

$$w_{new}=w-\eta\left(\frac{2}{k}\sum_{i\in S}(wx_i+b-y_i)x_i+2\lambda w\right),$$

$$b_{new}=b-\eta\left(\frac{2}{k}\sum_{i\in S}(wx_i+b-y_i)\right).$$

Вывести $w_{new}$ и $b_{new}$ в этом порядке через пробел. Каждое число округляется до четырёх знаков после точки по правилу ближайшего значения, а при ровно половинном случае — в сторону удаления от нуля. Если после округления получается ноль, он выводится без знака минус.

При равенстве каких-либо значений предпочтение не выбирается: оба обновлённых параметра всегда выводятся в порядке $w_{new}$, затем $b_{new}$.

Формат ввода

В первой строке дано целое число $n$ — число чеков в каждой из двух таблиц.

Во второй строке через пробел даны четыре вещественных числа: начальные параметры $w$, $b$, коэффициент обучения $\eta$ и коэффициент регуляризации $\lambda$.

В следующих $n$ строках дана первая таблица. Каждая строка содержит идентификатор чека receipt_id и целое число promo_items — количество товаров по акции в чеке.

В следующих $n$ строках дана вторая таблица. Каждая строка содержит идентификатор чека receipt_id и либо целое число cashback, либо строку NA.

Идентификаторы чеков в каждой таблице уникальны. Множества идентификаторов в двух таблицах совпадают. Хотя бы для одного чека кешбэк известен, поэтому $k>0$.

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

Выведите два числа w_new и b_new через пробел, каждое ровно с четырьмя знаками после точки.

Ограничения

$1 \le n \le 4000$.

Длина receipt_id составляет от 1 до 12 символов. Идентификатор состоит из латинских букв, цифр и символа _.

$0 \le promo_items \le 200$.

$0 \le cashback \le 1000$, если вместо него не указано NA.

$-20 \le w,b \le 20$.

$0.001 \le \eta \le 1$.

$0 \le \lambda \le 5$.

В обеих таблицах содержится ровно по $n$ строк.

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

Куда дальше