Аппроксимация степенным полиномом python

Рассмотрим сложную математическую функцию на линии [1, 15]: f (x) = sin (x / 5) * exp (x / 10) + 5 * exp (-x / 2)

Полином степени n (w_0 + w_1 x + w_2 x ^ 2 + . + w_n x ^ n) однозначно определяется любыми n + 1 различными точками, через которые он проходит. Это означает, что его коэффициенты w_0, . w_n могут быть определены из следующей системы линейных уравнений:

Где x_1, . x_n, x_ — это точки, через которые проходит полином, а f (x_1), . f (x_n), f (x_ ) — значения, которые он должен принимать в этих точках.

Я пытаюсь сформировать систему линейных уравнений (то есть указать матрицу коэффициентов A и свободный вектор b) для полинома третьей степени, который должен совпадать с функцией f в точках 1, 4, 10 и 15. Решите эту систему, используя функцию scipy.linalg.solve.

A = numpy.array ([[1., 1., 1., 1.], [1., 4., 8., 64.], [1., 10., 100., 1000.], [ 1., 15., 225., 3375.]])

V = numpy.array ([3,25, 1,74, 2,50, 0,63])

numpy.linalg.solve (A, V)

Я получил неправильный ответ, который

Вопрос в том, правильна ли матрица?

Нет, ваша матрица не верна.

Самая большая ошибка — ваша вторая субматрица для A Третья запись должна быть 4**2 есть 16 но у вас есть 8. Менее важно, у вас есть только два десятичных знака для вашего массива констант V но вы действительно должны иметь большую точность, чем эта. Системы линейных уравнений иногда очень чувствительны к предоставленным значениям, поэтому сделайте их максимально точными. Кроме того, округление в ваших последних трех записях является плохим: вы округлили в меньшую сторону, но вы должны были округлить в большую сторону. Если вы действительно хотите два десятичных знака (которые я не рекомендую), значения должны быть

С этими изменениями в A и V я получаю результат

Читайте также:  Ассасин крид роуг системные требования на пк

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

Они выглядят близко ко мне! Когда я вычисляю значения функций на 1, 4, 10 и 15, самая большая абсолютная ошибка для 15, а именно -4.57042132584462e-6 . Это несколько больше, чем я ожидал, но, вероятно, достаточно хорошо.

как сделать линейную апроксимацию функции на python?

можно ли ее сделать для любой функции?

  • Вопрос задан 27 мая 2019
  • 372 просмотра

Используй polyfit. Он создает полином методом наименьших квадратов. Подставляешь значения x, y и степень полинома. В твоем случае — 1.

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

Здесь я приведу полезные и наиболее употребительные сниппеты для Python. Однако, я хотел бы сделать эту заметку чуть-чуть более полезной, что просто сниппет. Предлагаю решить практическую задачу.

Постановка задачи

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

  • Через сколько дней количество пользователей достигнет 1000?
  • Сколько пользователей будет через 60 дней?

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

Решение

Переберём пять гипотез:

  • Линейная зависимость
  • Квадратичная
  • Полином пятой степени

А вот результат:

Мы так же можем взглянуть на графики, построенные с помощью matplotlib.pyplot :

Здесь хорошо видны примеры и переученности (overfitting) и недоученности (underfitting). Видно, что наиболее реалистичны кривые первой и второй степени. Результаты же, полученные на кривых четвёртой и пятой степеней, скорее всего, обманчивы.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *