深度学习LSTM之预测光伏发电

news2024/12/24 11:27:45

代码一:训练LSTM模型

代码逐段分析
import numpy as np
import pandas as pd
import tensorflow.keras as tk
from tensorflow.keras import layers

首先,导入了必要的库:numpy用于数值计算,pandas用于数据处理,tensorflow.keras用于构建和训练神经网络模型。

数据预处理
# Part 1 - Data Preprocessing
input_data_file = 'D:\Python\python_code\pythonProject1\实训2RNN\data\JSGF001\附件4-测光数据.xls'
output_data_file = 'D:\Python\python_code\pythonProject1\实训2RNN\data\JSGF001\附件2-场站出力.xls'
x_data = pd.read_excel(input_data_file, sheet_name='2019').iloc[2:, 1:].reset_index(drop=True).values
y_data = pd.read_excel(output_data_file, sheet_name='2019').iloc[1:, 1:].reset_index(drop=True).values

读取输入和输出数据文件,并使用pandas库处理Excel文件的数据。x_data是测光数据,y_data是场站出力数据。

# Creating a data structure with 10 timesteps and 1 output
x_train = []
y_train = []
for i in range(10, x_data.shape[0]):
    x_train.append(x_data[i - 10:i])
    y_train.append(y_data[i])
x_train, y_train = np.array(x_train).astype(np.float64), np.array(y_train).astype(np.float64)

将数据转换为时间序列结构,即使用前10个时间步的数据预测下一个时间步的输出。x_trainy_train分别存储输入和输出的训练数据。

构建和训练LSTM模型
# Part 2 - Building the RNN
# Initialising the RNN
model = tk.Sequential()
model.add(layers.LSTM(units=100, return_sequences=True))
model.add(layers.LSTM(units=100))
# Adding the output layer
model.add(layers.Dense(units=1))

初始化一个顺序模型,并添加两个LSTM层,每层包含100个单元。return_sequences=True表示返回每个时间步的输出,这对于堆叠的LSTM层是必要的。最后,添加一个全连接层作为输出层。

# Compiling the RNN
model.compile(optimizer=tk.optimizers.Adam(), loss=tk.losses.mse)
# Fitting the RNN to the Training set
model.fit(x_train, y_train, epochs=20, batch_size=128)
model.save("data/powerLSTM.keras")

使用Adam优化器和均方误差(MSE)损失函数编译模型,并训练模型20个周期(epochs),每批次处理128个样本。训练完成后,将模型保存到文件中。

代码二:使用训练好的LSTM模型进行预测

代码逐段分析
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import tensorflow.keras as tk

model = tk.models.load_model("data/powerLSTM.keras")

导入必要的库,并加载之前训练好的LSTM模型。

数据预处理
input_data_file = 'D:\Python\python_code\pythonProject1\实训2RNN\data\JSGF001\附件4-测光数据.xls'
output_data_file = 'D:\Python\python_code\pythonProject1\实训2RNN\data\JSGF001\附件2-场站出力.xls'
x_data = pd.read_excel(input_data_file, sheet_name='2020').iloc[2:202, 1:].reset_index(drop=True).values
y_data = pd.read_excel(output_data_file, sheet_name='2020').iloc[1:201, 1:].reset_index(drop=True).values
# Creating a data structure with 10 timesteps and 1 output
x_test = []
y_test = []
for i in range(10, x_data.shape[0]):
    x_test.append(x_data[i - 10:i])
    y_test.append(y_data[i])
x_test, y_test = np.array(x_test).astype(np.float64), np.array(y_test).astype(np.float64)

读取2020年的输入和输出数据,并进行相同的预处理,将数据转换为时间序列结构。

模型预测和结果可视化
y_pred = model.predict(x_test)

使用训练好的LSTM模型对测试数据进行预测。

# Visualising the results
plt.plot(y_test, color='red', label='Real Power')
plt.plot(y_pred, color='blue', label='Predicted Power')
plt.title('Photovoltaics Prediction')
plt.xlabel('Time')
plt.ylabel('Power')
plt.legend()
plt.show()

