风速预测(三)EMD-LSTM-Attention模型

目录

1 风速数据EMD分解与可视化

1.1 导入数据

1.2 EMD分解

2 数据集制作与预处理

2.1 先划分数据集,按照8:2划分训练集和测试集

2.2 设置滑动窗口大小为7,制作数据集

3 基于Pytorch的EMD-LSTM-Attention模型预测

3.1 数据加载,训练数据、测试数据分组,数据分batch

3.2 定义EMD-LSTM-Attention预测模型

第一步,先定义自注意力层

第二步,定义预测模型

3.3 定义模型参数

3.4 模型训练

3.5 结果可视化


往期精彩内容:

时序预测:LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较

风速预测(一)数据集介绍和预处理

风速预测(一)数据集介绍和预处理

前言

本文基于前期介绍的风速数据(文末附数据集),先经过经验模态EMD分解,然后通过数据预处理,制作和加载数据集与标签,最后通过Pytorch实现EMD-LSTM-Attention模型对风速数据的预测。风速数据集的详细介绍可以参考下文:

风速预测(一)数据集介绍和预处理

1 风速数据EMD分解与可视化

1.1 导入数据

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rc("font", family='Microsoft YaHei')# 读取已处理的 CSV 文件
df = pd.read_csv('wind_speed.csv' )
# 取风速数据
winddata = df['Wind Speed (km/h)'].tolist()
winddata = np.array(winddata) # 转换为numpy
# 可视化
plt.figure(figsize=(15,5), dpi=100)
plt.grid(True)
plt.plot(winddata, color='green')
plt.show()

1.2 EMD分解

from PyEMD import EMD# 创建 EMD 对象
emd = EMD()
# 对信号进行经验模态分解
IMFs = emd(winddata)# 可视化
plt.figure(figsize=(20,15))
plt.subplot(len(IMFs)+1, 1, 1)
plt.plot(winddata, 'r')
plt.title("原始信号")for num, imf in enumerate(IMFs):plt.subplot(len(IMFs)+1, 1, num+2)plt.plot(imf)plt.title("IMF "+str(num+1), fontsize=10)
# 增加第一排图和第二排图之间的垂直间距
plt.subplots_adjust(hspace=0.8, wspace=0.2)
plt.show()

2 数据集制作与预处理

2.1 先划分数据集,按照8:2划分训练集和测试集

2.2 设置滑动窗口大小为7,制作数据集

3 基于Pytorch的EMD-LSTM-Attention模型预测

3.1 数据加载,训练数据、测试数据分组,数据分batch

# 加载数据
import torch
from joblib import dump, load
import torch.utils.data as Data
import numpy as np
import pandas as pd
import torch
import torch.nn as nn
# 参数与配置
torch.manual_seed(100)  # 设置随机种子,以使实验结果具有可重复性
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 加载数据集
def dataloader(batch_size, workers=2):# 训练集train_set = load('train_set')train_label = load('train_label')# 测试集test_set = load('test_set')test_label = load('test_label')# 加载数据train_loader = Data.DataLoader(dataset=Data.TensorDataset(train_set, train_label),batch_size=batch_size, num_workers=workers, drop_last=True)test_loader = Data.DataLoader(dataset=Data.TensorDataset(test_set, test_label),batch_size=batch_size, num_workers=workers, drop_last=True)return train_loader, test_loaderbatch_size = 64
# 加载数据
train_loader, test_loader = dataloader(batch_size)

3.2 定义EMD-LSTM-Attention预测模型

第一步,先定义自注意力层

第二步,定义预测模型

注意:输入风速数据形状为 [64, 10, 7], batch_size=64,  维度10维代表10个分量,7代表序列长度(滑动窗口取值)。

3.3 定义模型参数

# 定义模型参数
batch_size = 64
input_dim = 10   # 输入维度为10个分量
hidden_layer_sizes = [16, 32, 64, 128] # LSTM隐藏层
attention_dim = hidden_layer_sizes[-1]  # 注意力层维度 默认为 LSTM输出层维度
output_size = 1 # 单步输出model = EMDLSTMAttention(batch_size, input_dim, hidden_layer_sizes, attention_dim)  # 定义损失函数和优化函数 
model = model.to(device)
loss_function = nn.MSELoss()  # loss
learn_rate = 0.003
optimizer = torch.optim.Adam(model.parameters(), learn_rate)  # 优化器

