07
Апр
2021

Как узнать коэффициенты кусочно-линейной функции при апроксимации выборки?

Есть выборка данных. По ней необходимо найти коэффициенты полинома 3-й степени и кусочно-линейную функцию. Полином я нашёл очень просто с помощью функций np.polyfit и np.poly1d. Удалось построить, и график, и получить конкретное уравнение. Теперь то же самое хотелось бы сделать и для получения коэффициентов нескольких линейных функций. Мне удалось найти пример кода, который построил график, но вывести уравнения для трёх прямых не получается. Я конечно же могу посчитать их вручную, но хотелось бы узнать, есть ли штатный метод для решения данной задачи?

import numpy as np
import matplotlib.pyplot as plt
from scipy import optimize

np.random.seed(9999)
x = np.random.normal(0, 1, 1000) * 10
y = np.where(x < -15, -2 * x + 3, np.where(x < 10, x +
                                          48, -4 * x + 98)) + np.random.normal(0, 3, 1000)
plt.scatter(x, y, s=5, color=u'b', marker='.', label='scatter plt')


def piecewise_linear(x, x0, x1, b, k1, k2, k3):
   condlist = [x < x0, (x >= x0) & (x < x1), x >= x1]
   funclist = [lambda x: k1*x + b, lambda x: k1*x + b + k2 *
               (x-x0), lambda x: k1*x + b + k2*(x-x0) + k3*(x - x1)]
   return np.piecewise(x, condlist, funclist)


p, e = optimize.curve_fit(piecewise_linear, x, y)
xd = np.linspace(-30, 30, 1000)
plt.plot(x, y, "o")
plt.plot(xd, piecewise_linear(xd, *p))
plt.show()

Источник: https://ru.stackoverflow.com/questions/1267414/%D0%9A%D0%B0%D0%BA-%D1%83%D0%B7%D0%BD%D0%B0%D1%82%D1%8C-%D0%BA%D0%BE%D1%8D%D1%84%D1%84%D0%B8%D1%86%D0%B8%D0%B5%D0%BD%D1%82%D1%8B-%D0%BA%D1%83%D1%81%D0%BE%D1%87%D0%BD%D0%BE-%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D0%BE%D0%B9-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8-%D0%BF%D1%80%D0%B8-%D0%B0%D0%BF%D1%80%D0%BE%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D1%86%D0%B8%D0%B8-%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BA%D0%B8

Тебе может это понравится...

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