【问题标题】:Using fourier analysis for time series prediction使用傅立叶分析进行时间序列预测
【发布时间】:2011-05-27 15:21:09
【问题描述】:

对于已知具有季节性或每日模式的数据,我想使用傅立叶分析来进行预测。在对时间序列数据运行 fft 后,我​​获得了系数。如何使用这些系数进行预测?

我相信 FFT 假设它接收到的所有数据构成一个周期,那么,如果我只是使用 ifft 重新生成数据,我也在重新生成我的函数的延续,那么我可以将这些值用于未来值吗?

简单地说:我为 t=0,1,2,..10 运行 fft,然后在 coef 上使用 ifft,我可以为 t=11,12,..20 使用重新生成的时间序列吗?

【问题讨论】:

    标签: python math matlab


    【解决方案1】:

    您可以使用@tartakynov 发布的库,并且为了不在预测中重复完全相同的时间序列(过度拟合),您可以向名为n_param 的函数添加一个新参数并修复下限h对于频率的幅度。

    def fourierExtrapolation(x, n_predict,n_param):
    

    通常您会发现,在一个信号中,有些频率的幅度明显高于其他频率,因此,如果您选择这些频率,您将能够隔离信号的周期性

    你可以添加这两条由某个数字确定的行n_param

    h=np.sort(x_freqdom)[-n_param]
    x_freqdom=[ x_freqdom[i] if np.absolute(x_freqdom[i])>=h else 0 for i in range(len(x_freqdom)) ]
    

    只需添加此内容,您就可以顺利预测

    另一篇关于 FFt 的有用文章: forecast FFt in R

    【讨论】:

    • 您好,您提供的链接已损坏。如果可能的话,你能再发一次吗?或者如果你有?谢谢。
    • @DhivyaNarayanasamy 已修复 ;)
    • 非常有趣,但您不想在给定的后半部分(最近的)值上增加权重来使预测产生偏差吗?即尝试使用前半部分为平线但后半部分为斜线的数据进行此操作。斜线应该比平坦部分更强调。
    【解决方案2】:

    我知道这个问题对你来说可能不再实际,但对于其他正在寻找答案的人,我用 Python https://gist.github.com/tartakynov/83f3cd8f44208a1856ce 写了一个非常简单的傅立叶外推示例

    在运行脚本之前,请确保已安装所有依赖项(numpy、matplotlib)。随意尝试它。 附言局部平稳小波可能比傅立叶外推更好。 LSW 通常用于预测时间序列。傅立叶外推的主要缺点是它只是重复您的序列,周期为 N,其中 N - 您的时间序列的长度。

    【讨论】:

    • 所以,抱歉,只是确保我理解。 x(蓝线)是观察到的数据?外推(红线)是预测?
    • @jeffery_the_wind 是的,红线是预测数据,蓝线是观测数据。显然这个例子中存在过拟合,为了避免你可以调整模型中的谐波数量。
    • 这个很好的视觉示例展示了其他帖子中指出的弱点:频域本质上会在时域中产生固定周期。上面的红线外推是蓝色(观察到的)线开始段的简单副本,尽管稍微去噪。因此,要在 h 个时间单位内进行任何有意义的短期预测,其中 h ≪ 历史观察的数量,只有最显着的 high 外推时应使用频率系数。可以相对于 h 任意定义“高”频率阈值。
    • 为了进一步澄清我之前的评论,在 ~350 时外推的红色驼峰只是 ~50 时蓝色驼峰的副本。如果历史时期是在 50 年的驼峰之前开始的,那么第一个预测的单位就会有那个驼峰副本,这似乎有点愚蠢和武断。因此,通过消除和降低低频分量,我们可以减少由历史数据起点引起的任意性。
    • 我对这个脚本有点困惑,主要是读取for i in indexes[:1 + n_harm * 2]: 的行,您在执行此操作之前按频率值对索引进行排序,保证您获得n_harm 的最低频率。您不希望n_harm 频率与最高峰相关联吗?索引不应该按x_freqdom 的绝对值排序吗?也许我误解了,但这似乎是最好的去噪方法。
    【解决方案3】:

    听起来你想要外推去噪的组合。

    您说您想在多个时期重复观察到的数据。那么,只需重复观察到的数据。无需傅立叶分析。

    但你也想找到“模式”。我假设这意味着在观察到的数据中找到主要的频率分量。那么是的,进行傅里叶变换,保留最大的系数,并消除其余的。

    X = scipy.fft(x)
    Y = scipy.zeros(len(X))
    Y[important frequencies] = X[important frequencies]
    

    至于周期性重复:设z = [x, x],即信号x的两个周期。然后 Z[2k] = X[k] 代表 {0, 1, ..., N-1} 中的所有 k,否则为零。

    Z = scipy.zeros(2*len(X))
    Z[::2] = X
    

    【讨论】:

    • 所以你在 Z 中重复最重要的系数(在上面的例子中是两次),如果使用 ifft 重新生成我的时间序列,这个新序列将比原来的序列长,并且根据定义会有预测在里面。
    • 我猜你所说的去噪是指选择最重要的系数。
    • Z = [X[0], 0, X[1], 0, X[2], 0, ..., X[N-1], 0]。如果这就是你的意思,那么是的。是的,保留最重要的系数将对信号产生“平滑”或“模糊”或“去噪”效果。
    • 我刚刚意识到我可以继续调用 Y[ctr] * (np.cos(xctr*2*pi/N) + 1jnp.sin(x*ctr *2*pi/N)) 其中 x 是新值,Y 是系数,ctr 是 coef 索引,并将其相加;这将基本上预测。你怎么看?
    • 是的,这基本上是在时域中隔离一个复杂的正弦曲线。但答案会很复杂。您还需要组件Y[N-ctr] 才能获得真实信号。 (x 是一个实信号,如果 X 具有共轭对称性,即X[k] = X*[-k]。)
    【解决方案4】:

    当您对时间序列数据运行 FFT 时,您会将其转换为频域。系数乘以系列中的项(正弦和余弦或复指数),每个项具有不同的频率。

    外推法总是一件危险的事情,但欢迎您尝试一下。当你这样做时,你正在使用过去的信息来预测未来:“通过观察今天来预测明天的天气。”请注意风险。

    我建议阅读"Black Swan"

    【讨论】:

    • 我读过《黑天鹅》。我不是一定要谈论股票价格。假设.. 收获非常季节性的数据,或者著名的太阳黑子数据。所以我说的是可预测的事情。
    • 让我进一步澄清一下:假设我确定了一个在数据中占主导地位的频率。我如何将其与时域数据中的点联系起来,这样我就可以向前和未来进行预测。
    • +1。外推是危险的,是的。通常,人们制作模型,并假设未来会像模型所说的那样表现。模型取决于参数,这些参数是根据当前或过去的观察结果进行估计的。所以你不“预测”任何东西,你只适合一个模型。
    • @user:这是一个非常困难且可能过于宽泛的问题。
    • @Alexandra C:我说的是已知会重复的数据。
    猜你喜欢
    • 2020-01-14
    • 2015-07-14
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    • 2015-04-05
    • 1970-01-01
    相关资源
    最近更新 更多