Полиномиальная модель + реализация на Python

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

Полиномиальная модель

Для формирования полиномиальной модели необходимы полиномиальные данные. Это можно легко получить, расширив линейный набор данных, который я использовал ранее, до полиномиального набора данных более высокого порядка, расширив исходные входные данные с исходными входными данными до степени полинома более высокого порядка и добавив дополнительные веса к модели.

Я написал функцию, которая создает полиномиальный набор данных в виде матрицы с заданными точками данных и указанным порядком, которую я назвал k. Для простоты вычислений я расширил набор данных вектором из единиц, который представляет постоянный вес w0:

Я выбрал порядок 2, поэтому мой полиномиальный набор данных выглядел так:

Гипотеза для одного входа имеет вид:

g(x¹) = ∑ᵢᵏ Dᵢ¹ wᵢ

где g(x¹) = общая модель, i = итерация и имеет начальное значение 0, k = порядок полинома, D = D_matrix и w = вес

Это можно записать как умножение матриц для всех входных данных в одном уравнении:

Я написал 2 функции для вычисления полиномиальной модели, названные poly_val и poly_model, разделив вычисление на 2 этапа. Функция poly_val вычисляет значения для всех входных данных с умножением матриц, показанным выше, а функция poly_model принимает D_matrix и вектор весов и вычисляет соответствующий вектор гипотез:

Следующим шагом будет вычисление стоимости с помощью функции стоимости этой модели. Я назвал эту функцию poly_cost, и она возвращает общую стоимость, используя следующее уравнение:

Реализация этого в Python дает:

Решение всех уравнений в частных производных на вес можно легко выполнить с помощью матричных операций. Принцип точно такой же, как и для линейной модели, где мы также просто вычисляем w0 и w1. Таким образом, окончательное уравнение для вектора весов имеет вид:

Благодаря встроенным функциям numpy для транспонирования и инверсии это уравнение можно легко реализовать на Python, например так:

Наконец, я написал функцию poly_plot, отображающую полиномы в виде графика. Я сделал из этого функцию, потому что 2 точек недостаточно для построения подгонки, поскольку она нелинейна. Самый простой способ решить эту проблему — сгенерировать множество значений x в качестве образцов, вычислить соответствующие значения y и построить их график. Функцию linspace можно использовать для генерации сэмплов, и чем больше сэмплов, тем ровнее линия. Применение функции poly_val к этим образцам даст соответствующие значения y:

Осталось только визуализировать подгонку:

Как видно на графике выше, полиномиальная аппроксимация лучше подходит для этого набора данных, чем линейная аппроксимация. Недостатком полиномиальной модели является то, что она склонна к переобучению. В следующей части этой серии я расскажу о методе, который можно применить для выбора модели, которая менее склонна к переоснащению, чем полиномиальная модель.