6 種用 LSTM 做時間序列預(yù)測的模型結(jié)構(gòu) - Keras 實現(xiàn)

LSTM(Long Short Term Memory Network)長短時記憶網(wǎng)絡(luò)辩恼,是一種改進(jìn)之后的循環(huán)神經(jīng)網(wǎng)絡(luò),可以解決 RNN 無法處理長距離的依賴的問題谓形,在時間序列預(yù)測問題上面也有廣泛的應(yīng)用灶伊。

今天我們根據(jù)問題的輸入輸出模式劃分,來看一下幾種時間序列問題所對應(yīng)的 LSTM 模型結(jié)構(gòu)如何實現(xiàn)寒跳。


1. Univariate

Univariate 是指:

input 為多個時間步聘萨,
output 為一個時間的問題。

數(shù)例:

訓(xùn)練集:
X,          y
10, 20, 30      40
20, 30, 40      50
30, 40, 50      60
…


預(yù)測輸入:
X童太,
70, 80, 90

模型的 Keras 代碼:

# define model【Vanilla LSTM】

model = Sequential()
model.add( LSTM(50,  activation='relu',  input_shape = (n_steps, n_features)) )
model.add( Dense(1) )
model.compile(optimizer='adam', loss='mse')

n_steps = 3
n_features = 1

其中:

n_steps 為輸入的 X 每次考慮幾個時間步
n_features 為每個時間步的序列數(shù)

這個是最基本的模型結(jié)構(gòu)米辐,我們后面幾種模型會和這個進(jìn)行比較。


2. Multiple Input

Multiple Input 是指:

input 為多個序列书释,
output 為一個序列的問題翘贮。

數(shù)例:

訓(xùn)練集:
X,       y
[[10 15]
 [20 25]
 [30 35]] 65
[[20 25]
 [30 35]
 [40 45]] 85
[[30 35]
 [40 45]
 [50 55]] 105
[[40 45]
 [50 55]
 [60 65]] 125
…


預(yù)測輸入:
X爆惧,
80,  85
90,  95
100,     105

即數(shù)據(jù)樣式為:

in_seq1: [10, 20, 30, 40, 50, 60, 70, 80, 90]
in_seq2: [15, 25, 35, 45, 55, 65, 75, 85, 95]

out_seq: [in_seq1[i]+in_seq2[i] for i in range(len(in_seq1))]

模型的 Keras 代碼:

# define model【Vanilla LSTM】
model = Sequential()
model.add(LSTM(50, activation='relu', input_shape=(n_steps, n_features)))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')

n_steps = 3
# 此例中 n features = 2狸页,因為輸入有兩個并行序列
n_features = X.shape[2]    

其中:

n_steps 為輸入的 X 每次考慮幾個時間步
n_features 此例中 = 2,因為輸入有兩個并行序列

和 Univariate 相比:

模型的結(jié)構(gòu)代碼是一樣的扯再,只是在 n_features = X.shape[2]芍耘,而不是 1.


3. Multiple Parallel

Multiple Parallel 是指:

input 為多個序列,
output 也是多個序列的問題熄阻。

數(shù)例:

訓(xùn)練集:
X,          y
[[10 15 25]
 [20 25 45]
 [30 35 65]] [40 45 85]
[[20 25 45]
 [30 35 65]
 [40 45 85]] [ 50  55 105]
[[ 30  35  65]
 [ 40  45  85]
 [ 50  55 105]] [ 60  65 125]
[[ 40  45  85]
 [ 50  55 105]
 [ 60  65 125]] [ 70  75 145]
…


預(yù)測輸入:
X斋竞,
70, 75, 145
80, 85, 165
90, 95, 185

模型的 Keras 代碼:

# define model【Vanilla LSTM】
model = Sequential()
model.add(LSTM(100, activation='relu', return_sequences=True, input_shape=(n_steps, n_features)))
model.add(Dense(n_features))
model.compile(optimizer='adam', loss='mse')

n_steps = 3
# 此例中 n features = 3,因為輸入有3個并行序列
n_features = X.shape[2]       

