Keras 利用LSTM来预测序列数据

 看了好多序列预测的都是seq2seq的翻译模式的预测,根本没有预测未来的数据,这篇文章具体用最简单的一层lstm实现了一个预测实例

GitHub

import numpy as np
import matplotlib.pyplot as plt

step = 3  #步长
size = 6  #输入大小
forward = 3  #向后预测几步


def load_data():
    """
    [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]
    [ 0,  1,  2,  3,  4]  ⇨⋙ [ 5,  6,  7,  8]  
    [ 3,  4,  5,  6,  7]  ⇨⋙ [ 8,  9, 10, 11] 
    """
    # 生成滑动窗口式的数据
    data = np.arange(100)
    data_X, data_Y = [], []
    for i in range(data.shape[0] // step):
        if not (i * step + size + forward) >= data.shape[0]:
            data_X.append(data[i * step:i * step + size])
            data_Y.append(data[i * step + size:i * step + size + forward])
    
    # reshape变成keras可接受的输入
    data_X, data_Y = np.array(data_X), np.array(data_Y)
    data_X = data_X.reshape(data_X.shape[0], 1, data_X.shape[1])
    data_Y = data_Y.reshape(data_Y.shape[0], 1, data_Y.shape[1])

    # 划分训练集70%,验证集20%,测试集10%
    train_X = data_X[:round(data_X.shape[0] * 0.7)]
    valid_X = data_X[round(data_X.shape[0] * 0.7):round(data_X.shape[0] * 0.9)]
    test_X = data_X[round(data_X.shape[0] * 0.9):]

    train_Y = data_Y[:round(data_Y.shape[0] * 0.7)]
    valid_Y = data_Y[round(data_Y.shape[0] * 0.7):round(data_Y.shape[0] * 0.9)]
    test_Y = data_Y[round(data_Y.shape[0] * 0.9):]

    return (train_X, valid_X, test_X), (train_Y, valid_Y, test_Y), data


def rnn_model():
    from tensorflow import keras

    (train_X, valid_X, test_X), (train_Y, valid_Y, test_Y), data = load_data()

    model = keras.models.Sequential()
    model.add(keras.layers.LSTM(units=6, return_sequences=True, activation='relu', input_shape=(train_X.shape[1], train_X.shape[2])))
    model.add(keras.layers.GRU(units=6, return_sequences=True, activation='relu'))
    model.add(keras.layers.Dense(units=train_Y.shape[2]))
    model.compile(loss=keras.losses.mean_absolute_error, optimizer=keras.optimizers.Adam())
    model.summary()
    history = model.fit(train_X, train_Y, validation_data=(valid_X, valid_Y), epochs=500, batch_size=32)

    plt.figure(figsize=(24, 8))

    plt.subplot(211)
    plt.plot(history.history['loss'][40:], label='train_loss')
    plt.plot(history.history['val_loss'][40:], label='valid_loss')
    train_predict = model.predict(train_X)
    valid_predict = model.predict(valid_X)
    test_predict = model.predict(test_X)
    plt.grid(axis='y')
    plt.legend()

    plt.subplot(212)
    plt.grid(axis='x')
    plt.plot([i for i in train_Y.reshape(-1)] + [i for i in valid_Y.reshape(-1)] + [i for i in test_Y.reshape(-1)], '-o', label="train+valid+test Y")
    plt.plot([i for i in train_predict.reshape(-1)] + [i for i in valid_predict.reshape(-1)] + [i for i in test_predict.reshape(-1)], '-o', label="predict Y")
    plt.legend()
    print(test_X)
    print(test_Y)
    print(test_predict)
    plt.show()


if __name__ == "__main__":
    rnn_model()
    # load_data()

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值