使用傅里叶分析进行时间序列预测

54 投票
4 回答
85477 浏览
提问于 2025-04-16 08:43

对于那些有季节性或每日规律的数据,我想用傅里叶分析来进行预测。在对时间序列数据进行快速傅里叶变换(FFT)后,我得到了系数。那么,我该如何利用这些系数来进行预测呢?

我认为FFT假设它接收到的所有数据构成一个周期。因此,如果我简单地使用逆快速傅里叶变换(IFFT)重新生成数据,我实际上是在重新生成我的函数的延续。那么,我能否用这些值来预测未来的数据呢?

简单来说:我在t=0,1,2,..10时运行FFT,然后对系数使用IFFT,我能否将重新生成的时间序列用于t=11,12,..20呢?

4 个回答

10

当你对时间序列数据进行快速傅里叶变换(FFT)时,其实是在把数据从时间的角度转变为频率的角度。这个过程会用一些系数去乘以序列中的每一项(比如正弦、余弦或者复指数),每一项都有不同的频率。

外推(也就是根据已有的数据来推测未来的情况)总是有风险的,但你可以尝试一下。这样做其实是在用过去的信息来预测未来,比如“通过今天的天气来预测明天的天气”。不过,你要清楚这样做的风险。

我建议你读一下《黑天鹅》这本书。

62

我知道这个问题对你来说可能已经不再重要了,但为了那些还在寻找答案的人,我写了一个非常简单的Python傅里叶外推的例子,链接在这里:https://gist.github.com/tartakynov/83f3cd8f44208a1856ce

在运行这个脚本之前,请确保你已经安装了所有需要的库(numpy和matplotlib)。你可以随意尝试和实验一下。

enter image description here

另外,局部平稳小波(Locally Stationary Wavelet)可能比傅里叶外推更好用。LSW通常用于预测时间序列。傅里叶外推的主要缺点是它只是把你的数据序列重复N次,其中N是你时间序列的长度。

30

听起来你想要的是一种结合外推和去噪的方式。

你提到想要在多个周期内重复观察到的数据。那么,直接重复观察到的数据就可以了,不需要进行傅里叶分析。

不过,你还想找到“模式”。我猜这意味着要找出观察数据中主要的频率成分。如果是这样的话,那就进行傅里叶变换,保留最大的系数,其他的就去掉。

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

关于周期性重复:设定 z = [x, x],也就是信号 x 的两个周期。那么对于所有 k 在 {0, 1, ..., N-1} 中,Z[2k] = X[k],其他的地方都是零。

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

撰写回答