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

代码一:训练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模型的工作原理和激活函数的作用。希望这篇博客能帮助你更好地理解和应用深度学习模型。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

k8s record 20240710 监控

不是adaptor 是opetator 案例 监控有了&#xff0c;日志搜集呢&#xff1f; 一、kubelet 的小弟 kubelet — 负责维护容器的生命周期&#xff0c;节点和集群其他部分通信 cAdvisor 集成在 Kubernetes 的 kubelet 中&#xff0c;能够自动发现和监控集群中所有的容器。dockers…

尚硅谷Vue3入门到实战,最新版vue3+TypeScript前端开发教程

Vue3 编码规范 创建vue3工程 基于vite创建 快速上手 | Vue.js (vuejs.org) npm create vuelatest 在nodejs环境下运行进行创建 按提示进行创建 用vscode打开项目 安装依赖 源文件有src 内有main.ts App.vue 简单分析 编写src vue2语法在三中适用 vue2中的date metho…

java《ArrayList篇》--ArrayList全套知识点总结及其配套习题逐语句分析(附带全套源代码)

一、前言 来不及悼念字符串了&#xff0c;接下来登场的是集合&#xff0c;集合和数组的用法差不多&#xff0c;不同之处就在于存储的内容&#xff0c;数组是固定的长度的&#xff0c;集合的长度不固定。学习的过程中可以参照数组 今天已经是学习java的第八天了&#xff0c;接下…

vue3 vite+gojs 2.3.14 去除水印

引用vue2的做法&#xff1a;http://t.csdnimg.cn/Yrz8n 自定义vite插件&#xff0c;插件中apply 分两种模式&#xff0c;如果打包请选择build&#xff0c;记得强制刷新浏览器清缓存采能看到最新的gojs界面 export default function createGojsWaterMaker() {return {name:rem…

FPGA笔试

半加器和全加器的区别&#xff1a; 1、半加器不考虑输入的进位&#xff0c;称之为半加。 2、全加器反之&#xff0c;考虑进位。 SRAM/DRAM优缺点对比_sram和dram的主要区别及优缺点-CSDN博客 消除竞争冒险的方法 ①滤波电容&#xff1a;因为尖峰脉冲很窄&#xff0c;用很小的…

PyFluent入门之旅(5)后处理

接着PyFluent入门之旅&#xff08;4&#xff09;算例求解后我们已经完成了求解&#xff0c;并且保存了.dat的结果文件。 现在可以利用Fluent内置的后处理功能进行图像与数据曲线的输出。 1. 计算结果文件的读取 如果需要在计算完成后立即进行后处理&#xff0c;那么直接在求…

Nginx入门到精通六(高可用配置)

下面内容整理自bilibili-尚硅谷-Nginx青铜到王者视频教程 Nginx相关文章 Nginx入门到精通一&#xff08;基本概念介绍&#xff09;-CSDN博客 Nginx入门到精通二&#xff08;安装配置&#xff09;-CSDN博客 Nginx入门到精通三&#xff08;Nginx实例1&#xff1a;反向代理&a…

【Django+Vue3 线上教育平台项目实战】构建高效线上教育平台之首页模块

文章目录 前言一、导航功能实现a.效果图&#xff1a;b.后端代码c.前端代码 二、轮播图功能实现a.效果图b.后端代码c.前端代码 三、标签栏功能实现a.效果图b.后端代码c.前端代码 四、侧边栏功能实现1.整体效果图2.侧边栏功能实现a.效果图b.后端代码c.前端代码 3.侧边栏展示分类及…

springboot1——快速构建项目

需求 第一步&#xff1a;创建maven工程(非web项目) 第二步&#xff1a;导入起步依赖 点击&#xff1a; 下拉复制&#xff1a; 粘贴&#xff1a;&#xff01;&#xff01;这是springboot工程需要继承的父工程 下拉复制&#xff1a; 粘贴&#xff1a;&#xff01;&#xf…

android13 文件管理器无法安装apk 奔溃问题

