時(shí)序預(yù)測(cè)之三_傅立葉和小波變換

1. 說明

?用傅立葉變換預(yù)測(cè)時(shí)序數(shù)據(jù)吩谦,原理是把時(shí)域數(shù)據(jù)轉(zhuǎn)換到頻域静袖,再轉(zhuǎn)換回來.python的numpy和scipy里面都有現(xiàn)成的轉(zhuǎn)換工具fft()和ifft(),但使用時(shí)會(huì)遇到一個(gè)問題:比如25天的數(shù)據(jù)轉(zhuǎn)到頻域再轉(zhuǎn)回時(shí)域,還是25天徐绑,雖然擬合了數(shù)據(jù),但沒法直接預(yù)測(cè)未來莫辨,本篇介紹用它實(shí)現(xiàn)預(yù)測(cè)的方法.

2. 傅立葉變換

(1) 相關(guān)知識(shí)

?之前寫過關(guān)于傅立葉變換原理的文檔傲茄,這次就不再重復(fù)了,具體請(qǐng)見:http://www.reibang.com/p/9e786be6dccb
?本篇只從程序的角度看如何使用它. 經(jīng)過FFT轉(zhuǎn)換的數(shù)據(jù)和轉(zhuǎn)換前長(zhǎng)度一致沮榜,每個(gè)數(shù)據(jù)分為實(shí)部和虛部?jī)刹糠峙陶ィ僭O(shè)時(shí)序時(shí)數(shù)長(zhǎng)度為N(N最好是2的整數(shù)次冪,這樣算起來更快)蟆融,用fft()轉(zhuǎn)換后:下標(biāo)為0和 N /2的兩個(gè)復(fù)數(shù)的虛數(shù)部分為0草巡,下標(biāo)為i和 N - i 的兩個(gè)復(fù)數(shù)共輒,也就是其虛部數(shù)值相同型酥、符號(hào)相反山憨。再用ifft()從頻域轉(zhuǎn)回時(shí)域之后,出現(xiàn)了由誤差引起的很小的虛部弥喉,用np.real()取其實(shí)部即可.
?由于一半是另一半的共軛郁竟,因此只需要關(guān)心一半數(shù)據(jù).fft轉(zhuǎn)換后下標(biāo)為0的實(shí)數(shù)表示時(shí)域信號(hào)中的直流成分(不隨時(shí)間變化),下標(biāo)為i的復(fù)數(shù) a + bj由境,其中a表示余弦成分棚亩,b表示其正弦成分.

(2) 示例功能

?數(shù)據(jù)是航空乘客數(shù)據(jù)"AirPassengers.csv",可以從CSDN下載虏杰,其中包括從1949-1960年蔑舞,每月旅客的數(shù)量,程序預(yù)測(cè)未來幾年的旅客數(shù)據(jù).

?如圖所示嘹屯,數(shù)據(jù)為非平穩(wěn)數(shù)據(jù)攻询,其趨勢(shì)向上,且波動(dòng)加俱州弟,為將其變?yōu)槠椒€(wěn)數(shù)據(jù)钧栖, 先對(duì)其做了對(duì)數(shù)和差分處理.

(3) 示例代碼

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 函數(shù)功能:將頻域數(shù)據(jù)轉(zhuǎn)換成時(shí)序數(shù)據(jù)
# bins為頻域數(shù)據(jù),n設(shè)置使用前多少個(gè)頻域數(shù)據(jù)婆翔,loop設(shè)置生成數(shù)據(jù)的長(zhǎng)度

def fft_combine(bins, n, loops=1):
 length = int(len(bins) * loops)
 data = np.zeros(length)
 index = loops * np.arange(0, length, 1.0) / length * (2 * np.pi)
 for k, p in enumerate(bins[:n]):
   if k != 0 : p *= 2 # 除去直流成分之外, 其余的系數(shù)都 * 2
   data += np.real(p) * np.cos(k*index) # 余弦成分的系數(shù)為實(shí)數(shù)部分
   data -= np.imag(p) * np.sin(k*index) # 正弦成分的系數(shù)為負(fù)的虛數(shù)部分
 return index, data

if __name__ == '__main__':
 data = pd.read_csv('AirPassengers.csv')
 ts = data['Passengers']

# 平穩(wěn)化
 ts_log = np.log(ts)
 ts_diff = ts_log.diff(1)
 ts_diff = ts_diff.dropna()
 print(fy[:10]) # 顯示前10個(gè)頻域數(shù)據(jù)
 fy = np.fft.fft(ts_diff)
 conv1 = np.real(np.fft.ifft(fy)) # 逆變換
 index, conv2 = fft_combine(fy / len(ts_diff), int(len(fy)/2-1), 1.3) # 只關(guān)心一半數(shù)據(jù)
 plt.plot(ts_diff)
 plt.plot(conv1 - 0.5) # 為看清楚拯杠,將顯示區(qū)域下拉0.5
 plt.plot(conv2 - 1)
plt.show()

(4) 運(yùn)行結(jié)果

[ 1.34992672+0. j -0.09526905-0.14569535j -0.03664114-0.12007802j
 -0.2670005 +0.24512406j -0.10075074+0.0314084 j -0.26409417+0.04197159j
 0.14411338+0.18703009j 0.07467991+0.05367644j -0.26663142+0.15324939j
 0.03248223+0.14130114j]

(5). 示例分析

