【问题标题】:Overflow in exp when curve_fit of datetimedatetime的curve_fit时exp溢出
【发布时间】:2020-06-03 05:44:21
【问题描述】:

我尝试使用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() 的函数忽略时间部分并产生更小的数字?

第二个想法:将数字日期值除以某个大数,然后再相乘。我应该使用什么数字来划分?

【问题讨论】:

    标签: python pandas overflow curve-fitting exponential


    【解决方案1】:

    我通过将大数值 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 函数所做的不喜欢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多