如何使用apache commons.math快速傅里叶变换进行时间序列预测

时间:2014-01-08 23:03:56

标签: java fft time-series prediction apache-commons-math

我想使用FastFourierTransformation来识别模式,以便预测我的监控指标的未来值。我想做的是:

我监控传入的流量负载,这是季节性重复(白天的高选择),另外一个星期的趋势(周末流量较低,也是季节性重复)。 虽然我尝试了一些增强回归算法,但我还想使用FFT来识别最重要的系数,以便识别这两个最重要的频率,然后尝试推断以预测流量。不久的将来。 虽然我在数学方面的理论背景给我带来了一些麻烦,但我正在与apache.commons.math3.transform.FastFourierTransformation挣扎。 假设我使用doube [] array在观察的时间范围内存储我的最新流量负载,我使用以下代码:

double [] initialSignal = getMonitoringData(timeslide);

FastFourierTransformer fft = new FastFourierTransformer(DftNormalization.STANDARD);

Complex [] result = fft.transform(initialSignal, TransformType.FORWARD);

但是我不熟悉Complex []数组所代表的内容。数组中每个Complex对象的虚构属性是否代表相关的正弦系数? 那么,如果我想取去噪声的初始信号,我只需将Complex []结果数组的不太重要的系数设置为零? 但是,如果我有以下

Complex [] denoised = fft.transform(importantCoefficiants, TransformType.INVERSE);

结果仍然是一个Complex数组。如何获得时间序列的新变换x(t)值? 在对初始时间序列进行去噪后,如何进行推断以预测x(t+1), x(t+2) ... x(t+n) values

1 个答案:

答案 0 :(得分:0)

嗯,我猜我昨天晚上找到了一个解决方案,与erickson的回答非常相似。 我计算x ^ 2 + y ^ 2然后我考虑最重要的系数。我将数组的其他元素设置为零,然后执行IFFT。我现在的最后一个问题是:

如何在Complex数组中推断出给定的结果,以便预测未来的值? 例如,如果我有n = 4096个样本(Complex [4096]数组)作为我的输入,那么我认为x(n + 1)的值将是数组[0]的值,x的值( n + 2)将是数组[1]等的值?