我希望使用傅里叶分析来预测已知具有季节性或日常模式的数据。在对时间序列数据运行fft后,我获得了系数。如何使用这些系数进行预测?
我相信FFT假设它接收到的所有数据都构成一个周期,然后,如果我仅使用ifft重新生成数据,我也正在重建我的函数的延续,因此我可以将这些值用于未来值吗?
简单来说:我在t=0,1,2,..10上运行fft,然后使用coef运行ifft,我可以将重新生成的时间序列用于t=11,12,..20吗?
我知道这个问题对你来说可能已经不再实际,但是对于其他正在寻找答案的人,我在Python中编写了一个非常简单的傅里叶外推示例https://gist.github.com/tartakynov/83f3cd8f44208a1856ce
在运行脚本之前,请确保您已安装所有依赖项(numpy、matplotlib)。随意进行实验。 P.S. 与傅里叶外推相比,局部平稳小波可能更好。LSW通常用于预测时间序列。傅里叶外推的主要缺点是它只是以N为周期重复您的时间序列,其中N是您的时间序列长度。
看起来你想要外推和降噪的结合。
你说你想要将观察到的数据重复多个周期。那么,只需重复观察到的数据即可,无需进行傅里叶分析。
但你还想找“模��”。我猜这意味着找到观察数据中的主频成分。那么,是的,进行傅里叶变换,保留最大系数,消除其余部分。
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]
,其他位置为0。
Z = scipy.zeros(2*len(X))
Z[::2] = X
Y[N-ctr]
才能获得实信号。(如果X
具有共轭对称性,即X[k] = X*[-k]
,则x
是实信号。) - Steve Tjoa您可以使用@tartakynov发布的库,并且为了避免在预测中重复完全相同的时间序列(过度拟合),您可以向函数添加一个名为n_param
的新参数,并为频率的振幅固定下限h
。
def fourierExtrapolation(x, n_predict,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)) ]
只需添加这个功能,你就能够轻松地预测结果。
关于傅里叶变换的另一篇有用文章: 在R中进行傅里叶变换预测
for i in indexes[:1 + n_harm * 2]:
。在执行此操作之前,您会按频率值对索引进行排序,以确保获取n_harm
个最低频率。难道您不想要与最高峰相关的n_harm
个频率吗?难道索引不应该按x_freqdom
的绝对值进行排序吗?也许我误解了,但这似乎是去噪的最佳方法。 - Mike