В прошлой главе время доставки считалось по готовым весам:
время = 3 · км + 1.5 · светофоры − 0.5 · курьеры + 8
Откуда взялись числа 3, 1.5, −0.5 и 8, сказано не было. В работе их никто не выдаёт: есть только база выполненных заказов — что было в заказе и сколько он на самом деле ехал.
Цель главы — научиться доставать веса из такой базы.
Что это за задача
Переведём цель на язык программиста.
Дано: таблица выполненных заказов. В каждой строке признаки заказа — километры, светофоры, свободные курьеры — и фактическое время, которое он ехал.
Требуется: подобрать четыре числа так, чтобы прогноз по ним расходился с фактом как можно меньше. Не на одном заказе, а на всех сразу.
В такой формулировке задача сразу распадается на два вопроса, и оба придётся решить, прежде чем садиться писать программу.
- Чем измерить расхождение? Пока нет числа, которое показывает, насколько прогноз разошёлся с фактом на всей таблице, слова «как можно меньше» ничего не значат: непонятно, какой из двух наборов весов лучше.
- Как найти веса, при которых это число наименьшее? Перепробовать все наборы нельзя: их бесконечно много, а вслепую тыкать наугад можно очень долго.
С первого вопроса и начнём: он проще и без него второй не имеет смысла. Ответ на второй называется градиентным спуском — ему отведена вся остальная часть главы. И да, в конце мы такую программу действительно напишем, и она найдёт все четыре числа сама.