LSTM(Long Short-Term Memory)是一种特殊的循环神经网络(RNN, Recurrent Neural Network)架构,它在1997年由Hochreiter和Schmidhuber提出。LSTM设计用来解决标准RNN在处理长序列数据时遇到的长期依赖问题,即随着时间的推移,RNN会逐渐丧失对早期信息的记忆能力。
LSTM的关键特点包括:
-
三个门(Three Gates):
- 遗忘门(Forget Gate): 决定哪些信息将从细胞状态中被遗忘。
- 输入门(Input Gate): 决定哪些新的信息将被存储在细胞状态中。
- 输出门(Output Gate): 决定下一个隐藏状态将如何利用当前的细胞状态。
-
细胞状态(Cell State):
- 细胞状态是LSTM网络中的一个非常重要的概念,它负责携带有关观察到的输入序列的信息。它可以通过遗忘门和输入门进行更新。
-
隐藏状态(Hidden State):
- 隐藏状态是LSTM网络的输出,它包含了当前时间步的信息,并传递给下一个时间步的LSTM单元。
-
参数共享(Parameter Sharing):
- 在LSTM中,所有的时间步共享相同的权重参数。
LSTM的工作原理:
-
遗忘门: 基于当前输入和上一个时间步的隐藏状态,遗忘门将决定哪些信息将从细胞状态中被移除。遗忘门是一个sigmoid层,输出一个介于0和1之间的值,表示保留的程度。
-
输入门: 输入门由两个部分组成:一个sigmoid层决定哪些值将被更新,一个tanh层创建一个新的候选值向量,这些值将被加入到状态中。
-
更新细胞状态: 细胞状态通过遗忘门丢弃旧的记忆,并加入新的记忆(由输入门决定)来更新。
-
输出门: 输出门决定隐藏状态的输出,它基于当前的输入和上一个隐藏状态。它使用sigmoid层来决定哪些值将输出,然后tanh层将细胞状态转换为输出隐藏状态。
LSTM在序列预测、文本生成、语音识别、时间序列分析等领域表现出色,并且由于其优秀的长序列处理能力,它在深度学习领域得到了广泛的应用。
import pandas as pd
from sklearn.model_selection import train_test_split
from keras.models import Sequential
from keras.layers import LSTM, Dense
import matplotlib.pyplot as plt
import numpy as np
from sklearn.metrics import mean_absolute_error, r2_score
# 读入数据集
data = pd.read_csv('data.csv')
# 确保 'VS' 列存在
if 'VS' in data.columns:
# 选取除去 'VS' 列的数据作为特征
features = data.iloc[:, :-1]
labels = data.iloc[:, -1]
else:
features = data
labels = data.pop('target_column_name') # 假设目标列名为 'target_column_name'
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.2, random_state=42)
# 构建 LSTM 模型
model = Sequential()
model.add(LSTM(64, activation='relu', input_shape=(X_train.shape[1], 1)))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')
# 训练模型
model.fit(X_train, y_train, batch_size=32, epochs=200)
# 预测测试集
test_predict = model.predict(X_test)
# 去掉多余的维度
test_predict = np.squeeze(test_predict)
y_test = np.squeeze(y_test)
# 计算绝对误差
abs_error = np.abs(test_predict - y_test)
y_test=np.array(y_test)
print('Mean Absolute Error:', np.mean(abs_error))
test_loss = model.evaluate(X_test, y_test, return_dict=True)
# Calculate the MAE and R^2
test_mae = mean_absolute_error(y_test, test_predict)
test_r2 = r2_score(y_test, test_predict)
# Print the results
print(f'Test loss: {test_loss["loss"]:.4f}')
print(f'Test MAE: {test_mae:.4f}')
print(f'Test R^2: {test_r2:.4f}')
y_test=np.array(y_test)
plt.plot(y_test,color="r",label="acc") #颜色表示
plt.plot(y_pred,color=(0,0,0),label="pre")
plt.xlabel("number") #x轴命名表示
plt.ylabel("VS") #y轴命名表示
plt.legend()
plt.show()