0


LSTM模型

一、算法介绍

  1. LSTM(长短期记忆)是一种用于处理和预测时间序列数据的递归神经网络(RNN)架构
  2. 旨在解决传统RNN在处理长序列数据时存在的梯度消失和梯度爆炸问题。
  3. LSTM的关键在于其特殊的单元结构,每个单元包含三个门:输入门、遗忘门和输出门。这些门通过控制信息的流动,允许LSTM在更长时间范围内保持和更新记忆。
  4. 以下是对这些组件的简要介绍:
  1. 输入门(Input Gate):控制有多少新的信息被存储在单元状态中。
  2. 遗忘门(Forget Gate):控制当前单元状态中有多少信息被保留。
  3. 输出门(Output Gate):决定有多少信息从单元状态中输出。

LSTM在以下几个方面有广泛应用:

  1. 时间序列预测:如股票价格、气温变化等。
  2. 自然语言处理:如语言翻译、文本生成等。
  3. 语音识别:将语音信号转换为文本。
  4. 视频分析:分析视频帧的时间序列信息。

二、代码展示

  1. import numpy as np
  2. from keras.models import Sequential
  3. from keras.layers import LSTM,Dense
  4. #Sequential模型是层的线性堆叠
  5. #LSTM用于处理时间序列数据,Dense用于添加全连接层
  6. data=np.random.random((1000,10,1))#1000个样本,每个样本10个时间步,每个时间步1个特征
  7. labels=np.random.random((1000,1))#目标值
  8. #创建LSTM模型
  9. model=Sequential()
  10. model.add(LSTM(50, input_shape=(10,1)))
  11. model.add(Dense(1))
  12. #编译模型
  13. model.compile(optimizer='adam',loss='mean_squared_error')
  14. #optimizer='adam':使用Adam优化器,它是一种常用的优化算法,结合了动量和自适应学习率。
  15. #loss='mean_squared_error':损失函数使用均方误差,适用于回归问题。
  16. #训练模型
  17. model.fit(data,labels,epochs=10,batch_size=32)
  18. #epochs=10:训练迭代次数,即数据将被遍历10次
  19. #batch_size=32:每次更新权重使用的样本数,即每批处理32个样本。
  20. #进行预测
  21. predictions=model.predict(data)

三、参数说明

(1)

  1. optimizer

参数

在Keras中,

  1. optimizer

参数可以接受多种不同的优化器,用于调整模型的权重以最小化损失函数。每种优化器都有其独特的更新策略和参数。以下是一些常用的优化器及其说明:

  1. **sgd (Stochastic Gradient Descent)**:> > optimizer = 'sgd' > 随机梯度下降法,可选参数包括学习率(learning rate)、动量(momentum)等。> > from keras.optimizers import SGD > > > > > > optimizer = SGD(learning_rate=0.01, momentum=0.9) >
  2. **adam (Adaptive Moment Estimation)**:> > optimizer = 'adam'> 一种自适应学习率的优化算法,常用参数包括学习率(learning rate)、beta_1、beta_2等。> > from keras.optimizers import Adam > > > > > > optimizer = Adam(learning_rate=0.001, beta_1=0.9, beta_2=0.999) >
  3. **rmsprop (Root Mean Square Propagation)**:> > optimizer = 'rmsprop'> 适用于递归神经网络,参数包括学习率(learning rate)、rho等。from keras.optimizers import RMSpropoptimizer = RMSprop(learning_rate=0.001, rho=0.9)
  4. **adagrad (Adaptive Gradient Algorithm)**:optimizer = 'adagrad'适用于稀疏数据,参数包括学习率(learning rate)。> > from keras.optimizers import Adagrad > > > > > > optimizer = Adagrad(learning_rate=0.01) >
  5. **adadelta**:> > optimizer = 'adadelta'> 不需要明确指定学习率,参数包括rho等。> > from keras.optimizers import Adadelta > > > > > > optimizer = Adadelta(rho=0.95) >
  6. **nadam (Nesterov-accelerated Adaptive Moment Estimation)**:> > optimizer = 'nadam'> Adam优化器的变体,结合了Nesterov动量,参数包括学习率(learning rate)、beta_1、beta_2等。> > from keras.optimizers import Nadam > optimizer = Nadam(learning_rate=0.001, beta_1=0.9, beta_2=0.999)>
  7. **adamax**:> > optimizer = 'adamax'> Adam优化器的变体,基于无穷范数的最大值约束,参数包括学习率(learning rate)、beta_1、beta_2等。> > from keras.optimizers import Adamax > > > > > > optimizer = Adamax(learning_rate=0.002, beta_1=0.9, beta_2=0.999)>

(2)loss参数

在Keras中,

  1. loss

参数用于指定损失函数,它是模型在训练过程中优化的目标函数。不同的任务需要不同的损失函数。以下是一些常用的损失函数及其适用场景:

