### 使用 LSTM 进行时间序列预测并绘制预测图表
以下是基于 PyTorch 实现 LSTM 时间序列预测的完整流程,包括训练模型以及绘制预测结果的代码示例。
#### 数据准备与预处理
为了使 LSTM 能够有效工作,通常需要对原始数据进行标准化或归一化处理。这一步骤有助于提高模型收敛速度和性能。
```python
import numpy as np
from sklearn.preprocessing import MinMaxScaler
def create_dataset(data, time_step=10):
dataX, dataY = [], []
for i in range(len(data)-time_step-1):
a = data[i:(i+time_step), 0]
dataX.append(a)
dataY.append(data[i + time_step, 0])
return np.array(dataX), np.array(dataY)
# 假设我们有一个简单的时间序列数据集
data = np.sin(np.linspace(0, 50, 100)).reshape(-1, 1) # 示例正弦波数据
scaler = MinMaxScaler(feature_range=(0, 1))
data_scaled = scaler.fit_transform(data)
# 创建输入输出数据集
time_step = 10
train_size = int(len(data_scaled) * 0.8)
test_size = len(data_scaled) - train_size
train_data = data_scaled[:train_size]
test_data = data_scaled[train_size:]
X_train, y_train = create_dataset(train_data, time_step=time_step)
X_test, y_test = create_dataset(test_data, time_step=time_step)
# 将数据转换为适合 LSTM 输入的形式 (samples, time_steps, features)
X_train = X_train.reshape(X_train.shape[0], X_train.shape[1], 1)
X_test = X_test.reshape(X_test.shape[0], X_test.shape[1], 1)
```
---
#### 构建 LSTM 模型
下面展示了一个简单的 LSTM 模型结构,适用于时间序列预测任务。
```python
import torch
import torch.nn as nn
class LSTMModel(nn.Module):
def __init__(self, input_dim, hidden_dim, num_layers, output_dim):
super(LSTMModel, self).__init__()
self.hidden_dim = hidden_dim
self.num_layers = num_layers
self.lstm = nn.LSTM(input_dim, hidden_dim, num_layers, batch_first=True)
self.fc = nn.Linear(hidden_dim, output_dim)
def forward(self, x):
h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_dim).requires_grad_()
c0 = torch.zeros(self.num_layers, x.size(0), self.hidden_dim).requires_grad_()
out, (hn, cn) = self.lstm(x, (h0.detach(), c0.detach()))
out = self.fc(out[:, -1, :])
return out
input_dim = 1
hidden_dim = 50
num_layers = 2
output_dim = 1
model = LSTMModel(input_dim=input_dim, hidden_dim=hidden_dim, num_layers=num_layers, output_dim=output_dim)
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)
```
---
#### 训练模型
在这一部分中,我们将定义训练循环并对模型参数进行优化。
```python
epochs = 100
for epoch in range(epochs):
model.train()
outputs = model(torch.tensor(X_train, dtype=torch.float32))
optimizer.zero_grad()
loss = criterion(outputs, torch.tensor(y_train, dtype=torch.float32))
loss.backward()
optimizer.step()
if epoch % 10 == 0:
print(f'Epoch {epoch}, Loss: {loss.item()}')
```
---
#### 预测与绘图
完成模型训练后,我们可以利用测试数据对其进行评估,并可视化实际值与预测值之间的差异。
```python
import matplotlib.pyplot as plt
model.eval()
with torch.no_grad():
test_outputs = model(torch.tensor(X_test, dtype=torch.float32))
y_pred = scaler.inverse_transform(test_outputs.numpy())
y_actual = scaler.inverse_transform([y_test])
plt.figure(figsize=(10, 6))
plt.plot(range(time_step, len(y_actual[0])), y_actual[0][time_step:], label='Actual', color='blue')
plt.plot(range(time_step, len(y_pred)), y_pred.flatten(), label='Predicted', color='red')
plt.title('Time Series Prediction with LSTM')
plt.xlabel('Time Step')
plt.ylabel('Value')
plt.legend()
plt.show()
```
上述代码展示了如何构建、训练 LSTM 模型,并将其应用于时间序列预测任务中的具体方法[^1]。此外,还提供了绘制预测曲线的功能以便直观比较真实值与预测值之间的一致性[^2]。
---