print(abs(y_test - y_pred).sum()/len(y_test))

绘制真实值与预测值的对比图,以红色表示真实功率,蓝色表示预测功率。计算并输出预测误差的平均绝对值。

深度学习模型:LSTM

第一个代码使用的是长短期记忆(LSTM)网络,这是循环神经网络(RNN)的一种变体。LSTM通过引入三个门控机制(输入门、遗忘门和输出门),解决了标准RNN中的长期依赖问题。

LSTM的工作原理
  • 输入门:控制输入到当前时刻的信息有多少会被存储到细胞状态。
  • 遗忘门:控制细胞状态中有多少信息会被保留。
  • 输出门:控制有多少细胞状态的信息会被输出到下一层。

激活函数

在深度学习模型中,激活函数是非常重要的一部分。它们引入了非线性,使得神经网络能够学习和表示复杂的模式。

常见的激活函数
  1. Sigmoid

    \sigma(x) = \frac{1}{1 + e^{-x}}

    输出值在0和1之间。常用于输出层进行二分类问题。

  2. Tanh

    \tanh(x) = \frac{e^x - e{-x}}{ex + e^{-x}}

    输出值在-1和1之间,常用于隐藏层,效果通常优于Sigmoid。

  3. ReLU(Rectified Linear Unit):

    \text{ReLU}(x) = \max(0, x)

    是目前最流行的激活函数,因其计算简单且能有效缓解梯度消失问题。

  4. Leaky ReLU

    \text{Leaky ReLU}(x) = \begin{cases}
    x & \text{if } x \ge 0 \
    \alpha x & \text{if } x < 0
    \end{cases}

    是ReLU的变体,允许小部分负值通过,有效解决ReLU的“死亡”问题。

完整代码

import numpy as np
import pandas as pd
import tensorflow.keras as tk
from tensorflow.keras import layers

# Part 1 - Data Preprocessing
input_data_file = 'D:\Python\python_code\pythonProject1\实训2RNN\data\JSGF001\附件4-测光数据.xls'
output_data_file = 'D:\Python\python_code\pythonProject1\实训2RNN\data\JSGF001\附件2-场站出力.xls'
x_data = pd.read_excel(input_data_file, sheet_name='2019').iloc[2:, 1:].reset_index(drop=True).values
y_data = pd.read_excel(output_data_file, sheet_name='2019').iloc[1:, 1:].reset_index(drop=True).values
# Creating a data structure with 10 timesteps and 1 output
x_train = []
y_train = []
for i in range(10, x_data.shape[0]):
    x_train.append(x_data[i - 10:i])
    y_train.append(y_data[i])
x_train, y_train = np.array(x_train).astype(np.float64), np.array(y_train).astype(np.float64)

# Part 2 - Building the RNN
# Initialising the RNN
model = tk.Sequential()
model.add(layers.LSTM(units=100, return_sequences=True))
model.add(layers.LSTM(units=100))
# Adding the output layer
model.add(layers.Dense(units=1))
# Compiling the RNN
model.compile(optimizer=tk.optimizers.Adam(),
              loss=tk.losses.mse)
# Fitting the RNN to the Training set
model.fit(x_train, y_train, epochs=20, batch_size=128)

model.save("data/powerLSTM.keras")
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import tensorflow.keras as tk

model = tk.models.load_model("data/powerLSTM.keras")

input_data_file = 'D:\Python\python_code\pythonProject1\实训2RNN\data\JSGF001\附件4-测光数据.xls'
output_data_file = 'D:\Python\python_code\pythonProject1\实训2RNN\data\JSGF001\附件2-场站出力.xls'
x_data = pd.read_excel(input_data_file, sheet_name='2020').iloc[2:202, 1:].reset_index(drop=True).values
y_data = pd.read_excel(output_data_file, sheet_name='2020').iloc[1:201, 1:].reset_index(drop=True).values
# Creating a data structure with 10 timesteps and 1 output
x_test = []
y_test = []
for i in range(10, x_data.shape[0]):
    x_test.append(x_data[i - 10:i])
    y_test.append(y_data[i])