?輸出的是fft轉(zhuǎn)換后的數(shù)據(jù),只顯示了前十個(gè)啃奴,形式為復(fù)數(shù).復(fù)數(shù)模(絕對(duì)值)的兩倍為對(duì)應(yīng)頻率的余弦波的振幅潭陪;復(fù)數(shù)的輻角表示對(duì)應(yīng)頻率的余弦波的相位。第0個(gè)元素表示直流分量,虛部為0.在數(shù)據(jù)中的位置標(biāo)記了頻率大小依溯,值標(biāo)記了振幅大欣涎帷.
?圖中顯示的三條曲線分別為原始數(shù)據(jù),做了fft以及ifft逆變換后的數(shù)據(jù)黎炉,以及fft后自己實(shí)現(xiàn)算法還原并預(yù)測(cè)了未來的數(shù)據(jù)枝秤,從圖中可見,基本擬合了原始曲線慷嗜,預(yù)測(cè)曲線看起來也比較合理.
?上述方法可實(shí)現(xiàn)用傅里葉變換預(yù)測(cè)時(shí)序數(shù)據(jù).與ARMA算法相比淀弹,它沒有明顯衰減,更適合長(zhǎng)時(shí)間的預(yù)測(cè).
?對(duì)于隨時(shí)間變化的波形庆械,比如語音數(shù)據(jù)薇溃,一般使用加窗后做傅立葉變量的方法擬合數(shù)據(jù).

3. 小波變換

(1) 相關(guān)知識(shí)

?有了傅立葉變換,為什么還用小波呢缭乘?上面提到沐序,如果波型隨時(shí)間變化,就需要對(duì)波型加窗分段后再處理忿峻,而且有時(shí)候需要大窗口,有時(shí)候需要小窗口辕羽,處理起來就更加麻煩.于是引入了更靈活的小波.
?傅立葉變換的基是正余弦函數(shù)逛尚,而小波的基是各種形狀小波,也就是說它把整個(gè)波形看成是多個(gè)位置和寬度不同的小波的疊加.小波有兩個(gè)變量:尺度a和平移量t刁愿,尺度控制小伸的伸縮绰寞,平移量控制小波的平移,它不需將數(shù)據(jù)切分成段铣口,就可以處理時(shí)變數(shù)據(jù).尤其對(duì)突變信號(hào)處理得更好.
?下圖是幾種常見的小波.

?離散小波變換滤钱,Discrete Wavelet Transformatio (dwt),可以說是小波變換中最簡(jiǎn)單的一種脑题。這里使用Python調(diào)用pywt庫(kù)實(shí)現(xiàn)最簡(jiǎn)單的功能.
?經(jīng)過變換之后的返回值:cA:Approximation(近似), cD:Detail(細(xì)節(jié))件缸,其中近似cA是周期性有規(guī)律的部分,可以被模擬和預(yù)測(cè)叔遂,而cD可看做是噪聲他炊。換言之,用此方法可以拆分周期性數(shù)據(jù)已艰,和其上的擾動(dòng)數(shù)據(jù)痊末。

(2) 示例功能

?示例使用的仍然是乘客數(shù)據(jù),下面代碼是將細(xì)節(jié)D設(shè)為0哩掺,然后還原凿叠。

(3) 示例代碼

import pywt
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

if __name__ == '__main__':
 data = pd.read_csv('AirPassengers.csv')
 ts = data['Passengers']
 # 平穩(wěn)化
 ts_log = np.log(ts)
 ts_diff = ts_log.diff(1)
 ts_diff = ts_diff.dropna()

 cA,cD = pywt.dwt(ts_diff, 'db2')
 cD = np.zeros(len(cD))
 new_data = pywt.idwt(cA, cD, 'db2')

 plt.plot(ts_diff)
 plt.plot(new_data - 0.5)

 plt.show()

(4) 運(yùn)行結(jié)果

(5) 示例分析

?可以看到,用小波擬合的效果也還可以,一般可以使用小波擬合cA盒件,使用ARMA擬合cD部分蹬碧,兩種方法配合使用.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市履恩,隨后出現(xiàn)的幾起案子锰茉,更是在濱河造成了極大的恐慌,老刑警劉巖切心,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件飒筑,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡绽昏,警方通過查閱死者的電腦和手機(jī)协屡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來全谤,“玉大人肤晓,你說我怎么就攤上這事∪先唬” “怎么了补憾?”我有些...
    開封第一講書人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)卷员。 經(jīng)常有香客問我盈匾,道長(zhǎng),這世上最難降的妖魔是什么毕骡? 我笑而不...
    開封第一講書人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任削饵,我火速辦了婚禮,結(jié)果婚禮上未巫,老公的妹妹穿的比我還像新娘窿撬。我一直安慰自己,他們只是感情好叙凡,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開白布劈伴。 她就那樣靜靜地躺著,像睡著了一般握爷。 火紅的嫁衣襯著肌膚如雪宰啦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評(píng)論 1 290
  • 那天饼拍,我揣著相機(jī)與錄音赡模,去河邊找鬼。 笑死师抄,一個(gè)胖子當(dāng)著我的面吹牛漓柑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼辆布,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼瞬矩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起锋玲,我...
    開封第一講書人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤景用,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后惭蹂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體伞插,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年盾碗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了媚污。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡廷雅,死狀恐怖耗美,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情航缀,我是刑警寧澤商架,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站芥玉,受9級(jí)特大地震影響蛇摸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜飞傀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一皇型、第九天 我趴在偏房一處隱蔽的房頂上張望诬烹。 院中可真熱鬧砸烦,春花似錦、人聲如沸绞吁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)家破。三九已至颜说,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間汰聋,已是汗流浹背门粪。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留烹困,地道東北人玄妈。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親拟蜻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子绎签,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容