用pytorch写一个天气预测的代码,用LSTM,读取天气中的csv文件中时间和气温两列数据,区分训练集和测试集,用gpu训练,输入为60天的天气,输出为某一天的天气,并画出60天的实际曲线和预测曲线图,横坐标为时间,纵坐标为温度,注意维度要一致
时间: 2023-10-07 14:07:39 浏览: 151
以下是一个简单的天气预测的代码,使用LSTM模型,读取csv文件中的时间和气温两列数据,将数据分成训练集和测试集,使用GPU进行训练,输入为60天的天气,输出为某一天的天气,并画出60天的实际曲线和预测曲线图,横坐标为时间,纵坐标为温度。
```python
import torch
import torch.nn as nn
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 读取csv文件
data = pd.read_csv('weather.csv')
# 取出时间和气温两列数据
time = data['time']
temp = data['temperature']
# 将时间和气温转换为numpy数组
time = np.array(time)
temp = np.array(temp)
# 将数据归一化到[-1, 1]之间
temp = (temp - np.min(temp)) / (np.max(temp) - np.min(temp)) * 2 - 1
# 将数据分成训练集和测试集
train_data = temp[:int(len(temp)*0.8)]
test_data = temp[int(len(temp)*0.8):]
# 定义LSTM模型
class LSTM(nn.Module):
def __init__(self, input_size, hidden_size, output_size, num_layers):
super(LSTM, self).__init__()
self.input_size = input_size
self.hidden_size = hidden_size
self.output_size = output_size
self.num_layers = num_layers
self.lstm = nn.LSTM(input_size, hidden_size, num_layers)
self.fc = nn.Linear(hidden_size, output_size)
def forward(self, inputs):
h0 = torch.zeros(self.num_layers, inputs.size(1), self.hidden_size).cuda()
c0 = torch.zeros(self.num_layers, inputs.size(1), self.hidden_size).cuda()
outputs, _ = self.lstm(inputs, (h0, c0))
predictions = self.fc(outputs[-1])
return predictions
# 定义超参数
input_size = 1
hidden_size = 64
output_size = 1
num_layers = 2
learning_rate = 0.01
num_epochs = 1000
# 定义模型、损失函数和优化器
model = LSTM(input_size, hidden_size, output_size, num_layers).cuda()
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
# 将训练数据转换为模型可以接受的格式
train_data = torch.Tensor(train_data).unsqueeze(1).cuda()
# 训练模型
for epoch in range(num_epochs):
inputs = train_data[:-1]
labels = train_data[1:]
outputs = model(inputs)
loss = criterion(outputs, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
if epoch % 100 == 0:
print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, loss.item()))
# 将测试数据转换为模型可以接受的格式
test_data = torch.Tensor(test_data).unsqueeze(1).cuda()
# 测试模型
with torch.no_grad():
inputs = test_data[:-1]
labels = test_data[1:]
outputs = model(inputs)
predicted_temp = []
for i in range(len(outputs)):
predicted_temp.append(outputs[i].item())
predicted_temp = np.array(predicted_temp)
# 将预测结果反归一化回去
predicted_temp = (predicted_temp + 1) / 2 * (np.max(temp) - np.min(temp)) + np.min(temp)
# 绘制实际曲线和预测曲线图
plt.plot(time[int(len(temp)*0.8)+1:], test_data.cpu().numpy().flatten(), label='Actual')
plt.plot(time[int(len(temp)*0.8)+1:], predicted_temp, label='Predicted')
plt.xlabel('Time')
plt.ylabel('Temperature')
plt.legend()
plt.show()
```
需要注意的是,以上代码中的数据集是一个示例数据集,如果使用自己的数据集需要修改数据读取和处理的部分。此外,如果没有GPU可以去掉`.cuda()`即可。
阅读全文