x_test, y_test = np.array(x_test).astype(np.float64), np.array(y_test).astype(np.float64)

y_pred = model.predict(x_test)

# Visualising the results
plt.plot(y_test, color='red', label='Real Power')
plt.plot(y_pred, color='blue', label='Predicted Power')
plt.title('Photovoltaics Prediction')
plt.xlabel('Time')
plt.ylabel('Power')
plt.legend()
plt.show()

print(abs(y_test - y_pred).sum()/len(y_test))

在这里插入图片描述

结论

通过以上两个代码示例,我们了解了如何使用LSTM模型进行时间序列数据的预测,并深入探讨了LSTM模型的工作原理和激活函数的作用。希望这篇博客能帮助你更好地理解和应用深度学习模型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1924579.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【CEEMDAN-VMD-CNN-LSTM】双重分解+卷积神经网络+长短期记忆神经网络多变量回归预测,多变量输入模型

双重分解&#xff08;Dual Decomposition&#xff09;、卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;和长短期记忆神经网络&#xff08;Long Short-Term Memory&#xff0c;LSTM&#xff09;结合的多变量回归预测需要详细的实现和数据情况…

Go 初始化一个字典value是列表

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

7-4、5、6 react+ipfs上传文件数据及相关配置(react+区块链实战)

7-4、5、6 reactipfs上传文件数据及相关配置&#xff08;react区块链实战&#xff09; 7-4 reactipfs上传文件7-5 reactipfs 上传数据ipfs跨域配置7-6 reactipfs读取ipfs网络数据 7-4 reactipfs上传文件 引入之前安装的ipfs-api 在电脑后台启动ipfs的服务 ipfs daemon&#…

智慧城市3d数据可视化系统提升信息汇报的时效和精准度

在信息大爆炸的时代&#xff0c;数据的力量无可估量。而如何将这些数据以直观、高效的方式呈现出来&#xff0c;成为了一个亟待解决的问题。为此&#xff0c;我们推出了全新的3D可视化数据大屏系统&#xff0c;让数据“跃然屏上”&#xff0c;助力您洞察先机&#xff0c;决胜千…

nginx的四层负载均衡实战

目录 1 环境准备 1.1 mysql 部署 1.2 nginx 部署 1.3 关闭防火墙和selinux 2 nginx配置 2.1 修改nginx主配置文件 2.2 创建stream配置文件 2.3 重启nginx 3 测试四层代理是否轮循成功 3.1 远程链接通过代理服务器访问 3.2 动图演示 4 四层反向代理算法介绍 4.1 轮询&#xff0…

AI人工智能开源大模型生态体系分析

人工智能开源大模型生态体系研究 "人工智能开源大模型生态体系研究报告v1.0"揭示&#xff0c;AI(A)的飞速发展依赖于三大核心&#xff1a;数据、算法和算力。这一理念已得到业界广泛认同&#xff0c;三者兼备才能推动AI的壮大发展。随着AI大模型的扩大与普及&#xf…

【学习笔记】4、组合逻辑电路(下)

接前文《【学习笔记】4、组合逻辑电路(上)》 4.4.5 算术运算电路 1. 半加器和全加器 半加器和全加器是算术运算电路中的基本单元。半加器和全加器是1位相加的组合逻辑电路。 &#xff08;1&#xff09;半加器 半加器&#xff1a;只考虑两个加数本身&#xff0c;不考虑低位进…

WPF学习(6) -- WPF命令和通知

