# 代码功能: LS-TM 循环神经网络,预测时间序列------------------------------------
# 第1步: 处理原始数据集, 归一化,制作X_train、Y_train、X_test、Y_test
# 第2步: 训练LS-TM网络, epoch=300
# 第3步: 时间序列预测
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential
from keras.layers import LSTM, Dense, Activation
# read raw data
csv = pd.read_csv('international-airline-passengers.csv', usecols=['passengers'])
min_max = MinMaxScaler() # normalize
raw_data = min_max.fit_transform(csv) # 144
# make training set、testing set
seq_len = 10
data = []
for i in range(len(raw_data)-seq_len):
data.append(raw_data[i:i+seq_len+1])
data = np.array(data) # (134, 11, 1)
X_train = data[0:120, :-1] # (120, 10, 1)
Y_train = data[0:120, -1] # (120, 1)
X_test = data[120:len(data), :-1] # (14, 10, 1)
Y_test = data[120:len(data), -1] # (14, 1)
# RNN structure
model = Sequential()
model.add(LSTM(units=256, input_shape=(10, 1), return_sequences=True))
model.add(LSTM(units=256))
model.add(Dense(units=1))
model.add(Activation('linear'))
model.compile(loss='mse', optimizer='adam')
model.fit(X_train, Y_train, batch_size=20, epochs=300)
# predict train time series
plt.plot(min_max.inverse_transform(Y_train), 'b', label='Train real data')
plt.plot(min_max.inverse_transform(model.predict(X_train)), 'r:', label='LS_TM predict')
plt.legend()
plt.savefig('1.jpg')
plt.show()
# predict test time series
plt.plot(min_max.inverse_transform(Y_test), 'b--', marker='o', label='Test real data')
plt.plot(min_max.inverse_transform(model.predict(X_test)), 'r:', marker='*', label='LS_TM predict')
plt.legend()
plt.savefig('2.jpg')
plt.show()