Scipy curve_fit дает прямую линию - PullRequest
0 голосов
/ 09 июля 2020

Итак, я пытаюсь получить экспоненциальную кривую для некоторых данных COVID, но, похоже, мне не удается заставить мою функцию curve_fit отображать какую-либо кривую вообще. Это так плохо, что она полностью перекрывает линию регрессии seaborn, созданную на моем графике. строка и / или ошибка оптимизации. Я даже пытался вычислить свою функцию вручную, но это (естественно) тоже было далеко.

#Plot scatter plot for total case count
x = df_sb['date_ordinal']
y1 = df_sb['totalcountconfirmed']
y2 = df_sb['totalcountdeaths']

plt.figure(figsize=(14,10))
ax = plt.subplot(1,1,1)

# Plot scatter plot along with linear regression line
sns.regplot(x='date_ordinal', y='totalcountconfirmed', data=df_sb)

# Formatting axes
ax.set_xlim(x.min() - 1, x.max() + 10)
ax.set_ylim(0, y1.max() + 1)
ax.set_xlabel('Date')

labels = [dt.date.fromordinal(int(item)) for item in ax.get_xticks()]
ax.set_xticklabels(labels)
plt.xticks(rotation = 45)
plt.ylabel("Total Confirmed Cases")

# Exponential Curve
from scipy.optimize import curve_fit
from scipy.special import expit

x_data = df_sb['date_ordinal'].to_numpy()
Y_data = df_sb['totalcountconfirmed'].to_numpy()

def func(x, a, b, c):
    return a * expit(-b * x) + c

popt, pcov = curve_fit(func, x_data, Y_data, maxfev=10000)
a, b, c = popt
fit_y = func(x_data, a, b, c)

plt.plot(x_data, fit_y)

plt.legend(['Total Cases (Linear)','Total Cases (Exponential)'])

# Inserting Significant Date Labels
add_sig_dates(df_sb, 'totalcountconfirmed')

plt.show()

введите описание изображения здесь

1 Ответ

0 голосов
/ 09 июля 2020

Несмотря на то, что вы не предоставили никакого доступа к данным, просто глядя на график, я почти уверен, что вы имеете в виду

def func(x, a, b, c):
    return a * np.exp(-b * x) + c

вместо

def func(x, a, b, c):
    return a * expit(-b * x) + c

Поскольку это экспоненциальная аппроксимация, я думаю, вам следует дать первоначальное предположение для параметров, чтобы добиться хороших результатов. Это можно сделать с помощью аргумента p0. Например:

p0 = [2 ,1, 0] # < -- just an example, they are bad guesses
popt, pcov = curve_fit(func, x_data, Y_data, maxfev=10000, p0=p0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...