Я пытаюсь приблизить эмпирическую интегральную функцию распределения ( ECDF, которую я хочу приблизительно ) с гладкой функцией (с менее чем 5 параметрами), такой как обобщенная логистическая функция .
Однако, используя scipy.optimize.curve_fit
, операция подгонки дает действительно плохие приближения или не работает вообще (в зависимости от начальных значений). Переменная series
представляет мои данные, хранящиеся как pandas.Series
.
from scipy.optimize import curve_fit
def fit_ecdf(x):
x = np.sort(x)
def result(v):
return np.searchsorted(x, v, side='right') / x.size
return result
ecdf = fit_ecdf(series)
def genlogistic(x, B, M, Q, v):
return 1 / (1 + Q * np.exp(-B * (x - M))) ** (1 / v)
params = curve_fit(genlogistic, xdata = series, ydata = ecdf(series), p0 = (0.1, 10.0, 0.1, 0.1))[0]
Должен ли я использовать другой тип функции для подгонки?
Есть ли ошибки в коде?
ОБНОВЛЕНИЕ - 1
Как и просили, я ссылаюсь на CSV, содержащий данные .
ОБНОВЛЕНИЕ - 2
После долгих поисков, проб и ошибок я нахожу эту функцию
f(x; a, b, c) = 1 - 1 / (1 + (x / b) ** a) ** c
with a = 4.61320000, b = 2.94570952, c = 0.5886922
, который подходит намного лучше, чем другой. Единственная проблема - маленький шаг, который показывает ECDF около x=1
. Как я могу изменить f
, чтобы улучшить качество посадки? Я думал о добавлении какой-то функции, которая «актуальна» только в таких точках. Вот графические результаты подгонки, где сплошная синяя линия - ECDF, а пунктирная линия представляет (x, f(x))
точек.