一 、WPF命令 1.ICommand代码 创建一个文件夹和文件 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Input;namespace 学习.Command {public class MyCommand : ICommand{Acti…

再升级!视频理解大模型 CogVLM2 开源

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、算法项目落地经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 总结链接如…

海康相机GrabImage

#include <stdio.h> #include <Windows.h> #include <process.h> #include <conio.h> #include "MvCameraControl.h"bool g_bExit false;// ch:等待按键输入 | en:Wait for key press void WaitForKeyPress(void) {while(!_kbhit()){Sleep(…

华为配置蓝牙终端定位实验

个人主页&#xff1a;知孤云出岫 目录 配置蓝牙终端定位示例 业务需求 组网需求 数据规划 配置思路 配置注意事项 操作步骤 配置文件 配置蓝牙终端定位示例 组网图形 图1 配置蓝牙终端定位示例组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件 业…

前后端,数据库以及分布式系统

1. 前端&#xff08;Frontend&#xff09; 定义&#xff1a; 前端是用户直接与之交互的部分&#xff0c;通常在浏览器中运行。它负责呈现和展示数据&#xff0c;与用户进行交互。 关键点&#xff1a; HTML/CSS/JavaScript&#xff1a; HTML定义了页面结构&#xff0c;CSS负责…

STM32之六:SysTick系统滴答定时器

目录 1. SysTick简介 2. 时钟来源 3. SysTick寄存器 3.1 CTRL—SysTick控制及状态寄存器 3.2 RELOAD—SysTick重装载数值寄存器 3.3 CURRENT—SysTick当前数值寄存器 4. systick系统定时器配置 5. 延时函数实现 5.1 延时函数编写步骤 5.2 微秒级延时函数delay_us 5.…

邮箱表单系统源码

邮箱表单简介 我们的邮箱表单系统是一个简洁高效的工具&#xff0c;旨在为用户提供一种便捷的方式来提交他们的邮箱地址。该系统可以用于订阅新闻通讯、注册活动、获取用户反馈等多种场景。 功能特点&#xff1a; 用户友好的界面&#xff1a; 表单设计简洁直观&#xff0c;用…

pytorch说明

深度学习中的重要概念&#xff1a; 激活函数&#xff1a; 激活函数的必要性&#xff1a;激活函数不是绝对必须的&#xff0c;但在深度学习中&#xff0c;它们几乎总是被使用。激活函数可以引入非线性&#xff0c;这使得神经网络能够学习更复杂的模式。 激活函数的位置&#x…

【学习笔记】无人机(UAV)在3GPP系统中的增强支持(一)-3GPP TR 22.829 V17.1.0技术报告

本文是3GPP TR 22.829 V17.1.0技术报告&#xff0c;专注于无人机&#xff08;UAV&#xff09;在3GPP系统中的增强支持。文章提出了多个无人机应用场景&#xff0c;分析了相应的能力要求&#xff0c;并建议了新的服务级别要求和关键性能指标&#xff08;KPIs&#xff09;。 下载…

安全防御实验2

一、实验拓扑 二、实验要求 办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换)分公司设备可以通过总公司的移动链路和电信链路访问到Dmz区的http服务器多出口环境基于带宽比例进行选路&#xff0c;但是&#xff0c;办公区…

如何在Mac上恢复已删除的文件?

多数 Mac 用户在将 Mac 出售或赠送给其他用户之前会擦除数据。这样做是必要的&#xff0c;因为它有助于保护隐私并防止任何人滥用您的机密数据。在大多数情况下&#xff0c;您会故意抹掉数据和文件。但在某些情况下&#xff0c;你做错了。 大多数人可能认为文件擦除和文件删除…

二次开发源码 借贷系统uniapp/借贷认证系统/小额信贷系统/工薪贷APP/资金贷系统h5

前端&#xff1a;UNIAPP 后端&#xff1a;ThinkPHP 数据库&#xff1a; Mysql 前端使用的uniapp 可以打包APP H5 小程序 系统提供了完善的网络借贷体系&#xff0c;为金融中介平台提供从获客到贷后管理全流程服务&#xff0c;解决了借贷手续繁琐、流程缓慢等问题 此源码为运营…

线程池-拒绝策略

线程池-拒绝策略 RejectedExecutionHandlerAbortPolicyCallerRunsPolicyDiscardPolicyDiscardOldestPolicy自定义拒绝策略 当核心线程已用尽 & 阻塞队列已满 & 超过最大线程数时&#xff0c;再向线程池提交任务&#xff0c;则会触发线程池的拒绝策略。 RejectedExecuti…