Линейная регрессия с нуля

Пора собрать в одну функцию всё, что было по частям: прогноз модели, промахи, градиент по четырём параметрам и шаг против него. Обучение — это их повторение по кругу: посчитать прогнозы, получить промахи, собрать из них градиент, шагнуть, начать заново.

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

Это полный цикл обучения, написанный вами от первой строки до последней. После него любой фреймворк перестаёт быть чёрным ящиком: вы будете знать, что происходит внутри одного вызова обучения, потому что написали это сами.

Подробно: Все веса сразу.
 


Задание

База выполненных заказов. Три первых числа в строке — признаки заказа: километры, светофоры, свободные курьеры рядом. Четвёртое — сколько заказ ехал на самом деле, в минутах. Это и есть то, что модель учится предсказывать.

База вписана в тест, объявлять её в решении не нужно.

baza = [(4.0, 2, 6, 20.0), (2.0, 5, 4, 19.5), (6.0, 1, 2, 26.5), (1.5, 3, 8, 13.0),
        (5.0, 0, 5, 20.5), (3.0, 4, 1, 22.5), (7.5, 2, 3, 32.0), (2.5, 6, 7, 21.0)]

Модель та же, что в пятом задании:

время = p[0] · км + p[1] · светофоры + p[2] · курьеры + p[3]

Последний параметр p[3] — постоянная часть времени, одинаковая для всех заказов: сборка и передача курьеру. Признака при нём нет, поэтому в производной на его месте стоит единица.

Напишите функцию

def fit(baza, lr, steps):
    # возвращает (список из четырёх параметров, история MSE)
    ...

Начинайте со всех нулей. История — список значений MSE по шагам, по одному на шаг. Печать делается снаружи, функция ничего не печатает.

Градиент считайте своей функцией grad4 из предыдущего задания — переписывать производные заново не надо, объявите её в решении рядом.


Как проверить себя

При lr = 0.02 и 2000 шагах MSE опустится почти до нуля, но веса не совпадут с истинными 3, 1.5, −0.5 и 8. Подумайте, почему, и попробуйте lr = 0.03 — объясните, что стало с числами.

Потом прогоните базу через standardize из седьмого задания, обучите с lr = 0.3 за 120 шагов и верните веса. Сравните с первым результатом.

Числа сравниваются с допуском, а не как строки: достаточно совпадения в первых четырёх знаках. Печатать ничего не надо — функция возвращает значение.


Напишите программу
Auto
       

time 10000 ms
memory 256 Mb
Правила оформления программ и список ошибок при автоматической проверке задач

Статистика успешных решений по компиляторам
 Кол-во
Python1