基于LSTM及其变体的回归预测

1 所用模型

       代码中用到了以下模型:

      1. LSTM(Long Short-Term Memory):长短时记忆网络,是一种特殊的RNN(循环神经网络),能够解决传统RNN在处理长序列时出现的梯度消失或爆炸的问题。LSTM有门控机制,可以选择性地记住或忘记信息。

       2. FC-LSTM:全连接的LSTM,与传统的LSTM相比,其细胞单元之间采用全连接的方式。

       3. Coupled LSTM:耦合LSTM,是一种特殊的LSTM结构,其中每个LSTM单元被分解为两个交互的子单元。

       4. GRU(Gated Recurrent Unit):门控循环单元,与LSTM类似,但结构更简单,参数更少,通常训练更快,但可能不如LSTM准确。

       5. ConvLSTM:卷积LSTM,将卷积神经网络(CNN)与LSTM结合,可以捕捉时空特征,常用于处理图像和视频数据。

       6. Deep LSTM:深层LSTM,包含多个LSTM层的堆叠,可以捕捉更复杂的模式。

       7. DB-LSTM(Bidirectional LSTM):双向LSTM,有两个方向的LSTM层,一个按时间顺序,一个逆序,可以同时获取过去和未来的信息。

       8. SRU(SimpleRNN):简单循环神经网络,是最基本的RNN形式。

       9. TPA-LSTM:时间感知LSTM,通过改变LSTM的内部计算方式,使其更加关注时间序列的特性。

       10. ConvGRU:卷积GRU,与ConvLSTM类似,但使用GRU代替LSTM。

       这些模型都是用于处理序列数据的深度学习模型,特别适用于时间序列预测、自然语言处理等领域。

2 运行结果

       左边是Epoch=50次的效果,右边是Epoch=15次的效果:

a1e88c48c6f645eea96360f59b239c00.jpg

 图2-1 训练损失

3623cb88b9294ce796d7dbacd244f481.jpg

 图2-2 测试损失

d9ab03d1196542bf9235bafc58288e07.jpg

 图2-3 预测结果

3 代码

     

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import Dense, LSTM, GRU, SimpleRNN, Bidirectional, TimeDistributed, Conv1D, Attention
from keras.layers import Flatten, Dropout, BatchNormalization
from keras.optimizers import Adam
from keras.callbacks import EarlyStopping
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
from tensorflow.keras.layers import Conv1D
# 读取数据
data = pd.read_excel('A.xlsx')
data=data.dropna()
data = data['A'].values.reshape(-1, 1)
# 数据预处理
scaler = MinMaxScaler()
data = scaler.fit_transform(data)

# 划分训练集和测试集
train_size = int(len(data) * 0.8)
train, test = data[:train_size], data[train_size:]

# 转换数据格式以适应LSTM输入
def create_dataset(dataset, look_back=1):
    X, Y = [], []
    for i in range(len(dataset) - look_back - 1):
        X.append(dataset[i:(i + look_back), 0])
        Y.append(dataset[i + look_back, 0])
    return np.array(X), np.array(Y)
 
look_back = 1
X_train, y_train = create_dataset(train, look_back)
X_test, y_test = create_dataset(test, look_back)
 
# 重塑输入数据的维度以适应LSTM模型
X_train = np.reshape(X_train, (X_train.shape[0], 1, X_train.shape[1]))
X_test = np.reshape(X_test, (X_test.shape[0], 1, X_test.shape[1]))
# 定义模型函数
def create_model(name):
    model = Sequential()
    if name == 'LSTM':
        model.add(LSTM(50, activation='relu', input_shape=(1, 1)))
    elif name == 'FC-LSTM':
        model.add(LSTM(50, activation='relu', input_shape=(1, 1), recurrent_activation='sigmoid'))
    elif name == 'Coupled LSTM':
        model.add(LSTM(50, activation='relu', input_shape=(1, 1), implementation=2))
    elif name == 'GRU':
        model.add(GRU(50, activation='relu', input_shape=(1, 1)))
    elif name == 'ConvLSTM':
        model.add(Conv1D(filters=64, kernel_size=1, activation='relu', input_shape=(1, 1)))
        model.add(LSTM(50, activation='relu'))
    elif name == 'Deep LSTM':
        model.add(LSTM(50, return_sequences=True, activation='relu', input_shape=(1, 1)))
        model.add(LSTM(50, activation='relu'))
    elif name == 'DB-LSTM':
        model.add(Bidirectional(LSTM(50, activation='relu'), input_shape=(1, 1)))
    elif name == 'SRU':
        model.add(SimpleRNN(50, activation='relu', input_shape=(1, 1)))
    elif name == 'TPA-LSTM':
        model.add(LSTM(50, activation='relu', input_shape=(1, 1), unroll=True))
    elif name == 'ConvGRU':
        model.add(Conv1D(filters=64, kernel_size=1, activation='relu', input_shape=(1, 1)))
        model.add(GRU(50, activation='relu'))
    model.add(Dense(1))
    model.compile(optimizer=Adam(), loss='mse')
    return model

# 训练模型并绘制损失图
names = ['LSTM', 'FC-LSTM', 'Coupled LSTM', 'GRU', 'ConvLSTM', 'Deep LSTM', 'DB-LSTM','SRU', 'TPA-LSTM', 'ConvGRU']
train_losses = []
test_losses = []
predictions = []

for name in names:
    model = create_model(name)
    history = model.fit(train, train, epochs=15, batch_size=32, validation_data=(test, test), verbose=0)
    train_losses.append(history.history['loss'])
    test_losses.append(history.history['val_loss'])
    pred = model.predict(test)
    predictions.append(pred)
    
    
