首页 > 其他分享 >torch神经网络温度预测

torch神经网络温度预测

时间:2024-10-06 09:04:12浏览次数:1  
标签:dates plt features grad torch 神经网络 data 温度

数据件文件temp.csv


"""
气温预测
"""
import datetime
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import torch
import torch.optim as optim
import warnings
warnings.filterwarnings('ignore')

features = pd.read_csv('temps.csv')
features.head()
# --------数据说明--------
# temp_2:前天的最高温度值
# temp_1:昨天的最高温度值
# average:在历史中,每年这一天的平均最高温度值
# actual:这就是我们的标签,当天的真实最高温度
# friend:朋友猜测的可能值
print(features.shape)
years = features['year']
months = features['month']
days = features['day']

# datetime格式
dates = [str(int(year)) + '-' + str(int(month)) + '-' + str(int(day)) for year, month, day in zip(years, months, days)]
dates = [datetime.datetime.strptime(date, '%Y-%m-%d') for date in dates]
print(dates[:5])

# -----------画图看数据-----------
plt.style.use('fivethirtyeight')
# 设置布局
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2, figsize=(10, 10))
fig.autofmt_xdate(rotation=45)

# 标签值
ax1.plot(dates, features['actual'])
ax1.set_xlabel('');ax1.set_ylabel('Temp');ax1.set_title('Max Temp')
# 昨天
ax2.plot(dates, features['temp_1'])
ax2.set_xlabel('');ax2.set_ylabel('Temp');ax2.set_title('Previous Max Temp')
# 前天
ax3.plot(dates, features['temp_2'])
ax3.set_xlabel('Date');ax3.set_ylabel('Temp');ax3.set_title('Two Days Prior Max Temp')
# 我的朋友
ax4.plot(dates, features['friend'])
ax4.set_xlabel('Date');ax4.set_ylabel('Temp');ax4.set_title('Friend Estimate')
plt.tight_layout(pad=2)
plt.show()

# week列为字符串不是数值,利用独热编码,将数据中非字符串转换为数值,并拼接到数据中
features = pd.get_dummies(features)
# 看独热编码的效果
print(features.head(5))

# 标签
labels = np.array(features['actual'])

# 去掉标签用作特征
features = features.drop('actual', axis=1)

# 保存列名用于展示
features_list = list(features.columns)

# 转换为合适的格式
features = np.array(features)
print(features.shape)

# 数据标准化
from sklearn import preprocessing

input_features = preprocessing.StandardScaler().fit_transform(features)

# 看一下数字标准化的效果
print(input_features[0])

# =======================构建神经网络模型=============================== #
# 将输入和预测转为tensor
x = torch.tensor(input_features, dtype=float)
y = torch.tensor(labels, dtype=float)

# 权重参数初始化
weights = torch.randn((14, 128), dtype= float, requires_grad= True)
biases = torch.randn(128, dtype=float, requires_grad= True)
weights2 = torch.randn((128, 1), dtype=float, requires_grad= True)
biases2 = torch.randn(1, dtype=float, requires_grad=True)

learning_rate = 0.001
losses = []

for i in range(1000):
    # 前向传播
    # 计算隐藏层
    hidden = x.mm(weights) + biases
    # 加入激活函数
    hidden = torch.relu(hidden)
    # 预测结果
    predictions = hidden.mm(weights2) + biases2
    # 计算损失
    loss = torch.mean((predictions - y)**2)
    losses.append(loss.data.numpy())

    # 打印损失
    if i % 100 == 0:
        print('loss:', loss)
    # 反向传播
    loss.backward()
    # 更新参数
    weights.data.add_(- learning_rate * weights.grad.data)
    biases.data.add_(- learning_rate * biases.grad.data)
    weights2.data.add_(- learning_rate * weights2.grad.data)
    biases2.data.add_(- learning_rate * biases2.grad.data)

    # 梯度清零
    weights.grad.data.zero_()
    biases.grad.data.zero_()
    weights2.grad.data.zero_()
    biases2.grad.data.zero_()


# -----或者我们使用简化的方法----
input_size = input_features.shape[1]
hidden_size = 128
output_size = 1
batch_size = 16
my_nn = torch.nn.Sequential(
    torch.nn.Linear(input_size, hidden_size),
    torch.nn.Sigmoid(),
    torch.nn.Linear(hidden_size, output_size),
)

# 指定损失函数
cost = torch.nn.MSELoss(reduction='mean')

# 指定优化器
optimizer = torch.optim.Adam(my_nn.parameters(), lr=0.001)

# 训练网络
losses = []
for i in range(1000):
    batch_loss = []
    for start in range(0, len(input_features), batch_size):
        end = start + batch_size if start + batch_size < len(input_features) else len(input_features)
        xx = torch.tensor(input_features[start:end], dtype=torch.float, requires_grad=True)
        yy = torch.tensor(labels[start:end], dtype=torch.float, requires_grad=True)
        prediction = my_nn(xx)
        loss = cost(prediction, yy)
        optimizer.zero_grad()
        loss.backward(retain_graph=True)
        optimizer.step()
        batch_loss.append(loss.data.numpy())

    if i % 100 == 0:
        losses.append(np.mean(batch_loss))
        print(i, np.mean(batch_loss))


