以下是“PyTorch+LSTM实现单变量时间序列预测”的完整攻略,包含两个示例说明。
示例1:准备数据
步骤1:导入库
我们首先需要导入必要的库,包括PyTorch、numpy和matplotlib。
import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt
步骤2:生成数据
我们可以使用numpy库生成一些随机数据来模拟时间序列数据。在这个示例中,我们生成了一个包含100个数据点的时间序列。
np.random.seed(0)
data = np.sin(np.arange(0, 10, 0.1))
步骤3:划分数据集
我们将数据集划分为训练集和测试集。在这个示例中,我们将前80个数据点用于训练,后20个数据点用于测试。
train_data = data[:80]
test_data = data[80:]
步骤4:生成训练数据
我们需要将训练数据转换为模型可以处理的格式。在这个示例中,我们将使用前10个数据点来预测第11个数据点。我们将使用一个滑动窗口来生成训练数据。
def create_sequences(data, seq_length):
xs = []
ys = []
for i in range(len(data)-seq_length-1):
x = data[i:(i+seq_length)]
y = data[i+seq_length]
xs.append(x)
ys.append(y)
return np.array(xs), np.array(ys)
seq_length = 10
X_train, y_train = create_sequences(train_data, seq_length)
X_test, y_test = create_sequences(test_data, seq_length)
在这个示例中,我们定义了一个函数create_sequences
,该函数将数据转换为模型可以处理的格式。我们使用一个滑动窗口来生成训练数据,其中每个训练样本包含前10个数据点和第11个数据点作为标签。
示例2:构建模型
步骤1:定义模型
我们将使用一个LSTM模型来预测时间序列数据。在这个示例中,我们定义了一个包含一个LSTM层和一个全连接层的模型。
class LSTM(nn.Module):
def __init__(self, input_size=1, hidden_size=50, output_size=1):
super().__init__()
self.hidden_size = hidden_size
self.lstm = nn.LSTM(input_size, hidden_size)
self.fc = nn.Linear(hidden_size, output_size)
def forward(self, x):
h0 = torch.zeros(1, x.size(1), self.hidden_size)
c0 = torch.zeros(1, x.size(1), self.hidden_size)
out, _ = self.lstm(x, (h0, c0))
out = self.fc(out[-1, :, :])
return out
在这个示例中,我们定义了一个名为LSTM
的类,该类继承自nn.Module
。我们在__init__
函数中定义了一个LSTM层和一个全连接层。在forward
函数中,我们将输入数据传递给LSTM层,并将最后一个时间步的输出传递给全连接层。
步骤2:训练模型
我们将使用均方误差损失函数和随机梯度下降优化器来训练模型。在这个示例中,我们将模型训练10个周期。
model = LSTM()
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
epochs = 10
for epoch in range(epochs):
optimizer.zero_grad()
inputs = torch.from_numpy(X_train).float().unsqueeze(2)
targets = torch.from_numpy(y_train).float()
outputs = model(inputs)
loss = criterion(outputs, targets)
loss.backward()
optimizer.step()
print('Epoch {}/{} - Loss: {:.4f}'.format(epoch+1, epochs, loss.item()))
在这个示例中,我们首先定义了一个LSTM模型、均方误差损失函数和随机梯度下降优化器。然后,我们将训练数据转换为PyTorch张量,并将其传递给模型。我们计算模型的输出和损失,并使用反向传播算法更新模型的参数。最后,我们打印出每个周期的损失。
步骤3:测试模型
我们可以使用训练好的模型来预测测试数据。在这个示例中,我们将使用前10个数据点来预测第11个数据点。
inputs = torch.from_numpy(X_test).float().unsqueeze(2)
targets = torch.from_numpy(y_test).float()
outputs = model(inputs)
plt.plot(y_test, label='True')
plt.plot(outputs.detach().numpy(), label='Predicted')
plt.legend()
plt.show()
在这个示例中,我们将测试数据转换为PyTorch张量,并将其传递给模型。我们计算模型的输出,并将真实值和预测值绘制在图表中。
总结
本文介绍了如何使用PyTorch和LSTM模型来预测单变量时间序列数据,并提供了两个示例说明。在实现过程中,我们使用了PyTorch和其他一些库来生成数据、构建模型、训练模型和测试模型。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PyTorch+LSTM实现单变量时间序列预测 - Python技术站