其中:

n_steps 為輸入的 X 每次考慮幾個時間步
n_features 此例中 = 3饺律,因為輸入有 3 個并行序列

和 Univariate 相比:

模型結(jié)構(gòu)的定義中窃页,多了一個 return_sequences=True,即返回的是序列复濒,
輸出為 Dense(n_features)脖卖,而不是 1.


4. Multi-Step

Multi-Step 是指:

input 為多個時間步,
output 也是多個時間步的問題巧颈。

數(shù)例:

訓(xùn)練集:
X,          y
[10 20 30] [40 50]
[20 30 40] [50 60]
[30 40 50] [60 70]
[40 50 60] [70 80]
…


預(yù)測輸入:
X畦木,
[70, 80, 90]

模型的 Keras 代碼:

# define model【Vanilla LSTM】
model = Sequential()
model.add(LSTM(100, activation='relu', return_sequences=True, input_shape=(n_steps_in, n_features)))
model.add(LSTM(100, activation='relu'))
model.add(Dense(n_steps_out))
model.compile(optimizer='adam', loss='mse')

n_steps_in, n_steps_out = 3, 2
n_features = 1     

其中:

n_steps_in 為輸入的 X 每次考慮幾個時間步
n_steps_out 為輸出的 y 每次考慮幾個時間步
n_features 為輸入有幾個序列

和 Univariate 相比:

模型結(jié)構(gòu)的定義中,多了一個 return_sequences=True砸泛,即返回的是序列十籍,
而且 input_shape=(n_steps_in, n_features) 中有代表輸入時間步數(shù)的 n_steps_in
輸出為 Dense(n_steps_out)唇礁,代表輸出的 y 每次考慮幾個時間步.

當(dāng)然這個問題還可以用 Encoder-Decoder 結(jié)構(gòu)實現(xiàn):

# define model【Encoder-Decoder Model】
model = Sequential()
model.add(LSTM(100, activation='relu', input_shape=(n_steps_in, n_features)))
model.add(RepeatVector(n_steps_out))
model.add(LSTM(100, activation='relu', return_sequences=True))
model.add(TimeDistributed(Dense(1)))
model.compile(optimizer='adam', loss='mse')

5. Multivariate Multi-Step

Multivariate Multi-Step 是指:

input 為多個序列勾栗,
output 為多個時間步的問題。

數(shù)例:

訓(xùn)練集:
X,          y
[[10 15]
 [20 25]
 [30 35]] [65 
          85]
[[20 25]
 [30 35]
 [40 45]] [ 85
           105]
[[30 35]
 [40 45]
 [50 55]] [105 
         125]
…


預(yù)測輸入:
X盏筐,
[40 45]
 [50 55]
 [60 65]

模型的 Keras 代碼:

# define model
model = Sequential()
model.add(LSTM(100, activation='relu', return_sequences=True, input_shape=(n_steps_in, n_features)))
model.add(LSTM(100, activation='relu'))
model.add(Dense(n_steps_out))
model.compile(optimizer='adam', loss='mse')

n_steps_in, n_steps_out = 3, 2
# 此例中 n features = 2围俘,因為輸入有2個并行序列  
n_features = X.shape[2]        

其中:

n_steps_in 為輸入的 X 每次考慮幾個時間步
n_steps_out 為輸出的 y 每次考慮幾個時間步
n_features 為輸入有幾個序列,此例中 = 2琢融,因為輸入有 2 個并行序列

和 Univariate 相比:

模型結(jié)構(gòu)的定義中界牡,多了一個 return_sequences=True,即返回的是序列漾抬,
而且 input_shape=(n_steps_in, n_features) 中有代表輸入時間步數(shù)的 n_steps_in宿亡,
輸出為 Dense(n_steps_out),代表輸出的 y 每次考慮幾個時間步纳令,
另外 n_features = X.shape[2]挽荠,而不是 1,
相當(dāng)于是 Multivariate 和 Multi-Step 的結(jié)構(gòu)組合起來平绩。


6. Multiple Parallel Input & Multi-Step Output