回归问题
  1. 均方误差 (Mean Squared Error, MSE)> > loss = 'mean_squared_error' > 计算预测值与真实值之间差的平方和的平均值。> > loss = 'mse' # 'mean_squared_error' 的简写>
  2. 均绝对误差 (Mean Absolute Error, MAE)> > loss = 'mean_absolute_error' > 计算预测值与真实值之间差的绝对值的平均值。> > loss = 'mae' # 'mean_absolute_error' 的简写 >
  3. 均绝对百分比误差 (Mean Absolute Percentage Error, MAPE)> > loss = 'mean_absolute_percentage_error' > 计算预测值与真实值之间差的绝对百分比的平均值。> > loss = 'mape' # 'mean_absolute_percentage_error' 的简写 >
  4. 均方对数误差 (Mean Squared Logarithmic Error, MSLE)> > loss = 'mean_squared_logarithmic_error' > 计算预测值与真实值之间差的对数的平方和的平均值。> > loss = 'msle' # 'mean_squared_logarithmic_error' 的简写 >

分类问题

  1. 二元交叉熵 (Binary Crossentropy)> > loss = 'binary_crossentropy'> 适用于二分类问题,计算二元交叉熵。> > loss = 'binary_crossentropy'>
  2. 稀疏分类交叉熵 (Sparse Categorical Crossentropy)> > loss = 'sparse_categorical_crossentropy'> 适用于多分类问题,标签为整数的情况。> > loss = 'sparse_categorical_crossentropy'>
  3. 分类交叉熵 (Categorical Crossentropy)> > loss = 'categorical_crossentropy'> 适用于多分类问题,标签为one-hot编码的情况。> > loss = 'categorical_crossentropy'>

代码:

  1. import numpy as np
  2. import pandas as pd
  3. import matplotlib.pyplot as plt
  4. from sklearn.preprocessing import MinMaxScaler
  5. from keras.models import Sequential
  6. from keras.layers import LSTM, Dense, Dropout
  7. # 设置随机种子以确保结果的可复现性
  8. np.random.seed(42)
  9. # 加载数据
  10. df = pd.read_csv('stock_data.csv')
  11. # 选择需要的列
  12. data = df[['Open', 'High', 'Low', 'Close', 'Volume']]
  13. # 数据归一化
  14. scaler = MinMaxScaler(feature_range=(0, 1))
  15. scaled_data = scaler.fit_transform(data)
  16. # 创建训练集
  17. look_back = 60 # 使用前60天的数据来预测下一天的收盘价
  18. X_train, y_train = [], []
  19. for i in range(look_back, len(scaled_data)):
  20. X_train.append(scaled_data[i-look_back:i])
  21. y_train.append(scaled_data[i, 3])
  22. X_train, y_train = np.array(X_train), np.array(y_train)
  23. # 数据形状调整为LSTM模型所需的3D格式 (samples, timesteps, features)
  24. X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], X_train.shape[2]))
  25. # 构建LSTM模型
  26. model = Sequential()
  27. model.add(LSTM(units=50, return_sequences=True, input_shape=(X_train.shape[1], X_train.shape[2])))
  28. model.add(Dropout(0.2))
  29. model.add(LSTM(units=50, return_sequences=False))
  30. model.add(Dropout(0.2))
  31. model.add(Dense(units=25))
  32. model.add(Dense(units=1))
  33. # 编译模型
  34. model.compile(optimizer='adam', loss='mean_squared_error')
  35. # 训练模型
  36. model.fit(X_train, y_train, batch_size=32, epochs=20)
  37. # 创建测试集
  38. # 假设我们有一个 `test_data` 包含未来的数据
  39. test_data = df[-look_back:]
  40. # 同样地进行归一化处理
  41. scaled_test_data = scaler.transform(test_data[['Open', 'High', 'Low', 'Close', 'Volume']])
  42. # 构建测试集
  43. X_test = []
  44. for i in range(look_back, len(scaled_test_data)):
  45. X_test.append(scaled_test_data[i-look_back:i])
  46. X_test = np.array(X_test)
  47. X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], X_test.shape[2]))
  48. # 进行预测
  49. predictions = model.predict(X_test)
  50. # 反归一化
  51. predictions = scaler.inverse_transform(np.hstack((np.zeros((predictions.shape[0], 3)), predictions, np.zeros((predictions.shape[0], 1)))))[:, 3]
  52. # 可视化预测结果与真实值的对比
  53. train = df[:len(df)-look_back]
  54. valid = df[-look_back:]
  55. valid['Predictions'] = predictions
  56. plt.figure(figsize=(16,8))
  57. plt.title('LSTM Model - Stock Price Prediction')
  58. plt.xlabel('Date', fontsize=18)
  59. plt.ylabel('Close Price USD ($)', fontsize=18)
  60. plt.plot(train['Close'])
  61. plt.plot(valid[['Close', 'Predictions']])
  62. plt.legend(['Train', 'Val', 'Predictions'], loc='lower right')
  63. plt.show()

本文转载自: https://blog.csdn.net/m0_74807013/article/details/140992317
版权归原作者 Ice-cream-AI 所有, 如有侵权,请联系我们删除。

“LSTM模型”的评论:

还没有评论