我尝试使用curve_fit
拟合日期时间与浮动数据。据我了解,curve_fit不适用于日期时间,因此我首先必须将数据转换为数值。这给了我非常大的x值,导致exp函数溢出。我的代码如下。如果我使用多项式而不是指数式,则相同的代码也可以工作。
def func(x, a):
return (np.exp(a*x))
def fit_exponential(gd):
gdtemp['Date'] = pd.to_datetime(gdtemp.Date)
mask = (gdtemp['Date'] > '2020-01-30') & (gdtemp['Date'] <= '2020-03-20')
gdtemp = gdtemp.loc[mask].copy()
x = pd.to_numeric(gdtemp.Date)
y=gdtemp['Confirmed']
popt, pcov = curve_fit(func,x, y)
如何修改代码以使用指数?
关于如何解决此问题,我有两个想法,但不确定如何实施:
第一个主意:不要使用to_numeric进行转换,而是以其他方式产生较小的数字。我的输入数据非常简单,每天只包含1行,因此我不需要时间或其他任何东西。还有另一个类似于to_numeric()的函数会忽略时间部分并产生较小的数字吗?
第二个想法:将数字日期值除以一个大数字,然后再相乘。我应该使用什么数字进行除法?
我通过将较大的x值映射到间隔[0; 1]并拟合该间隔来解决了这个问题。
基本修改是:
small_x = (x - x.min()) / (x.max() - x.min())
popt, pcov = curve_fit(func4 ,small_x, y )
指数中的值现在是合理的(在我的情况下约为1),并且溢出没有问题。
没有此映射,我最终将获得非常大的x值(大约10 ^(15))和非常小的a值(大约10 ^(-15)),而fititng函数显然没有喜欢。