LSTM预测代码

import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt


HIDDEN_SIZE = 200  # LSTM中隐藏节点的个数。
NUM_LAYERS = 5  # LSTM的层数。
TIMESTEPS = 10  # 循环神经网络的训练序列长度。
train_data_len = 10000  # 训练数据个数。
test_data_len = 1000  # 测试数据个数。
period_sin = 0.01  # 采样间隔。


def generate_data(seq):
    X = []
    y = []
    for i in range(len(seq) - TIMESTEPS):
        X.append([seq[i: i + TIMESTEPS]])
        y.append([seq[i + TIMESTEPS]])
    return np.array(X, dtype=np.float32), np.array(y, dtype=np.float32)


def lstm_model():
    model = tf.keras.Sequential()
    model.add(tf.keras.layers.LSTM(HIDDEN_SIZE, return_sequences=False, input_shape=(TIMESTEPS, 1)))
    model.add(tf.keras.layers.Dense(1))  # 输出层
    model.compile(optimizer='adam', loss='mean_squared_error')
    return model


def train(model, train_X, train_y):
    model.fit(train_X, train_y, batch_size=32, epochs=30)


def predict_future(model, initial_input, future_steps=1000):
    predictions = []
    input_seq = initial_input

    for _ in range(future_steps):
        pred = model.predict(input_seq)
        predictions.append(pred[0, 0])

        input_seq = np.roll(input_seq, -1, axis=1)
        input_seq[0, -1, 0] = pred

    return np.array(predictions)

test_start = (train_data_len + TIMESTEPS) * period_sin
test_end = test_start + (test_data_len + TIMESTEPS) * period_sin

# 创建训练集数据
train_X, train_y = generate_data(np.sin(np.linspace(
    0, test_start, train_data_len + TIMESTEPS, dtype=np.float32)) + 2 * np.cos(np.linspace(
    0, test_start, train_data_len + TIMESTEPS, dtype=np.float32)))


test_X, test_y = generate_data(np.sin(np.linspace(
    test_start, test_end, test_data_len + TIMESTEPS, dtype=np.float32)) + 2 * np.cos(np.linspace(
    0, test_start, test_data_len + TIMESTEPS, dtype=np.float32)))


train_X = train_X.squeeze(axis=1)
test_X = test_X.squeeze(axis=1)

train_X = np.expand_dims(train_X, axis=-1)
test_X = np.expand_dims(test_X, axis=-1)



model = lstm_model()


train(model, train_X, train_y)

last_input = test_X[-1:]
future_predictions = predict_future(model, last_input, future_steps=1000)


future_time = np.linspace(test_end, test_end + 1000 * period_sin, 1000)
future_real_values = np.sin(future_time) + 2 * np.cos(future_time)


plt.figure(figsize=(10, 6))
plt.plot(future_predictions, label='Predicted Future Values', color='r')
plt.plot(future_real_values, label='Real Future Values (sin)', color='b', linestyle='--')
plt.legend()
plt.xlabel('Time (s)')
plt.ylabel('Displacement (um/Hz^1/2)')
plt.title('Prediction vs. Real Values for Future Data')
plt.show()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值