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_seqtrain_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参数表示输入sequencedef 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 = 1for 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))

第一次写 大概就是记录一下这些时间为数模而准备的一些东西 还有很多不足 希望大家一起进步

pytorch搭建LSTM神经网络预测电力负荷相关推荐

  1. 基于BP神经网络预测电力负荷(Matlab代码实现)

       目录

  2. 神经网络预测模型算法_MATLAB Elman神经网络的数据预测—电力负荷预测模型研究...

    点击上方蓝字关注"公众号" MATLAB  Elman神经网络的数据预测-电力负荷预测模型研究 负荷预测的核心问题是预测的技术问题,或者说是预测的数学模型. 传统的数学模型是用显示 ...

  3. 基于改进粒子群IPSO与LSTM的短期电力负荷预测

    短期电力负荷预测是电力系统安全调度.经济运行的重要依据 , 随着电力系统的市场化 , 负荷预测的精度直接影响到电力系统运行的可靠性.经济性和供电质量.LSTM 为短期电力负荷预测提供了一个新的研究方向 ...

  4. 基于布谷鸟优化LSTM的短时电力负荷预测

    0 引言 短期电力负荷预测是电力系统安全调度.经济运行的重要依据 , 随着电力系统的市场化 , 负荷预测的精度直接影响到电力系统运行的可靠性.经济性和供电质量.LSTM 为短期电力负荷预测提供了一个新 ...

  5. 神经网络学习小记录52——Pytorch搭建孪生神经网络(Siamese network)比较图片相似性

    神经网络学习小记录52--Pytorch搭建孪生神经网络(Siamese network)比较图片相似性 学习前言 什么是孪生神经网络 代码下载 孪生神经网络的实现思路 一.预测部分 1.主干网络介绍 ...

  6. 用PyTorch搭建卷积神经网络

    用PyTorch搭建卷积神经网络 本篇是加拿大McGill本科,Waterloo硕士林羿实习时所作的工作.发文共享,主要是面对PyTorch的初学者. 本篇文章是一篇基础向的PyTorch教程,适合有 ...

  7. 【Matlab电力负荷预测】粒子群算法优化支持向量机预测电力负荷【含源码 1225期】

    一.代码运行视频(哔哩哔哩) [Matlab电力负荷预测]粒子群算法优化支持向量机预测电力负荷[含源码 1225期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [ ...

  8. 【图像分类】基于PyTorch搭建LSTM实现MNIST手写数字体识别(双向LSTM,附完整代码和数据集)

    写在前面: 首先感谢兄弟们的关注和订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌. 在https://blog.csdn.net/A ...

  9. 使用PyTorch搭建CNN神经网络

    使用pytorch搭建CNN神经网络 卷积运算的基本原理 单层卷积运算 valid convolution same convolution CNN的基本结构 数据输入层 卷积层 池化层 全连接层 数 ...

  10. 基于BP神经网络的电力负荷预测(Matlab代码实现)

    目录 1 概述 2 运行结果 3 完整Matlab代码实现 4 数据 1 概述 随着电力工业逐步进入市场化,区域配电网短期电力负荷预测在电力行业中地位越来越重要,精准的短期负荷预测方法对电力系统安全稳 ...

最新文章

  1. Hadoop_27_MapReduce_运营商原始日志增强(自定义OutputFormat)
  2. 将ssm项目和普通java项目打包
  3. RMQ(Range Minimum/Maximum Query)问题:
  4. springboot和kafka集成
  5. 多线程还是多进程的选择及区别
  6. redis的基础命令操作
  7. Apache阶段二-
  8. LeetCode 3.无重复字符的最长字串(滑动窗口)
  9. 离散型概率分布的抽样
  10. 大家好,我就是那个提【换手机壳颜色变app主题】需求的“产品经理”
  11. android平板机,HTC首款Android平板机发布
  12. ip地址转换htonl的用法
  13. System.gc()的理解
  14. Java体系知识之ElementUI
  15. [ArcGIS] 空间分析(八) 水文分析
  16. Mac安装Tableau Desktop 2019 for Mac中文版安装教程
  17. 区块链世界里不能信什么?
  18. 腾讯云cos html,关于腾讯云对象储存cos的配置方法简单说明
  19. unigui发布_uniGUI试用笔记(十一) ---UNIDBGRID
  20. cesium鼠标移入移出实体显示提示框

热门文章

  1. 使用winpcap开发网络抓包工具
  2. 快速用JavaScript实现划词取词,可复制百度文库文字(获取鼠标选中区域文字)
  3. 硬件开发笔记(二):硬件开发基本流程,制作一个USB转RS232的模块(一):开发基本过程和元器件选型
  4. 文件系统的设计与实现(操作系统课程设计)
  5. 【一周头条盘点】中国软件网(2018.9.10~2018.9.14)
  6. VMware虚拟机安装及虚拟机下安装XP系统
  7. miui 8.5 android,小米MIUI8.5稳定版
  8. Struts2 验证码图片实例
  9. Android 悬浮窗的实现(类似于360加速球)
  10. 【STM32学习笔记】(10)——蜂鸣器实验详解