3.4 模型训练

训练结果

采用两个评价指标:MSE 与 MAE 对模型训练进行评价,100个epoch,MSE 为0.009660,MAE  为 0.0004948,EMD-LSTM-Attention预测效果良好,适当调整模型参数,还可以进一步提高模型预测表现。只要模块加上去效果没有变得太差,调一调,就显得模型很立体了。

注意调整参数:

  • 可以适当增加 LSTM层数和隐藏层的维度,微调学习率;

  • 调整注意力层维度,增加更多的 epoch (注意防止过拟合)

  • 可以改变滑动窗口长度(设置合适的窗口长度)

3.5 结果可视化

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

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

相关文章

记错vue3+ts require 报错

在main.js 中使用require 报错 ‘require’ is not defined 事先声明 ,可能是版本不一样,所以解决办法不一样,报错的原因是Pack.json 文件中type值不同,解决办法有两种。 目前有什么弊端,因为时间比较紧,还…

现代C++的多线程开发

前言 早期的C进行多线程编程,往往需要根据不同的系统编写不同的代码,但是在C11之后,std中已经提供了多线程的支持,所以对于不同操作系统只需要编写一次代码即可。 本文记录一次多线程开发过程中,使用的C新特性&#…

uniapp怎么获取微信步数

微信步数获取的背景 微信步数是指用户在微信运动中记录的步数数据。微信提供了开放能力,允许第三方应用获取用户授权后的微信步数数据,以便进行进一步的数据分析和展示。使用时报错:fail api scope is not declared in the privacy agreemen…

【华为机试】2023年真题B卷(python)-洞穴探险

一、题目 题目描述: 某探险队负责对地下洞穴进行探险。探险队成员在进行探险任务时,随身携带的记录器会不定期地记录自身的坐标,但在记录的间隙中也会记录其他数据。探索工作结束后,探险队需要获取到某成员在探险过程中相对于探险…

libevent服务GET/POST的简单使用

目录 1、前言2、测试demo2.1、目录结构2.2、 测试源码2.2.1、http_server.cpp2.2.2、 http_server.h 2.3、 编译2.4、 运行结果2.4.1、测试POST2.4.2 、测试GET请求 1、前言 项目开发中经常需要使用到私有协议和Qt,Android等GUI前端通信,比较常用的使用POST和GET方式…

计算机操作系统-第十八天

目录 进程调度时机 补充知识 进程调度的方式 非剥夺调度方式 剥夺调度方式 进程的切换与过程 本节思维导图 进程调度时机 进程调度(低级调度),即按照某种算法从就绪队列中选择一个进程为其分配处理机。 共有两种需要进行进程调度与…

基于junit4搭建自定义的接口自动化测试框架

随着业务的逐步稳定,对于接口的改动也会逐渐变少。更多的是对业务逻辑的优化,功能实现的完善。对于测试来说,重复繁琐的功能测试不仅效率低下,而且耗费一定的人力资源。笔者支持的信息流业务下的一个图文管理平台就是一个功能较为…

Lambda表达式的简单理解

1. 初识lambda表达式 Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。 Lambda 表达式(Lambda exp…

网络基础试题选择题——附答案

选择题 OSI模型中,表示层的作用是? A) 数据链路B) 数据传输C) 数据格式转换D) 物理连接 IP地址的IPv4版本中,一般由几个十进制数构成? A) 2B) 4C) 6D) 8 在HTTP协议中,常用的请求方法是? A) GETB) POSTC) P…

微信scroll-view小程序实现上拉加载下拉刷新

在使用微信小程序时避免不了查询列表实现分页功能&#xff0c;在这里分享下使用croll-view实现上拉加载下拉刷新功能,如有不足请指出 创建commonPagination组件 wxml文件 <scroll-view class"scroll" style"{{style}}" scroll-top"{{scrollTop}}…

广州华锐互动:VR煤矿特殊工种作业实训帮助提高矿工的操作技能和安全意识

