2010-12-18 200 views
22

對於已知具有季節性或日常模式的數據,我希望使用傅里葉分析來進行預測。在時間序列數據上運行fft後,我獲得係數。我怎樣才能使用這些係數進行預測?我相信FFT假定它所接收的所有數據都構成一個週期,那麼,如果我只是使用ifft重新生成數據,我也重新生成了我的函數的延續,那麼我可以使用這些值來獲得未來的值嗎?對時間序列預測使用傅里葉分析

簡單地說:我運行fft for t = 0,1,2,.. 10然後在coef上使用ifft,我可以使用t = 11,12,... 20的再生時間系列。

回答

18

這聽起來像是你想要外推的去噪組合。

你說你想重複觀察多個時期的數據。那麼,重複觀察的數據。不需要傅立葉分析。

但是你也想找到「模式」。我假設這意味着找到觀測數據中的主要頻率成分。那麼是的,採取傅立葉變換,保留最大的係數,並消除其餘的。

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

作爲週期性重複:讓z = [x, x],即兩個信號x的週期。然後對於{0,1,...,N-1}中的所有kZ[2k] = X[k],否則爲0。

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

所以你重複了Z中最重要的係數(在上面的例子中是兩次),並且如果使用ifft來重新生成我的時間序列,這個新的系列將會比原來的更長,並且根據定義會有預測。 – user423805 2010-12-18 20:28:38

+1

我想通過去噪來選擇最重要的係數。 – user423805 2010-12-18 20:30:45

+1

'Z = [X [0],0,X [1],0,X [2],0,...,X [N-1],0]'。如果這就是你的意思,那麼是的。是的,保留最重要的係數將對信號產生「平滑」或「模糊」或「去噪」效果。 – 2010-12-18 20:46:19

6

當您對時間序列數據運行FFT時,將其轉換到頻域。係數乘以系列中的項(正弦和餘弦或復指數),每個項都有不同的頻率。

推斷總是一件危險的事,但歡迎您嘗試。當你這樣做時,你正在使用過去的信息來預測未來:「通過今天看預測明天的天氣。」請注意風險。

我推薦閱讀"Black Swan"

+2

我讀黑天鵝。我不是一定要談論股票價格。比方說,收穫非常季節性的數據,或着名的黑子數據。所以我在談論可預測的事情。 – user423805 2010-12-18 18:53:33

+0

讓我再澄清一點:假設我確定了一個在數據中占主導地位的頻率。我如何將它與時域數據中的點相關聯,以便我可以在未來進行預測並進行預測。 – user423805 2010-12-18 18:56:46

+2

+1。外推是危險的,是的。通常,人們會製作模型,並假定未來會像模型所說的那樣工作。模型取決於參數,這些參數是使用當前或過去的觀測值估算的。所以你不「預測」任何東西,你只適合一個模型。 – 2010-12-18 18:57:12

18

我知道,這個問題可能是你不實際了,但對於其他人都在尋找答案,我寫在Python https://gist.github.com/tartakynov/83f3cd8f44208a1856ce

傅立葉外推的一個很簡單的例子,在運行之前腳本確保你已經安裝了所有的依賴項(numpy,matplotlib)。隨意試用它。 enter image description here P.S.局部平穩小波可能比傅里葉外推更好。 LSW常用於預測時間序列。傅里葉外推法的主要缺點是,它只是重複你的系列的N期,其中N是你的時間系列的長度。

+0

所以,抱歉只要確保我理解了。 x(藍線)是觀察數據?外推(紅線)是預測嗎? – 2015-04-01 15:56:31

+0

@jeffery_the_wind是的,紅線是預測,藍色是觀察數據。顯然在這個例子中有過度擬合,爲了避免你可以調整模型中的諧波數量。 – tartakynov 2015-04-01 17:05:34

+2

這個良好的視覺示例演示了其他帖子中指出的弱點:頻域本身在時域中產生固定週期。上面的紅線外推簡化了藍色(觀察)線的起始段的副本,儘管略微去噪。因此,在時域* h *時間單位上進行任何有意義的短期預測,其中* h *是歷史觀測的數量,在外推中只應使用最重要的**高**頻率係數。 「高」頻率閾值可以相對於* h *任意定義。 – 2015-05-30 20:26:22

0

您可以使用@tartakynov發佈的庫,並且不要在預測(過度擬合)中完全重複相同的時間序列,您可以向函數中添加一個新參數n_param,併爲幅度修正下界h的頻率。

def fourierExtrapolation(x, n_predict,n_param): 

通常你會發現,在一個信號,也有一些頻率上具有比其他顯著更高的幅度,因此,如果您選擇這個頻率,你將能夠隔離信號的週期性質

您可以添加誰是由一定數量determinated這兩條線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

+0

你提供的鏈接已損壞。如果可能的話,你可以請再發帖嗎?如果有的話?謝謝。 – dhinar 2017-08-22 06:21:48

+1

@DhivyaNarayanasamy固定;) – 2017-08-22 17:40:41