кусочно-нелинейная регрессия в python - PullRequest
1 голос
/ 04 мая 2020

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

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

def piecewise_nonlinear(x, x0, k1, k2,k3,k4,k5):
    return np.piecewise(x, [x < x0, x >= x0], [lambda x:k1/((1+k2*k3*x)**(1/k3)), lambda x:k4*np.exp(-1*k5*x)])

x = np.array([ 30,  60,  90, 120, 150, 180, 210, 240, 270, 300, 330, 360, 390,420, 450, 480, 510, 540, 570, 600, 630, 660, 690, 720, 750, 780])
y = np.array([685806, 488008, 374536, 366452, 317325, 289852, 269000, 269161, 261033, 243107, 236150, 220606, 235519, 227069, 171397, 192005,166051, 163804, 147755, 157127, 157244, 143962, 148628, 159093,162164, 152667])

p , e = optimize.curve_fit(piecewise_nonlinear, x, y)
xd = np.linspace(0, 780, 780)
plt.plot(x, y, "o")
plt.plot(xd, piecewise_nonlinear(xd, *p))

Результатом кода выше является эта картина: Результат кода

если мы напечатаем p и e, все значения массива p равны 1, а значения e равны inf.

Было бы здорово, если бы вы могли укажи мне правильное направление или покажи, что я делаю не так.

...