Multiple Parallel Input & Multi-Step Output 是指:

input 為多個序列坤按,
output 也是多個序列 & 多個時間步的問題。

數(shù)例:

訓(xùn)練集:
X,          y
[[10 15 25]
 [20 25 45]
 [30 35 65]] [[ 40  45  85]
          [ 50  55 105]]
[[20 25 45]
 [30 35 65]
 [40 45 85]] [[ 50  55 105]
          [ 60  65 125]]
[[ 30  35  65]
 [ 40  45  85]
 [ 50  55 105]] [[ 60  65 125]
             [ 70  75 145]]
…


預(yù)測輸入:
X馒过,
[[ 40  45  85]
 [ 50  55 105]
 [ 60  65 125]]

模型的 Keras 代碼:

# define model【Encoder-Decoder model】
model = Sequential()
model.add(LSTM(200, activation='relu', input_shape=(n_steps_in, n_features)))
model.add(RepeatVector(n_steps_out))
model.add(LSTM(200, activation='relu', return_sequences=True))
model.add(TimeDistributed(Dense(n_features)))
model.compile(optimizer='adam', loss='mse')

n_steps_in, n_steps_out = 3, 2
# 此例中 n features = 3臭脓,因為輸入有3個并行序列   
n_features = X.shape[2]       

其中:

n_steps_in 為輸入的 X 每次考慮幾個時間步
n_steps_out 為輸出的 y 每次考慮幾個時間步
n_features 為輸入有幾個序列

這里我們和 Multi-Step 的 Encoder-Decoder 相比:

二者的模型結(jié)構(gòu),只是在最后的輸出層參數(shù)不同腹忽,
TimeDistributed(Dense(n_features)) 而不是 Dense(1)来累。


好啦,這幾種時間序列的輸入輸出模式所對應(yīng)的代碼結(jié)構(gòu)就是這樣窘奏,如果您還有更有趣的嘹锁,歡迎補(bǔ)充!


大家好着裹!
我是 不會停的蝸牛 Alice领猾,
喜歡人工智能,沒事兒寫寫機(jī)器學(xué)習(xí)干貨,
歡迎關(guān)注我摔竿!


推薦閱讀歷史技術(shù)博文鏈接匯總
http://www.reibang.com/p/28f02bb59fe5
也許可以找到你想要的:
[入門問題][TensorFlow][深度學(xué)習(xí)][強(qiáng)化學(xué)習(xí)][神經(jīng)網(wǎng)絡(luò)][機(jī)器學(xué)習(xí)][自然語言處理][聊天機(jī)器人]

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末面粮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子继低,更是在濱河造成了極大的恐慌熬苍,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件袁翁,死亡現(xiàn)場離奇詭異柴底,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)粱胜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門柄驻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人焙压,你說我怎么就攤上這事凿歼。” “怎么了冗恨?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵答憔,是天一觀的道長。 經(jīng)常有香客問我掀抹,道長虐拓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任傲武,我火速辦了婚禮蓉驹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘揪利。我一直安慰自己态兴,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布疟位。 她就那樣靜靜地躺著瞻润,像睡著了一般。 火紅的嫁衣襯著肌膚如雪甜刻。 梳的紋絲不亂的頭發(fā)上绍撞,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機(jī)與錄音得院,去河邊找鬼傻铣。 笑死,一個胖子當(dāng)著我的面吹牛祥绞,可吹牛的內(nèi)容都是我干的非洲。 我是一名探鬼主播鸭限,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼两踏!你這毒婦竟也來了败京?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤缆瓣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后虹统,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弓坞,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年车荔,在試婚紗的時候發(fā)現(xiàn)自己被綠了渡冻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡忧便,死狀恐怖族吻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情珠增,我是刑警寧澤超歌,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站蒂教,受9級特大地震影響巍举,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜凝垛,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一懊悯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧梦皮,春花似錦炭分、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至让网,卻和暖如春岖妄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背寂祥。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工荐虐, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人丸凭。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓福扬,卻偏偏與公主長得像腕铸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子铛碑,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

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