当前位置:   article > 正文

TensorFlow框架下的LSTM时间序列预测【简易】

TensorFlow框架下的LSTM时间序列预测【简易】

LSTM时间序列预测【直接上例子】

代码如下(前面的分块,最后是总的代码):

  • 导入相关库
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM,Dense,Dropout
import matplotlib.pyplot as plt
  • 1
  • 2
  • 3
  • 4
  • 生成数据集
# 在0-999生成1000个值
x = np.linspace(0,999,1000)
# 主要生成y为周期曲线用于后续预测
y = np.sin(x*2*3.1415926/70)
# 可视化展示构建曲线
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.title("sin")
plt.plot(y, color='#800080')
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

可视化结果如下:
在这里插入图片描述

  • 数据集划分
# 将数据分成两部分,训练集由前930个值构成,测试集由最后70个值构成
train_y = y[:-70]
test_y = y[-70:]
  • 1
  • 2
  • 3
  • 滑窗构建数据集
# 创建滑窗数据集
def create_data_seq(seq,time_window):
    x = []
    y = []
    l = len(seq)
    for i in range(l-time_window):
        x_tw = seq[i:i+time_window]
        y_tw = seq[i+time_window:i+time_window+1]
        x.append(x_tw)
        y.append(y_tw)
    return np.expand_dims(np.array(x),axis=2), np.array(y)
# 设置滑窗个数
time_window = 30
# 训练集
train_X, train_Y = create_data_seq(train_y,time_window)
# 测试集
test_X, test_Y = create_data_seq(test_y,time_window)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 网络构建
model = Sequential()
model.add(LSTM(30, input_shape=(train_X.shape[1], train_X.shape[2]))) #lstm层,设置30个神经元
model.add(Dropout(0.5)) #随机丢弃50%
model.add(Dense(1,activation='tanh')) #激活函数为tanh,线性层
model.compile(loss='mae', optimizer='adam') #损失函数为mae,优化函数为adam
  • 1
  • 2
  • 3
  • 4
  • 5
  • 模型训练
model.fit(train_X, train_Y, epochs=10, batch_size=8, verbose=2)
  • 1

训练效果展示:
请添加图片描述

  • 模型预测
# 训练集预测,可视化查看拟合效果
plt.plot(model.predict(test_X).reshape(-1),label='pre')
plt.plot(test_Y, color='#800080',label='true')
plt.legend()
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5

拟合效果展示:
请添加图片描述

完整代码

import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM,Dense,Dropout
import matplotlib.pyplot as plt

# 生成数据集
x = np.linspace(0,999,1000) #start, end, step
y = np.sin(x*2*3.1415926/70)
# 可视化
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.title("sin")
plt.plot(y, color='#800080')
plt.show()

# 将数据分成两部分,训练集由前930个值构成,测试集由最后70个值构成
train_y = y[:-70]
test_y = y[-70:]

# 创建滑窗数据集
def create_data_seq(seq,time_window):
    x = []
    y = []
    l = len(seq)
    for i in range(l-time_window):
        x_tw = seq[i:i+time_window]
        y_tw = seq[i+time_window:i+time_window+1]
        x.append(x_tw)
        y.append(y_tw)
    return np.expand_dims(np.array(x),axis=2), np.array(y)
# 设置滑窗个数
time_window = 30
# 训练集
train_X, train_Y = create_data_seq(train_y,time_window)
# 测试集
test_X, test_Y = create_data_seq(test_y,time_window)

# 网络构建
model = Sequential()
model.add(LSTM(30, input_shape=(train_X.shape[1], train_X.shape[2]))) #lstm层,设置30个神经元
model.add(Dropout(0.5)) #随机丢弃50%
model.add(Dense(1,activation='tanh')) #激活函数为tanh,线性层
model.compile(loss='mae', optimizer='adam') #损失函数为mae,优化函数为adam

# 模型训练
model.fit(train_X, train_Y, epochs=10, batch_size=8, verbose=2)

# 训练集预测,可视化查看拟合效果
plt.plot(model.predict(test_X).reshape(-1),label='pre')
plt.plot(test_Y, color='#800080',label='true')
plt.legend()
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

感谢阅读!! 有用的话点赞呗~~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/978468
推荐阅读
相关标签
  

闽ICP备14008679号