【问题标题】:Extrapolating data from a curve using Python使用 Python 从曲线外推数据
【发布时间】:2015-11-21 08:19:01
【问题描述】:

我正在尝试从包含近 600 天每天一个连续值的数据集中推断未来的数据点。我目前正在使用numpy.polyfitnumpy.poly1d 为数据拟合一阶函数。在下图中,您可以看到曲线(蓝色)和一阶函数(绿色)。 x 轴是开始后的天数。我正在寻找一种在 Python 中对这条曲线进行建模的有效方法,以便尽可能准确地推断未来的数据点。线性回归不够准确,我不知道有任何非线性回归方法可以在这种情况下工作。

这个解决方案不够准确,就像我喂食一样

x = dfnew["days_since"]
y = dfnew["nonbrand"]

z = numpy.polyfit(x,y,1)
f = numpy.poly1d(z)

x_new = future_days
y_new = f(x_new)

plt.plot(x,y, '.', x_new, y_new, '-')

编辑:

我现在使用对数函数尝试了curve_fit,因为曲线和数据行为似乎符合:

def func(x, a, b):
  return a*numpy.log(x)+b

x = dfnew["days_since"]
y = dfnew["nonbrand"]

popt, pcov = curve_fit(func, x, y)

plt.plot( future_days, func(future_days, *popt), '-')

但是,当我绘制它时,我的 Y 值偏离了:

【问题讨论】:

  • 一个非常简单的方法是:首先查看图形并考虑图形可能属于的参数函数族。也许一些对数函数?然后使用 scipy 中的curve_fit 查找具体参数并使用该函数进行外推。
  • 谢谢,我已经尝试过了,希望您对我的编辑提供反馈。
  • 帮您有点麻烦,因为我自己无法尝试。 a*numpy.log(x)+b 似乎很成问题。如果你也允许 x 轴移位会发生什么? a*numpy.log(x + b) + c?
  • 太棒了!这就是我试图破解的坚果,谢谢。该曲线非常适合我的数据的预期行为,可能会为任务提供一个很好的解决方案。
  • 很高兴它成功了。尝试激进的功能也可能会给你带来好的结果。将对数与平方根进行比较,例如可能有道理。

标签: python numpy statistics regression polynomial-math


【解决方案1】:

一般的经验法则是,如果您的拟合函数不能很好地拟合您的实际数据,那么:

  • 您使用的功能有误,例如您正在使用一阶多项式 - 因此,如果您确信它是多项式,请尝试使用高阶多项式。
  • 你用错了函数,总是值得一看:

    1. 您的数据曲线和
    2. 您对生成数据的过程的了解

    就哪种模型可能更适合提出一些推测/定理/猜测。

您的过程可能是对数的、饱和的等。试试看!

最后,如果您没有获得一致的长期趋势,那么您可以使用三次样条来证明其合理性。

【讨论】:

  • 谢谢,我认为对数函数符合我正在寻找的内容,因为我的 Y 值增长率随着时间的推移而减小,这是数据的预期行为。我已经尝试实现curve-fit,但得到了一个奇怪的图形输出,如我上面的编辑所示。非常感谢您对此的反馈。
  • 您需要绘制数据的对数以及预测值,然后您可以比较并只需将刻度标签更改为数字的反对数。
  • 我有点不清楚你的意思。你能举个例子吗?
  • stackoverflow.com/questions/6431248/… 为您提供基础知识。
猜你喜欢
  • 1970-01-01
  • 2016-04-26
  • 2018-03-26
  • 2018-10-01
  • 1970-01-01
  • 2015-07-03
  • 1970-01-01
  • 1970-01-01
  • 2016-06-07
相关资源
最近更新 更多