总纲 android13 rom 开发总纲说明 目录 1.前言 2.我们简单写个apk测试下 3.排查客户apk 4.frameworks源码排查 5.编译验证 6.彩蛋 1.前言 客户提供的文件管理apk不能安装apk文件,一点击就奔溃。 2.我们简单写个apk测试下 private void installApk(File apkFile) {i…

将swagger注解导入apifox的IDEA配置

在使用IDEA开发中&#xff0c;经常需要将后端接口导出到Apifox&#xff0c;以便于测试。将swagger注解内容导出到Apifox中&#xff0c;需要进行以下设置: file->settting打开对话框&#xff0c;选择Other Settings -> Apifox Help&#xff0c;如下图&#xff1a; 2.选…

【JavaWeb程序设计】Servlet(二)

目录 一、改进上一篇博客Servlet&#xff08;一&#xff09;的第一题 1. 运行截图 2. 建表 3. 实体类 4. JSP页面 4.1 login.jsp 4.2 loginSuccess.jsp 4.3 loginFail.jsp 5. mybatis-config.xml 6. 工具类&#xff1a;创建SqlSessionFactory实例&#xff0c;进行 My…

Twelve Labs:专注视频理解,像人类一样理解视频内容

在当今数字化世界中&#xff0c;视频已成为人们获取信息和娱乐的主要方式之一。 AI视频生成领域的竞争也很激烈&#xff0c;Pika、Sora、Luma AI以及国内的可灵等&#xff0c;多模态、视频生成甚至也被视为大模型发展的某种必经之路。然而&#xff0c;与文本生成相比&#xff…

什么ISP?什么是IAP?

做单片机开发的工程师经常会听到两个词&#xff1a;ISP和IAP&#xff0c;但新手往往对这两个概念不是很清楚&#xff0c;今天就来和大家聊聊什么是ISP&#xff0c;什么是IAP&#xff1f; 一、ISP ISP的全称是&#xff1a;In System Programming&#xff0c;即在系统编程&…

【蓄势·致远】 同为科技(TOWE)2024年年中会议

2024年7月2日-8日&#xff0c;同为科技&#xff08;TOWE&#xff09;召开2024年年中工作会议。会议回顾上半年总体工作情况&#xff0c;分析研判发展形势&#xff0c;规划部署下半年工作。 为期一周的工作会议&#xff0c;由同为科技&#xff08;TOWE&#xff09;创始人、董事长…

MySQL的插入(DML)

1.给指定字段添加数据 这个就是&#xff0c;想插入所对应的字段&#xff0c;就插入所对应的数值。先把字段列出来&#xff0c;不一定是全部的字段&#xff0c; 然后插入想要的值&#xff0c;注意&#xff0c;只能插入一行。 INSERT INTO 表名 (字段1,字段2,.....) VALUES(值…

vue学习day08-v-model详解、sync修饰符、ref和$refs获取dom组件、Vue异步更新和$nextTick

25、v-model详解 &#xff08;1&#xff09;v-model原理 1&#xff09;原理: v-model本质上是一个语法糖&#xff0c;比如&#xff1a;在应用于输入框时&#xff0c;就是value属性与input事件的合写。 2&#xff09;作用 ①数据变&#xff0c;视图变 ②视图变&#xff0c…

网络协议 — Keepalived 高可用方案

目录 文章目录 目录Keepalived 是实现了 VRRP 协议的软件Keepalived 的软件架构VRRP StackCheckersKeepalived 的配置Global configurationvrrp_scriptVRRP Configurationvrrp synchroization groupvrrp instancevirtual ip addressesvirtual routesLVS Configurationvirtual_s…

Qt+MySQL实现社团管理系统

开发环境 ● Qt 5.14.1 ● Win10 ● Mysql 5.7.28 系统介绍 系统主要实现的功能如下图所示 社团管理系统主要包含了以下几个亮点功能 轮播图显示社团信息支持excel形式的导入导出学生信息权限控制&#xff08;管理员、超级管理员、用户&#xff09; 系统效果展示 登录界面…

Leetcode(经典题)day2

H指数 274. H 指数 - 力扣&#xff08;LeetCode&#xff09; 先对数组排序&#xff0c;然后从大的一头开始遍历&#xff0c;只要数组当前的数比现在的h指数大就给h指数1&#xff0c;直到数组当前的数比现在的h指数小的时候结束&#xff0c;这时h的值就是要返回的结果。 排序…