Шаг градиента для солнечных панелей

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

Условие

Компания оценивает, будет ли суточная выработка солнечной панели высокой. Для каждого дня известны суммарная солнечная радиация x в Вт·ч/м² и метка y: 1, если выработка была не менее 12 кВт·ч, и 0 иначе.

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

Используется логистическая регрессия с параметрами b и w: z = b + w*x, p = 1 / (1 + exp(-z)). Минимизируется средняя логистическая потеря по строкам с известной радиацией: L = -(1/m) * Σ(y*ln(p) + (1-y)*ln(1-p)), где m — число таких строк. Её градиент равен g_b = (1/m) * Σ(p-y) и g_w = (1/m) * Σ((p-y)*x). Для каждого значения скорости обучения eta из запроса требуется выполнить один шаг: b_new = b - eta*g_b, w_new = w - eta*g_w.

Равные значения радиации, меток и скоростей обучения допускаются и обрабатываются как отдельные строки, никакого выбора между ними не производится.

Формат ввода

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

В следующих n строках записаны два значения: радиация x или строка NA, затем метка y.

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

В следующей строке дано целое число q — число запросов.

В следующих q строках записано по одному вещественному числу eta — скорости обучения.

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

Для каждого запроса выведите в отдельной строке два числа b_new и w_new в этом порядке.

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

Ограничения

1 ≤ n ≤ 4000.

Для каждой строки наблюдений x имеет вид NA длины 2 либо вещественного числа от 0 до 1500 включительно с не более чем тремя знаками после точки.

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

Хотя бы в одной из n строк значение x не равно NA.

-10 ≤ b ≤ 10, -0.02 ≤ w ≤ 0.02.

1 ≤ q ≤ 20.

Для каждого запроса 0 ≤ eta ≤ 1.

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

Куда дальше