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

ВВЕДЕНИЕ

Итак, что такое аппроксимация полиномиальной кривой? По сути, мы попытаемся подогнать полиномиальную функцию к некоторому пользовательскому набору данных и проверить результаты. Пользовательский набор данных, который мы создадим через мгновение, будет нелинейным, и мы попытаемся подогнать под данные полином с 3 степенями. Мы начнем с импорта некоторых необходимых модулей.

import numpy as np 
import matplotlib.pyplot as plt 
import math 
import time

СОЗДАНИЕ НАБОРЫ ДАННЫХ

Все мы знаем функцию sin (x). Мы будем использовать sin (x) как основу нашего набора данных. Для каждой точки данных мы возьмем синус значения и добавим к нему некоторый случайный шум. Мы создаем набор данных из 20 точек данных. Можно сказать, что sin (x) довольно хорошо аппроксимирует нашу целевую функцию. Так что это будет для нас ориентиром. Ниже приведен код для создания набора данных.

На изображении выше показан набор данных. Синие точки - это в основном точки данных. Зеленая кривая представляет sin (x). Чтобы отобразить это, мы можем построить график sin (x) против x (эта часть не была показана в статье, но есть в ссылке GitHub, приведенной в конце). Как мы уже обсуждали, sin (x) является эталоном для этой проблемы.

ТЕОРИЯ

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

В основном это теория. Теперь нам нужно найти оптимальные значения w для данного x. Это поможет нам найти наиболее подходящую кривую. Об оптимизации вектора w мы поговорим позже, для начала нам понадобятся вспомогательные функции.

ПОМОЩНЫЕ ФУНКЦИИ

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

Ниже приведен код вспомогательных функций:

ОПТИМИЗАЦИЯ

Теперь самое важное. Нам нужно будет найти наилучший набор значений для w, при котором потери будут наименьшими. Мы будем использовать оптимизатор градиентного спуска. То, что делает Gradient Descent, - это сначала случайный набор значений, который будет присвоен w, а также будет назначена скорость обучения и количество эпох. Затем будет сделан прогноз, и градиент функции потерь будет вычислен по отношению к каждому из w и будет сохранен в списке, называемом градациями. Наконец, w будут обновлены путем вычитания скорости обучения, умноженной на градиент, соответствующий w, из начального w. Это будет продолжаться в течение первоначально назначенного количества эпох. Код для этого будет выглядеть так:

Я выбрал скорость обучения 1e-6 или 10 в степени -6. Процесс продлится 100000 эпох. l - окончательный проигрыш, а yhat соответствует прогнозам. Теперь у нас есть оптимальный набор значений для w. Итак, давайте проверим наши прогнозы.

ПРОВЕРКА ПРОГНОЗОВ

Итак, здесь мы наконец проверяем наши прогнозы (упомянутые ранее как yhat). Итак, мы проверяем наши прогнозы, нанося их на карту. И снова черные точки - это фактические точки данных. Зеленая кривая - это синусоида, эталон для набора данных. Синяя линия - это наши прогнозы, а красные точки показывают фактическое местоположение каждого прогноза. Вот его код и график ниже:

Теперь давайте проанализируем нашу кривую относительно синусоиды. Да, это не очень похоже на синусоидальную кривую, но хорошо обобщено. Если мы сравним точку данных с точкой данных, мы обнаружим, что на самом деле ошибка намного меньше. Кривая также имеет некоторое поведение, похожее на синусоидальную кривую, только гребни и впадины намного меньше. Было бы лучше, если бы: либо у нас было бы больше данных, либо мы взяли бы многочлен более высокой степени.

ССЫЛКА НА GITHUB

Вот Ссылка на репозиторий GitHub. Прежде чем добраться туда, я должен упомянуть несколько вещей. Файл имеет форму записной книжки или файла .ipynb. Он содержит все, что содержится в этой статье, и многое другое. Я использовал в нем другую функцию потерь, помимо упомянутой здесь функции потерь. Полный код и их выводы с некоторой теорией представлены там.

Та же проблема была решена с помощью языка Julia можно найти здесь, сделанного Deeptendu Santra.

Спасибо, что прочитали эту статью. Надеюсь, это помогло вам получить представление о подборе полиномиальной кривой.

Не забудьте подписаться на Публикацию Lean Programmer, чтобы увидеть больше таких статей, и подпишитесь на нашу рассылку tinyletter.com/TheLeanProgrammer