VR煤矿特殊工种作业实训系统为煤矿企业培训提供了全方位的支持&#xff0c;帮助提高矿工的操作技能和安全意识&#xff0c;促进煤矿企业的安全生产。 首先&#xff0c;VR煤矿特殊工种作业实训系统可以提供逼真的虚拟操作环境&#xff0c;使矿工能够身临其境地感受各种工种的作业…

计算机网络 网络层上 | IP数据报,IP地址,ICMP,ARP等

文章目录 1 网络层的两个层面2 网络协议IP2.1 虚拟互联网络2.2 IP地址2.2.1 固定分类编址方式2.2.2 无分类编制CIDR2.2.3 MAC地址和IP地址区别 2.3 地址解析协议ARP2.3.1 解析过程 2.4 IP数据报格式 3 IP层转发分组流程4 国际控制报文协议ICMP4.1 ICMP格式结构4.2 分类4.2.1 差…

学习MS Dynamics AX 2012编程开发 2. X++语言

X是用于构建Dynamics AX功能的编程语言。X是一种与C类似的面向对象编程语言。 完成本章后&#xff0c;您将能够理解X语言&#xff1b;您将知道可用的数据类型是什么&#xff0c;如何创建各种循环&#xff0c;如何比较和操作变量&#xff0c;在哪里可以找到预定义的函数&#x…

K8S学习指南(24)-k8s核心对象IngressController

文章目录 前言什么是Ingress Controller&#xff1f;Ingress Controller的工作原理Ingress Controller的常见实现Ingress Controller的使用示例步骤1&#xff1a;安装Nginx Ingress Controller步骤2&#xff1a;创建Ingress对象步骤3&#xff1a;应用配置步骤4&#xff1a;验证…

【Android逆向】记录一次某某虚拟机的逆向

导语 学了一段时间的XPosed&#xff0c;发现XPosed真的好强&#xff0c;只要技术强&#xff0c;什么操作都能实现... 这次主要记录一下我对这款应用的逆向思路 apk检查 使用MT管理器检查apk的加壳情况 发现是某数字的免费版本 直接使用frida-dexdump 脱下来后备用 应用分…

二叉树前,中序推后续_中,后续推前序

文章目录 介绍思路例子 介绍 二叉树是由根、左子树、右子树三部分组成。 二叉树的遍历方式又可以分为前序遍历&#xff0c;中序遍历&#xff0c;后序遍历。 前序遍历&#xff1a;根&#xff0c;左子树&#xff0c;右子树 中序遍历&#xff1a;左子树&#xff0c;根&#xff0…

菜鸟学习日记(python)——匿名函数

Python 使用 lambda 来创建匿名函数。 lambda 函数是一种小型、匿名的内联函数&#xff0c;它可以具有任意数量的参数&#xff0c;但只能有一个表达式。 匿名函数的一般格式如下&#xff1a; lambda 参数列表:表达式 表达式用于计算并返回函数结果 lambda 函数通常用于编写…

【影像组学入门百问】#25--#26

#25-影像组学中如何处理数据不平衡的问题&#xff1f; 在影像组学中&#xff0c;数据不平衡是一个常见的问题&#xff0c;即不同类别的样本数量不相等。这可能导致机器学习模型在训练过程中对较多的类别过度拟合&#xff0c;从而降低模型对较少类别的预测性能。以下是一些处理…

FreeRtos里的几个中断屏蔽

1、primask 寄存器 PRIMASK用于禁止除NMI和HardFalut外的所有异常和中断&#xff0c;使用方法&#xff1a; cpsid i &#xff1b; //设置primask &#xff08;禁止中断&#xff09; cpsie i ; //清除primask (使能中断) 也可以 movs r0,#1 msr primask r0; //将 1写入p…

QSqlQuery 是 Qt 框架中的一个类,用于执行 SQL 查询和操作数据库。

QSqlQuery 是 Qt 框架中的一个类&#xff0c;用于执行 SQL 查询和操作数据库。 该类提供了执行 SQL 语句、获取查询结果、访问和修改数据等功能。它可以与各种支持的数据库进行交互&#xff0c;如 MySQL、SQLite、Oracle 等。 使用 QSqlQuery 类&#xff0c;你可以执行以下操…