Полиномиальная модель + реализация на 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:
Осталось только визуализировать подгонку:
Как видно на графике выше, полиномиальная аппроксимация лучше подходит для этого набора данных, чем линейная аппроксимация. Недостатком полиномиальной модели является то, что она склонна к переобучению. В следующей части этой серии я расскажу о методе, который можно применить для выбора модели, которая менее склонна к переоснащению, чем полиномиальная модель.