import numpy as np
import torch
import pandas as pd
from torch import nn
from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import StandardScaler
import warnings
import torch.optim as optimizer
import time
from torch.utils.data import DataLoader, TensorDataset
from sklearn.metrics import r2_score
from sklearn import metrics
import matplotlib.pyplot as plt
import os
warnings.filterwarnings("ignore")
'读取数据'
filename = '../00Data/月平均气温(land+ocean)1850-2022.10.xlsx'
dataset = pd.read_excel(filename)
dataset = dataset.values # 选择原始数据库中需要的数据,并将DataFrame格式转换为ndarray数据类型
'将数据集划分为训练集和测试集'
def split_dataset(dataset,rate_split):
len = dataset.shape[0]
train_dataset = dataset[0:int(len * rate_split) , 3]
test_dataset = dataset[int(len * rate_split):-1 ,3]
return train_dataset,test_dataset
rate_split = 0.7 #原始数据集切分比例
train_dataset,test_dataset = split_dataset(dataset = dataset,rate_split = rate_split)
train_dataset = train_dataset.reshape(-1,1)
test_dataset = test_dataset.reshape(-1,1)
'对dataset中的数据进行归一化处理,并记录特征和标签的均值和方差'
choice_Normalization = '最大最小值归一化'
feature_X= np.append(train_dataset,test_dataset,axis=0) #对全部数据(包括训练集和测试集)的特征(X)进行读取
label_Y = feature_X #对全部数据(包括训练集和测试集)的标签(Y)进行读取
feature_X = feature_X.reshape(-1,1)
label_Y = label_Y.reshape(-1,1) #进行维度改变
if choice_Normalization == '最大最小值归一化':
Standardscaler_X = StandardScaler()
Standardscaler_Y = StandardScaler()
feature_X = Standardscaler_X.fit_transform(feature_X)
label_Y = Standardscaler_Y.fit_transform(label_Y)
X_mean = Standardscaler_X.mean_
X_var = Standardscaler_X.var_
X_scale = Standardscaler_X.scale_
Y_mean = Standardscaler_Y.mean_
Y_var = Standardscaler_Y.var_
Y_scale = Standardscaler_Y.scale_
elif choice_Normalization == '均值方差归一化' :
Standardscaler_X = StandardScaler()
Standardscaler_Y = StandardScaler()
feature_X = Standardscaler_X.fit_transform(feature_X)
label_Y = Standardscaler_Y.fit_transform(label_Y)
X_mean = Standardscaler_X.mean_
X_var = Standardscaler_X.var_
X_scale = Standardscaler_X.scale_
Y_mean = Standardscaler_Y.mean_
Y_var = Standardscaler_Y.var_
Y_scale = Standardscaler_Y.scale_
'构建时间序列需要的数据集'
def createDataset(dataset, look_back, ahead_step, feature_num):
'''
:param dataset: 表示需要进行操作的数据库
:param look_back: 选择多少个历史数据进行分析
:param ahead_step: 预测步长为多少
:param feature_num: 选择多少个特征进行预测
:return:
'''
dataX = []
dataY = []
for i in range(len(dataset) - look_back - ahead_step + 1):
dataX.append(dataset[i : i + look_back])
dataY.append(dataset[i + (look_back - 1) + ahead_step])
dataX = torch.tensor(dataX)
dataX = dataX.reshape(-1 , feature_num)
dataY = torch.tensor(dataY)
dataY = dataY[: , 0]
dataY = dataY.reshape(-1 , 1)
return dataX, dataY
feature_num = 1 # 特征个数
ahead_step = 1 # 预测步数
look_back = 1 # 使用的历史数据的个数
#对训练集进行归一化
Standardscaler_trainX = StandardScaler()
Standardscaler_trainX.mean_ = X_mean
Standardscaler_trainX.var_ = X_var
Standardscaler_trainX.scale_ = X_scale
#对测试集进行归一化
Standardscaler_testX = StandardScaler()
Standardscaler_testX.mean_ = X_mean
Standardscaler_testX.var_ = X_var
Standardscaler_testX.scale_ = X_scale
train_dataset = Standardscaler_trainX.transform(train_dataset) #训练集归一化
test_dataset = Standardscaler_testX.transform(test_dataset) #测试集归一化
train_dataX, train_dataY = createDataset(dataset = train_dataset,look_back = look_back,ahead_step = ahead_step,feature_num = feature_num)
test_dataX , test_dataY = createDataset(dataset = test_dataset ,look_back = look_back,ahead_step = ahead_step,feature_num = feature_num)
'将dataX,dataY转换为LSTM模型的输入格式类型'
train_dataX = train_dataX.reshape(-1,look_back,feature_num)
train_dataY = train_dataY.reshape(-1,1,1)
test_dataX = test_dataX.reshape (-1,look_back,feature_num)
test_dataY = test_dataY.reshape (-1,1,1)
'搭建模型LSTM、GRU、RNN'
class LSTMModel(nn.Module):
def __init__(self, input_Size, hidden_Size, num_layers , dropout , batch_first):
super(LSTMModel, self).__init__()
# LSTM层-> 两个LSTM单元叠加
self.lstm = nn.LSTM(input_size = input_Size,hidden_size = hidden_Size, num_layers = num_layers,dropout = dropout,batch_first = batch_first)
self.linear = nn.Linear(hidden_Size,1) # 线性输出
def forward(self,x):
lstm_out,hidden = self.lstm(x)
linear_out = self.linear(lstm_out)
return linear_out
class RNNModel(nn.Module):
def __init__(self, input_Size, hidden_Size,num_layers, dropout , batch_first):
super(RNNModel, self).__init__()
self.rnn = nn.RNN(input_size = input_Size,hidden_size = hidden_Size, num_layers = num_layers,dropout = dropout,batch_first = batch_first)
self.linear = nn.Linear(hidden_Size,1) # 线性输出
def forward(self,x):
lstm_out,hidden = self.rnn(x)
linear_out = self.linear(lstm_out)
return linear_out
class GRUModel(nn.Module):
def __init__(self, input_Size, hidden_Size,num_layers,dropout , batch_first):
super(GRUModel, self).__init__()
self.GRU = nn.GRU(input_size = input_Size,hidden_size = hidden_Size, num_layers = num_layers,dropout = dropout,batch_first = batch_first)
self.linear = nn.Linear(hidden_Size,1) # 线性输出
def forward(self,x):
lstm_out,hidden = self.GRU(x)
linear_out = self.linear(lstm_out)
return linear_out
'网络参数'
dropout = 0
batch_first = True
hidden_Size = 10
num_layers = 1
Model_LSTM = RNNModel(input_Size = feature_num,hidden_Size = hidden_Size,num_layers = num_layers,dropout = dropout,batch_first = batch_first)
Model_LSTM.double() #将所有的浮点类型的参数和缓冲转换为(双浮点)double数据类型.
num_epoch = 500
batch_size = 100
optimizer = optimizer.SGD(Model_LSTM.parameters(), lr = 0.001)
lossFn = nn.MSELoss() #损失函数
train_loader = DataLoader(TensorDataset(train_dataX, train_dataY), batch_size = batch_size)
'模型训练过程'
T_start = time.time()
train_loss = [] # 用来保存训练集的对数均方根误差
for epoch in range(num_epoch):
for i,data in enumerate(train_loader):
train_X,train_Y = data
optimizer.zero_grad()
pred_y = Model_LSTM(train_X)
loss = lossFn(pred_y,train_Y)
loss.backward()
optimizer.step()
if epoch % 20 == 0:
print(f"Epoch: {epoch}, Loss: {loss.item()}")
train_time = time.time() - T_start
print( "网络训练完毕,训练时长为:%.2f s" % train_time)
Save_path = '../03Save_Model/Model_LSTM时间序列预测1.pt'
torch.save(Model_LSTM.state_dict(), Save_path)
'进行预测'
# 创建一个一模一样的模型,加载预训练模型的参数
Model_LSTM = RNNModel(input_Size = feature_num,hidden_Size = hidden_Size,num_layers = num_layers,dropout = dropout,batch_first = batch_first)
Model_LSTM.double() #将所有的浮点类型的参数和缓冲转换为(双浮点)double数据类型.
Model_LSTM.load_state_dict(torch.load("../03Save_Model/Model_LSTM时间序列预测1.pt"))
Model_LSTM.eval() # 不启用 BatchNormalization 和 Dropout,保证BN和dropout不发生变化
pred_testX = Model_LSTM(test_dataX) # 对测试集进行拟合
pred_train
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
基于LSTM、GRU、RNN的时间预测模型python源码+模型+数据集.zip基于LSTM、GRU、RNN的时间预测模型python源码+模型+数据集.zip基于LSTM、GRU、RNN的时间预测模型python源码+模型+数据集.zip 【说明】 【1】项目代码完整,确保稳定可靠运行后才上传。欢迎下载使用!在使用过程中,如有问题或建议,请及时私信沟通,帮助解答。 【2】项目主要针对各个计算机相关专业,包括但不限于计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师或企业员工使用。 【3】项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 【4】如果基础还行,或热爱钻研,可基于此项目进行二次开发,DIY其他不同功能,欢迎交流学习。 【特别强调】 项目下载解压后,项目名字和项目路径不要用中文,建议解压重命名为英文名字后再运行!项目易上手运行 使用过程遇到问题先搜索下,一般都是环境问题,当然也可以私信沟通,祝顺利!
资源推荐
资源详情
资源评论






























