pytorch搭建LSTM神经网络预测电力负荷

简介: pytorch搭建LSTM神经网络预测电力负荷
import torch
import torch.nn as nn
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 由于训练数据存在相差较大的,因此使用min/max尺度变换对训练数据进行归一化
# 注意只对训练数据进行归一化,为了防止有些信息从训练数据泄露到的测试数据
from sklearn.preprocessing import MinMaxScaler
flight_data = pd.read_csv(r"C:\Users\Administrator\Desktop\填补缺失值.csv")
fig_size = plt.rcParams["figure.figsize"]
fig_size[0] = 15
fig_size[1] = 5
plt.rcParams["figure.figsize"] = fig_size
plt.title('power vs day')
plt.ylabel('power')
plt.xlabel('day')
plt.grid(True)
plt.autoscale(axis='x',tight=True)
plt.plot(flight_data['power'])
plt.show()
#提取数据
all_data = flight_data['power'].values.astype(float)
print(all_data)
#将数据区分为训练数据和测试数据
test_data_size = 960
train_data = all_data[:-test_data_size]
test_data = all_data[-test_data_size:]
# 由于训练数据存在相差较大的,因此使用min/max尺度变换对训练数据进行归一化
# 注意只对训练数据进行归一化,为了防止有些信息从训练数据泄露到的测试数据
scaler = MinMaxScaler(feature_range=(-1, 1))
train_data_normalized = scaler.fit_transform(train_data.reshape(-1, 1))
print(train_data_normalized)
# 将数据转换为张量
train_data_normalized = torch.FloatTensor(train_data_normalized).view(-1)
def create_inout_sequences(input_data, tw):
    inout_seq = []
    L = len(input_data)
    for i in range(L-tw):
        train_seq = input_data[i:i+tw]
        train_label = input_data[i+tw:i+tw+1]
        inout_seq.append((train_seq ,train_label))
    return inout_seq
train_window =5
train_inout_seq = create_inout_sequences(train_data_normalized, train_window)
#定义LSTM模型
class LSTM(nn.Module):
 def __init__(self, input_size=1, hidden_size=55, output_size=1):
        super().__init__()
        self.hidden_size = hidden_size
        # 定义lstm 层
        self.lstm = nn.LSTM(input_size, hidden_size)
        # 定义线性层,即在LSTM的的输出后面再加一个线性层
        self.linear = nn.Linear(hidden_size, output_size)
    # input_seq参数表示输入sequence
 def forward(self, input_seq):
        # lstm默认的输入X是(sequence_legth,bacth_size,input_size)
        lstm_out,\
        self.hidden_cell = self.lstm(input_seq.view(len(input_seq), 1, -1), self.hidden_cell)
        # lstm_out的默认大小是(sequence_legth,bacth_size,hidden_size)
        # 转化之后lstm_out的大小是(sequence_legth, bacth_size*hidden_size)
        predictions = self.linear(lstm_out.view(len(input_seq), -1))
        # 由于bacth_size = 1, 可知predictions 的维度为(sequence_legth, output_size)
        # [-1] 表示的是取最后一个时间步长对应的输出
        return predictions[-1]
# 模型实例化并定义损失函数和优化函数
model = LSTM()
loss_function = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
print(model)
epochs = 1
for i in range(epochs):
    for seq, labels in train_inout_seq:
        optimizer.zero_grad()
        model.hidden_cell = (torch.zeros(1, 1, model.hidden_size),
                        torch.zeros(1, 1, model.hidden_size))
        y_pred = model(seq)
        single_loss = loss_function(y_pred, labels)
        single_loss.backward()
        optimizer.step()
    #if i%25 == 1:
        print(f'epoch: {i:3} loss: {single_loss.item():10.8f}')
print(f'epoch: {i:3} loss: {single_loss.item():10.10f}')
# 以train data的最后12个数据进行预测
fut_pred = 960
test_inputs = train_data_normalized[-train_window:].tolist()
print(test_inputs)
model.eval()
# 基于最后12个数据来预测第133个数据,并基于新的预测数据进一步预测
# 134-144 的数据
for i in range(fut_pred):
    seq = torch.FloatTensor(test_inputs[-train_window:])
    # 模型评价时候关闭梯度下降
    with torch.no_grad():
        model.hidden = (torch.zeros(1, 1, model.hidden_size),
                        torch.zeros(1, 1, model.hidden_size))
        test_inputs.append(model(seq).item())
test_inputs[fut_pred:]
actual_predictions = scaler.inverse_transform(np.array(test_inputs[train_window:] ).reshape(-1, 1))
print(actual_predictions)
# 绘制图像查看预测的[133-144]的数据和实际的133-144 之间的数据差别
x = np.arange(127584,128544, 1)
plt.title('power vs day')
plt.ylabel('power')
plt.grid(True)
plt.autoscale(axis='x', tight=True)
plt.plot(flight_data['power'])
plt.plot(x,actual_predictions)
plt.show()

话不多说,先上代码,这个LSTM网络是基于之前一个博主的,然后我再根据自己的比赛需要改进了一部分,这篇文章算是记录一下自己第一次搭建神经网络。