# 预测,并以图片的形式展示
# 预测结果
x = torch.tensor(input_features, dtype=torch.float)
predict = my_nn(x).data.numpy() # 转化为numpy格式,tensor格式画不了图

# 转换日期格式
dates = [str(int(year)) + '-' + str(int(month)) + '-' + str(int(day)) for year, month, day in zip(years, months, days)]
dates = [datetime.datetime.strptime(date, '%Y-%m-%d') for date in dates]

# 创建一个表格来保存日期和其对应的标签数值
true_data = pd.DataFrame(data={'date': dates, 'actual': labels})

# 再创建一个来存日期和其对应的模型预测值
months = features[:, features_list.index('month')]
days = features[:, features_list.index('day')]
years = features[:, features_list.index('year')]

test_dates = [str(int(year)) + '-' + str(int(month)) + '-' + str(int(day)) for year, month, day in zip(years, months, days)]
test_dates = dates

predictions_data = pd.DataFrame(data={'date': test_dates, 'prediction': predict.reshape(-1)})

# 真实值
plt.plot(true_data['date'], true_data['actual'], 'b-', label='actual')

# 预测值
plt.plot(predictions_data['date'], predictions_data['prediction'], 'ro', label='prediction')
plt.xticks(rotation='vertical');
plt.legend()

# 图名
plt.xlabel('Date')
plt.ylabel('Maximum Temperature (F)')
plt.title('Actual and Predicted Values')
plt.show()

标签:dates,plt,features,grad,torch,神经网络,data,温度
From: https://www.cnblogs.com/jackchen28/p/18448801

相关文章

  • torch--minst手写体识别
    utils.pyimporttorchimportmatplotlib.pyplotaspltdefplot_curve(data):fig=plt.figure()plt.plot(range(len(data)),data,color='blue')plt.legend(['value'],loc='upperright')plt.xlabel('step�......
  • pytorch环境安装
    pytorch环境安装1.基础安装首先安装anaconda打开,进入base,输入命令,这里-n后跟的是环境名字,再往后是python版本,不要太高condacreate-npytorchpython=3.8安装的时候有按y的就按y创建成功后使用下面命令进入创建的环境condaactivatepytorch2.安装需要的库piplist......
  • 在Windows平台使用源码编译和安装PyTorch3D指定版本
    最近在部署SyncTalk虚拟数字人项目时,需要安装很多依赖项,在执行到pipinstall--no-index--no-cache-dirpytorch3d-fhttps://dl.fbaipublicfiles.com/pytorch3d/packaging/wheels/py38_cu113_pyt1121/download.html这一句命令时,安装PyTorch3D失败,输出如下信息:(synctalk)C......
  • torch神经网络--线性回归
    简单线性回归y=2*x+1importnumpyasnpimporttorchimporttorch.nnasnnclassLinearRegressionModel(nn.Module):def__init__(self,input_dim,output_dim):super(LinearRegressionModel,self).__init__()self.linear=nn.Linear(input......
  • GoogLeNet训练CIFAR10[Pytorch+训练信息+.pth文件]
    0引言GoogLeNet,它是一种深度卷积神经网络,由Google研究人员在2014年提出,用于图像识别任务。CIFAR-10是一个常用的图像识别数据集,包含10个类别,每个类别有6000张32x32的彩色图像。本文使用Pycharm及Pytorch框架搭建GoogLeNet神经网络框架,使用CIFAR10数据集训练模型。笔者查阅资......
  • 7、卷积神经网络基础
    1、边缘检测示例(EdgeDetectionExample)  卷积运算(convolutionaloperation)是卷积神经网络最基本的组成部分,使用边缘检测(edgedetection)作为入门样例。接下来,你会看到卷积是如何进行运算的。    在之前的人脸例子中,我们知道神经网络的前几层是如何检测边缘的,然后,后面的层......
  • 【深度学习基础模型】卷积神经网络(Convolutional Neural Networks, CNN)详细理解并附实
    【深度学习基础模型】卷积神经网络(ConvolutionalNeuralNetworks,CNN)详细理解并附实现代码。【深度学习基础模型】卷积神经网络(ConvolutionalNeuralNetworks,CNN)详细理解并附实现代码。文章目录【深度学习基础模型】卷积神经网络(ConvolutionalNeuralNetworks,......
  • 风速预测(五)基于Pytorch的EMD-CNN-LSTM模型
    往期精彩内容:时序预测:LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较全是干货|数据集、学习资料、建模资源分享!拒绝信息泄露!VMD滚动分解+Informer-BiLSTM并行预测模型-CSDN博客风速预测(一)数据集介绍和预处理_风速数据在哪里下载-CSDN博客风速预测(二)基于Pytorch......
  • Pytorch-CNN轴承故障一维信号分类(二)
    往期精彩内容:Python-凯斯西储大学(CWRU)轴承数据解读与分类处理Pytorch-LSTM轴承故障一维信号分类(一)-CSDN博客三十多个开源数据集|故障诊断再也不用担心数据集了!Python轴承故障诊断(一)短时傅里叶变换STFT-CSDN博客Python轴承故障诊断(二)连续小波变换CWT-CSDN博客......
  • 【使用MLP在MANET中进行路由验证】使用多层感知神经网络进行移动自组网中的路由验证(Ma
      ......