Шаг градиента по результатам забега

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

Условие

После школьной спартакиады строится модель, которая по числовому признаку участника оценивает вероятность попадания в сборную. Для участника с признаком x модель с параметрами w и b вычисляет вероятность

p = 1 / (1 + exp(-(w*x + b))).

В каждой строке также дан правильный ответ y: 1, если участник вошёл в сборную, и 0 иначе. Строка с признаком NA означает, что измерение признака отсутствует. Такие строки полностью пропускаются при вычислении градиента.

Требуется выполнить один шаг пакетного градиентного спуска для логистической функции потерь. Пусть m — число строк, в которых признак не равен NA. Градиенты определяются формулами

g_w = (1/m) * Σ((p_i - y_i) * x_i),

g_b = (1/m) * Σ(p_i - y_i).

Новые параметры равны w_new = w - eta * g_w и b_new = b - eta * g_b, где eta — скорость обучения. При равенстве результатов нескольких участников каждая строка учитывается отдельно, никакой выбор между участниками не производится.

Формат ввода

В первой строке даны четыре значения: целое число n, затем числа eta, w и b.

В следующих n строках записаны признак x и метка y. Вместо x может быть записано NA.

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

Выведите через пробел значения w_new и b_new с четырьмя знаками после десятичной точки. Округление выполняется по правилам форматирования Python f'{value:.4f}'.

Ограничения

1 ≤ n ≤ 4000.

0.001 ≤ eta ≤ 1.

-5 ≤ w, b ≤ 5.

Каждый известный признак x является вещественным числом от -10 до 10 включительно, либо записан как NA.

y — целое число 0 или 1.

Гарантируется, что среди строк есть хотя бы одна строка с известным признаком, поэтому m ≥ 1 и деления на ноль не возникает.

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

Куда дальше