1:第一个就是数据的读取 建议使用pandas来读取数据 值得注意的是路径名前要有一个r用于转义,否则系统会报错,还有EXCEL文件要转化成CSV格式


2:第二个就是对于原始数据的可视化,python作为解释性语言相信大家也看的明白那些plt...怎么干嘛


3:因为数据是一个时间序列,所以我们先提取其中的值部分,先忽略时间部分


4:将数据集划分为训练集和测试集,比例一般在4:1左右


5:数据的归一化


from sklearn.preprocessing import MinMaxScaler使用库函数  将值变化到-1到1之间 这样便于在训练的时候快速收敛 不然计算时间会比较久

还有就是一些参数的设定 比如train_window hidden_size epoch fut_pred等等参数的设置 里面还有一些LSTM的细节 感兴趣的可以多了解一下他的原理


最后就是自己改预测范围 看你想要的预测是多


少  当然原来的博主里面没有反归一化  我们要记得反归一化 不然预测的数据还是-1到1

actual_predictions = scaler.inverse_transform(np.array(test_inputs[train_window:] ).reshape(-1, 1))
相关文章
|
10月前
|
机器学习/深度学习 算法 安全
【PSO-LSTM】基于PSO优化LSTM网络的电力负荷预测(Python代码实现)
【PSO-LSTM】基于PSO优化LSTM网络的电力负荷预测(Python代码实现)
450 0
|
机器学习/深度学习 算法 数据安全/隐私保护
基于PSO粒子群优化TCN-LSTM时间卷积神经网络时间序列预测算法matlab仿真
本内容展示了一种基于粒子群优化(PSO)与时间卷积神经网络(TCN)的时间序列预测方法。通过 MATLAB2022a 实现,完整程序运行无水印,核心代码附详细中文注释及操作视频。算法利用 PSO 优化 TCN 的超参数(如卷积核大小、层数等),提升非线性时间序列预测性能。TCN 结构包含因果卷积层与残差连接,结合 LSTM 构建混合模型,经多次迭代选择最优超参数,最终实现更准确可靠的预测效果,适用于金融、气象等领域。
|
机器学习/深度学习 数据采集 调度
bp神经网络电力系统短期负荷预测
bp神经网络电力系统短期负荷预测
483 60
|
10月前
|
机器学习/深度学习 数据采集 算法
Python|基于改进粒子群IPSO与LSTM的短期电力负荷预测研究
Python|基于改进粒子群IPSO与LSTM的短期电力负荷预测研究
401 4
|
9月前
|
机器学习/深度学习 数据采集 算法
基于VMD-LSTM的电力负荷预测研究(Matlab代码实现)
基于VMD-LSTM的电力负荷预测研究(Matlab代码实现)
612 0
|
9月前
|
机器学习/深度学习 传感器 数据采集
基于贝叶斯优化CNN-LSTM混合神经网络预测(Matlab代码实现)
基于贝叶斯优化CNN-LSTM混合神经网络预测(Matlab代码实现)
1306 0
|
机器学习/深度学习 算法 PyTorch
Perforated Backpropagation:神经网络优化的创新技术及PyTorch使用指南
深度学习近年来在多个领域取得了显著进展,但其核心组件——人工神经元和反向传播算法自提出以来鲜有根本性突破。穿孔反向传播(Perforated Backpropagation)技术通过引入“树突”机制,模仿生物神经元的计算能力,实现了对传统神经元的增强。该技术利用基于协方差的损失函数训练树突节点,使其能够识别神经元分类中的异常模式,从而提升整体网络性能。实验表明,该方法不仅可提高模型精度(如BERT模型准确率提升3%-17%),还能实现高效模型压缩(参数减少44%而无性能损失)。这一革新为深度学习的基础构建模块带来了新的可能性,尤其适用于边缘设备和大规模模型优化场景。
520 16
Perforated Backpropagation:神经网络优化的创新技术及PyTorch使用指南
|
数据可视化 Python
【负荷预测】基于变分模态分解(VMD-CNN-LSTM)的短期电力负荷预测【Python】
本项目实现了一种基于变分模态分解(VMD)的短期电力负荷预测模型——VMD-CNN-LSTM。通过VMD技术将原始电力负荷数据分解为多个平稳子序列,结合温度和时间等特征构建矩阵,输入CNN-LSTM模型训练,最终叠加重构得到预测结果。此方法有效应对非线性和非平稳性引起的误差,精度高且稳定性强。程序采用Python编写,注释清晰,运行稳定,并提供直观的可视化结果。附带部分代码及详细运行结果展示,下载链接已提供。
|
9月前
|
机器学习/深度学习 算法 调度
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
648 0
|
9月前
|
机器学习/深度学习 传感器 算法
【无人车路径跟踪】基于神经网络的数据驱动迭代学习控制(ILC)算法,用于具有未知模型和重复任务的非线性单输入单输出(SISO)离散时间系统的无人车的路径跟踪(Matlab代码实现)
【无人车路径跟踪】基于神经网络的数据驱动迭代学习控制(ILC)算法,用于具有未知模型和重复任务的非线性单输入单输出(SISO)离散时间系统的无人车的路径跟踪(Matlab代码实现)
612 2

热门文章

最新文章