import matplotlib.pyplot as plt

# 设置不同的marker
markers = ['o', '.', '_', '^', '*', '>', '+', '1', 'p', '_', '8']
linestyles = ['-', '--', '--', ':', '-', '-.', '-.', ':', '-', '--']
# 绘制训练损失图
plt.figure(figsize=(16, 20))
for i, loss in enumerate(train_losses):
    plt.plot(loss, color='black',label=names[i], marker=markers[i], linestyle=linestyles[i])
plt.title('Train Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend(fontsize=8,loc='best')
plt.show()
# 绘制测试损失图
for i, loss in enumerate(test_losses):
    plt.plot(loss, color='black',label=names[i], marker=markers[i], linestyle=linestyles[i])
plt.title('Test Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend(fontsize=8,loc='best')
plt.show()
# 绘制预测结果折线图
for i, pred in enumerate(predictions):
    plt.plot(pred, color='black',label=names[i], marker=markers[i], linestyle=linestyles[i])
# 绘制真实值折线图
plt.plot(y_test, color='black', label='True Value')
plt.title('Predictions and True Values')
plt.xlabel('x')
plt.ylabel('value')
plt.legend(fontsize=8, loc='best')
# 显示图像
plt.show()

<think>好的,用户想了解LSTM的其他变体结构。我需要先回顾LSTM的基本结构,然后列举一些重要的变体,并解释它们的改进和应用场景。首先,LSTM的核心是细胞状态和三个门(输入门、遗忘门、输出门),用于解决长期依赖问题。常见的变体包括GRU、Peephole LSTM、双向LSTM、Coupled LSTM等。 接下来,我需要确保每个变体的描述准确,并指出它们的特点。比如GRU将遗忘门和输入门合并,简化了结构;Peephole LSTM让门控单元不仅依赖输入和隐藏状态,还直接观察细胞状态。双向LSTM通过两个方向处理序列,适合需要上下文信息的任务。Coupled LSTM则是耦合了遗忘门和输入门,保持信息量不变。 还要注意用户提到的引用格式,不过当前问题可能不需要引用,但需要检查是否有相关内容可以引用。例如,引用[2]提到NULL的使用,可能与模型中的某些门控机制或初始化有关,但可能不直接相关,所以可能不需要引用。不过用户示例中的引用是关于SQL和指针初始化的,与LSTM变体无关,所以这里可能不需要添加引用标识。 需要确保回答结构清晰,分点说明每个变体,并生成相关问题。最后按照用户要求,使用中文,数学公式正确使用$...$和$$...$$格式。比如在描述GRU的更新门时,可以用公式表示:$z_t = \sigma(W_z \cdot [h_{t-1}, x_t])$。独立公式如细胞状态更新可能需要单独成段。 最后生成的相关问题需要围绕LSTM变体展开,例如比较不同变体的优缺点,应用场景,性能优化等。要确保问题有针对性,帮助用户进一步探索。</think>### LSTM变体结构 LSTM(长短期记忆网络)是为解决循环神经网络(RNN)的长期依赖问题而设计的。以下是其重要变体结构及改进原理: --- #### 1. **GRU(门控循环单元)** GRU将LSTM的输入门和遗忘门合并为**更新门**$z_t$,并引入**重置门**$r_t$,简化了计算流程: - 更新门:$z_t = \sigma(W_z \cdot [h_{t-1}, x_t])$ - 重置门:$r_t = \sigma(W_r \cdot [h_{t-1}, x_t])$ - 候选隐藏状态:$\tilde{h}_t = \tanh(W \cdot [r_t \odot h_{t-1}, x_t])$ - 最终隐藏状态:$h_t = (1-z_t) \odot h_{t-1} + z_t \odot \tilde{h}_t$ **特点**:参数更少,训练速度更快,适合计算资源有限的场景[^1]。 --- #### 2. **Peephole LSTM** 允许门控单元直接查看细胞状态$C_t$,增强对时序信息的敏感度: $$ \begin{aligned} 输入门: & \quad i_t = \sigma(W_i \cdot [C_{t-1}, h_{t-1}, x_t]) \\ 遗忘门: & \quad f_t = \sigma(W_f \cdot [C_{t-1}, h_{t-1}, x_t]) \\ 输出门: & \quad o_t = \sigma(W_o \cdot [C_t, h_{t-1}, x_t]) \end{aligned} $$ **应用场景**:语音识别、时间序列预测等需精细控制信息的任务。 --- #### 3. **双向LSTM(Bi-LSTM)** 通过前向和后向两个LSTM层同时处理序列,捕获上下文依赖: $$ h_t = [\overrightarrow{h_t}, \overleftarrow{h_t}] $$ **典型应用**:自然语言处理中的命名实体识别、机器翻译。 --- #### 4. **Coupled LSTM** 将遗忘门$f_t$与输入门$i_t$耦合,强制满足$f_t = 1 - i_t$,保证细胞状态信息总量稳定: $$ C_t = f_t \odot C_{t-1} + i_t \odot \tilde{C}_t $$ **优势**:减少参数冗余,避免梯度爆炸。 --- #### 5. **Depth-Gated LSTM** 引入**深度门控机制**,通过多层非线性变换增强特征提取能力: $$ g_t = \sigma(W_g \cdot [h_{t-1}, x_t] + b_g) $$ **适用场景**:复杂序列建模如视频分析、多模态数据融合。 --- #### 6. **Phased LSTM** 加入时间相位门控,周期性调节信息流动,解决异步时序问题: $$ \tau_t = \sigma(W_\tau \cdot t + b_\tau) $$ **用途**:神经信号处理、传感器数据分析。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值