风速预测(二)基于Pytorch的EMD-LSTM模型

embedded/2024/9/25 10:50:35/

前言

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

风速预测(一)数据集介绍和预处理_风速预测网站-CSDN博客

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

1.1 导入数据

python">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分解

python">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划分训练集和测试集

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

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

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

python"># 加载数据
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预测模型

注意:输入风速数据形状为 [64, 10, 7], batch_size=64,  维度10维代表10个分量,7代表序列长度。

3.3 定义模型参数

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

3.4 模型结构

3.5 模型训练

训练结果

采用两个评价指标:MSE 与 MAE 对模型训练进行评价,100个epoch,MSE 为0.0081,MAE  为 0.00044,EMD-LSTM预测效果良好,适当调整模型参数,还可以进一步提高模型预测表现。

注意调整参数:

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

  • 增加更多的 epoch (注意防止过拟合)

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

3.6 结果可视化

代码、数据整理如下:

图片


http://www.ppmy.cn/embedded/116584.html

相关文章

python自学笔记

python部分总结 主要记录的是python与之前学的语言的不同之处 函数总结 首字母大写: name.title() 删除右边空格(暂时):name.rstrip() 删除左边空格(暂时):name.lstrip() 删除前缀(暂时):name.removeprefi…

网络爬虫进阶

一、re模块compile 在爬虫或任何需要处理字符串和文本数据的Python程序中,re模块的compile()函数是一个非常重要的工具。这个函数用于编译一个字符串形式的正则表达式,将其转换为一个模式对象(Pattern对象)。使用编译后的模式对象…

Vue子组件样式受到父组件污染

今天写了一个搜索组件,利用水平弹簧布局将输入框和搜索按钮排列在一起,但是使用的时候一直是垂直弹簧布局,后来发现: 父子组件都在style标签加了scoped属性时,父组件样式会同步到子组件的根元素(template不…

综合体第三题(DHCP报文分析)

DHCP工作流程(一般情况下) 例二(无忧/22) 下图为DHCP客户机获取IP地址等配置信息时,使用Wareshark软件捕获报文中编号为2〜5的4条报文,图中对编号为3的报文进行了解析。分析图中的信息并补全图中①〜⑤处的…

[vulnhub] Prime 1

https://www.vulnhub.com/entry/prime-1,358/ 主机发现端口扫描 探测存活主机,137是靶机 nmap -sP 192.168.75.0/24 // Starting Nmap 7.93 ( https://nmap.org ) at 2024-09-22 16:25 CST Nmap scan report for 192.168.75.1 Host is up (…

vant_UI的选择时间小组件封装

<template><div><div class"time-container"><span>开始时间 :</span><van-field v-model"startTimeInner" placeholder"请输入开始时间" focuschooseTime(true) blur"onInputBlur($event, true)"…

探索OpenAI的全新里程碑:o1模型

近期&#xff0c;人工智能领域迎来了一项重要突破——OpenAI发布了其最新的语言模型o1。作为一款专为解决复杂问题设计的新一代大语言模型&#xff08;LLM&#xff09;&#xff0c;o1标志着该公司在智能推理能力方面迈出了重要的一步。尽管这个新系统仍处于初步阶段&#xff0c…

ARM GNU工具链

一.找不到gcc-arm-linux-gnueabi命令 sudo apt-get install gcc-arm* 二.这些软件包通常用于软件开发环境中&#xff0c;主要用途如下&#xff1a; 1. **make**: 是一个构建自动化工具&#xff0c;用于管理源代码的编译过程&#xff0c;可以根据一组规则来编译和链接程序。 …