Шаг градиента по данным посылок

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

Условие

В пункте выдачи строится модель, оценивающая вероятность того, что посылку заберут в день её поступления. Для каждой посылки известен признак x — число часов до закрытия пункта в момент поступления. Метка y равна 1, если посылку забрали в этот день, и 0 иначе.

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

Используется логистическая регрессия с параметрами w и b. Для посылки с признаком x вероятность равна p = 1 / (1 + exp(-(w*x + b))). На всех сопоставленных посылках выполняется один шаг градиентного спуска для бинарной кросс-энтропии. Градиенты вычисляются по формулам dw = (1/k) * sum((p_i - y_i) * x_i) и db = (1/k) * sum(p_i - y_i), где k — число сопоставленных посылок. Новые параметры равны w_new = w - eta * dw и b_new = b - eta * db.

Требуется вывести w_new и b_new в указанном порядке. Выведите каждое число с четырьмя знаками после точки, округляя до ближайшего значения с четырьмя знаками; при ровно половине выбирается значение с чётной последней цифрой. Гарантируется, что одинаковых идентификаторов внутри каждой таблицы нет.

Формат ввода

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

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

В следующих n строках записаны идентификатор посылки parcel_id и целое число x.

В следующих m строках записаны идентификатор посылки parcel_id и целое число y.

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

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

Ограничения

1 <= n, m.

n + m <= 4000.

-10 <= w, b <= 10.

0 < eta <= 1.

-100 <= x <= 100.

y равно 0 или 1.

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

Внутри каждой из двух таблиц все идентификаторы различны.

Хотя бы один идентификатор встречается в обеих таблицах, поэтому k >= 1 и деления на ноль не возникает.

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

Куда дальше