收起资源包目录





















共 15 条
- 1
资源评论

- 普通网友2025-04-07感谢资源主的分享,很值得参考学习,资源价值较高,支持!

.whl
- 粉丝: 4209
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 高中信息技术人教中图版(2019)必修一第2章算法与程序实现培优训练试题04含答案.doc
- 【网络出版的利弊分析及发展对策研究】人才流动的利弊及对策.doc
- 新教材人教A版选择性必修第二册5.2.1基本初等函数的导数5.2.2导数的四则运算法则作业(15).doc
- 2020年前端个人年终工作总结三篇.doc
- 折线图Excel模板.xlsx
- 制定大数据行业预算管理计划.docx
- 软件公司心得体会范文.doc
- 数学(江苏专用理科提高版)大一轮复习自主学习第68课算法.docx
- 存货管理表Excel模板.xlsx
- 选择性必修三Unit1FacevaluesDevelopingideas课件(105张).pptx
- 科技大学信息化项目建设经费申请表.docx
- 网上车辆网络管理系统设计与实现分析的大学论文.doc
- 社会网络中隐私策略的定义与实施--计算机毕业设计.doc
- office办公软件培训心得大全7篇.docx
- 工程项目管理实习报告总结.doc
- 第章计算机硬件系统.ppt---theol网络教学综合平台-潍坊学院(与“计算机”相关共58张).pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
