该 MATLAB 代码实现了一个基于 CNN-GRU-Attention 时序和空间特征结合-融合注意力机制混合神经网络模型的风速预测。以下是对代码的简要分析:


一、主要功能

该代码用于风速时间序列预测,使用历史风速特征数据(18个特征,75天,每小时一个样本)训练一个深度学习模型,并预测未来24小时的风速值。


二、算法步骤

  1. 数据导入与预处理

    • 从Excel文件中读取特征数据和实际风速值。
    • 将数据重塑为4-D格式(特征维度 × 时间步长 × 通道数 × 天数)。
    • 转换为cell数组以便用于序列训练。
  2. 训练/测试集划分

    • 训练输入(XTrain):第1–73天的特征。
    • 训练输出(YTrain):第2–74天的实际风速。
    • 测试输入(XTest):第74天的特征。
    • 测试输出(YTest):第75天的实际风速。
  3. 网络结构搭建(CNN-GRU-Attention)

    • 输入层:接收18×24×1的序列。
    • 卷积层(Conv2D):32个3×3卷积核,Padding=‘same’。
    • 批归一化层(BatchNormalization)。
    • ReLU激活层。
    • 最大池化层(MaxPooling2D):3×3池化窗口。
    • 展平层(Flatten)。
    • GRU层:50个隐藏单元。
    • 自注意力层(Self-Attention):1个头,50维。
    • 全连接层(FullyConnected):输出24个节点(对应24小时预测)。
    • 回归输出层(RegressionOutput)。
  4. 训练设置

    • 使用SGDM优化器。
    • 最大训练轮数:300。
    • 初始学习率:0.01(不衰减)。
    • 训练环境:CPU。
    • 每批次样本数:15。
    • 序列长度:24。
  5. 训练与评估

    • 训练网络并绘制训练进度。
    • 可视化卷积层的特征图。
    • 对测试集进行预测,计算误差指标(SSE, MAE, MSE, RMSE, MAPE, R)。
    • 绘制预测值与真实值对比图。

三、技术路线

  • 数据处理:时间序列数据按天组织,每个样本为24小时。
  • 模型架构
    • CNN用于提取局部空间特征。
    • GRU用于捕捉时间依赖关系。
    • Self-Attention机制增强关键时间步的表示。
  • 训练策略:使用回归任务常用的均方误差(MSE)作为损失函数。
  • 评估指标:多角度误差评估 + 相关性分析。

四、参数设定

参数值/类型说明
优化器SGDM带动量的随机梯度下降
MaxEpochs300最大训练轮数
LearnRate0.01初始学习率
MiniBatchSize15每批样本数
SequenceLength24序列长度(小时)
GRU单元数50L层隐藏单元数
卷积核数量32卷积层输出通道数
注意力头数1自注意力机制头数

五、运行环境

  • 软件环境:MATLAB(需安装 Deep Learning Toolbox)
  • 硬件环境:CPU(代码中指定 ExecutionEnvironment'cpu'
  • 数据格式:Excel文件(需包含18行特征和1行实际值)

在这里插入图片描述

代码分享

CNN-GRU-Attention多变量多步预测超前24%% 清除内存、清除屏幕
clc
clear%% 导入特征数据、当天的风速数据
data = xlsread('特征序列及实际值.xlsx');
Features   = data(1:18,:);                             %% 特征输入  :75天,每天24小时,每小时一个采样点,共计75*24=1800小时,18个特征数据
Wind_data  = data(19,:);                               %% 实际值输出:75天,每天24小时,每小时一个采样点,共计75*24=1800小时的风速数据%% 数据信息%%  数据平铺为4-D
LP_Features =  double(reshape(Features,18,24,1,75));   %% 特征数据格式为18*24*1*75,分别对应18特征24小时,75天
LP_WindData  = double(reshape(Wind_data,24,1,1,75));   %% 实际数据格式为24*1*1*75 ,分别对应24小时,75天%% 格式转换为cell
NumDays  = 75;                                         %% 数据总天数为 75天
for i=1:NumDaysFeaturesData{1,i} = LP_Features(:,:,1,i);
endfor i=1:NumDaysRealData{1,i} = LP_WindData(:,:,1,i);
end%% 划分数据
XTrain = FeaturesData(:,1:73);                         %% 训练集输入为 1-73   天的特征
YTrain = RealData(:,2:74);                             %% 训练集输出为 2-74天 的实际值                XTest  = cell2mat(FeaturesData(: , 74));               %% 测试集输入第  74    天的特征
Ytest  = cell2mat(RealData(: , 75));                   %% 测试集输出为第 75天 的实际值%% CNN-GRU-Attention网络搭建
layers = [sequenceInputLayer([18 24 1],"Name","sequence")convolution2dLayer([3 3],32,"Name","conv","Padding","same")batchNormalizationLayer("Name","batchnorm")reluLayer("Name","relu")maxPooling2dLayer([3 3],"Name","maxpool","Padding","same")flattenLayer("Name","flatten")gruLayer(50,"Name","gru")selfAttentionLayer(1,50,"Name","selfattention")fullyConnectedLayer(24,"Name","fc")regressionLayer("Name","regressionoutput")];%% 参数设置
options = trainingOptions('sgdm', ...   % SGDM 梯度下降算法'MaxEpochs',300, ...                % 最大训练次数 300'GradientThreshold',1,...           % 渐变的正阈值 1'ExecutionEnvironment','cpu',...    % 网络的执行环境 cpu'InitialLearnRate',0.01,...         % 初始学习率 0.01'LearnRateSchedule','none',...      % 训练期间降低整体学习率的方法 不降低'Shuffle','every-epoch',...         % 每次训练打乱数据集'SequenceLength',24,...             % 序列长度 24'Plots','training-progress',...     % 画出训练曲线'MiniBatchSize',15,...              % 训练批次大小 每次训练样本个数15'Verbose',0);                       % 有关训练进度的信息不打印到命令窗口中
analyzeNetwork(layers);                 % 分析网络结构
%% 训练网络
net = trainNetwork(XTrain,YTrain,layers,options);%% 绘制某层的特征图,实现特征可视化
%激活某一层
LayersNeed = activations(net,XTrain,'conv','OutputAs','channels');% flatten层的特征%%  画图
numNeed = 3   ;  %按需要取几张特征图
for i = 1:numNeed    
LayersFeature = reshape(cell2mat(LayersNeed(1,:)),18,24,32,[]); %根据analyzeNetwork分析结果,构造合适尺寸的特征图
axes1 = axes('Parent',figure);
hold(axes1,'on');
image(LayersFeature(:,:,i),'Parent',axes1,'CDataMapping','scaled');
colormap(hsv)
xlim([0, size(LayersFeature,2)]);% 限制坐标轴
ylim([0, size(LayersFeature,1)]);% 限制坐标轴
end%% 步骤5:测试与评估
YPredicted = net.predict(XTest);                       %% 计算误差
% 过程
error2 = YPredicted-Ytest;            % 测试值和真实值的误差  
[~,len]=size(Ytest);                  % len获取测试样本个数,数值等于testNum,用于求各指标平均值
SSE1=sum(error2.^2);                  % 误差平方和
MAE1=sum(abs(error2))/len;            % 平均绝对误差
MSE1=error2*error2'/len;              % 均方误差
RMSE1=MSE1^(1/2);                     % 均方根误差
MAPE1=mean(abs(error2./mean(Ytest))); % 平均百分比误差
r=corrcoef(Ytest,YPredicted);         % corrcoef计算相关系数矩阵,包括自相关和互相关系数
R1=r(1,2); %% 绘图
figure
plot(Ytest,'m-*','LineWidth',2);
hold on
plot(YPredicted,'c-o','LineWidth',2);
legend('真实值','预测值');
xlabel('预测样本');
ylabel('预测结果');
string={'测试集预测结果对比';['MAPE=' num2str(MAPE1)]};
title(string)
grid

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

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

相关文章

【升级版】从零到一训练一个 0.6B 的 MoE 大语言模型

前文:从零到一训练一个 0.6B 的 MoE 大语言模型,本次升级完全重新从零开始重新训练。主要升级如下: 替换预训练数据集,使用序列猴子通用文本数据集进行预训练。使用更先进的训练方法。新增思考模式控制,可通过添加/th…

51单片机-实现定时器模块教程

本章概述思维导图: 51单片机驱动定时器模块 CPU时序简介 CPU时序定义了CPU内部操作的时间节奏,以下从四个时序周期进行逐步解析; 1、振荡周期 振荡周期:CPU内部时钟源产生的最小时间单位,由晶振或内部振荡器决定&am…

7.Kotlin的日期类

以下是 Kotlin 中常用时间类(基于 java.time 包)的核心方法及使用示例,参考数组方法的表格形式,按类分类展示: 一、LocalDate(日期:年/月/日)方法签名返回值说明示例now(): LocalDat…

【Big Data】Hive技术解析:大数据仓库的SQL桥梁

Hive作为Apache顶级项目,是Hadoop生态系统中最具影响力的SQL查询引擎,它解决了大数据处理与传统SQL技能之间的鸿沟。Hive的核心价值在于将类SQL查询语言HiveQL无缝转换为分布式计算框架MapReduce的任务,使数据分析师能够利用熟悉的SQL语法操作…

Ubuntu2204server系统安装postgresql14并配置密码远程连接

前言: 最近因项目需要安装postgresql14,系统是ubuntu2204server系统,安装好后发现无法实现远程连接,解决了之后在此记录一下解决方法。 疑问: 什么情况下需要配置postgresql远程连接? ①如果是postgresql和…

【嵌入式】【搜集】状态机、状态迁移图及状态模式材料

文章目录状态机状态机状态机定义与核心特点状态机总结状态迁移图状态迁移图状态迁移图核心概念与要素状态迁移图常见错误与规避状态迁移图总结状态模式状态模式状态模式核心概念与组成状态模式核心价值与适用场景状态模式优缺点分析进阶优化技巧行为模式总结状态机 状态机 状…

Java学习历程14——制作一款五子棋游戏(4)

上次我们基本实现了五子棋游戏的功能,这次我们进行一些优化和添加一些便于用户使用的功能。新增功能及优化一、复盘功能复盘功能就是指在下完一局棋后,我们可以通过复盘按钮使本局棋的所有棋子重头开始自动下一遍。分析得知,我们首先要保存以…

记录一次el-table+sortablejs的拖拽bug

bug回顾出现bug的情况时 当编辑表格过于紧凑的时候 有些非必要编辑或需要一眼看到的数据 移动到了el-table-column typeexpand时 同事:怎么拖拽功能用不了了 ok开始检查代码 当原来是个简单的编辑表格 不涉及展开和简单拖拽时 不会出现问题 解决了 出现了展开行以后…

利用go sort.Sort()排序自定义切片

1 sort.Sort()简介2 核心功能3 调用前提4 代码示例 1 sort.Sort()简介 Go语言中的sort.Sort函数是标准库提供的通用排序接口 2 核心功能 核心功能支持多种类型进行快速排序 基础类型支持‌:内置Ints、Float64s、Strings等函数直接排序常见切片 自定义排序‌&a…

Elasticsearch脑裂紧急处理与预防

在 Elasticsearch 中出现 网络分区(Network Partition) 或 脑裂(Split-Brain) 导致两个子集群各自选出 Master 的情况,是非常严重的问题。比如这个场景(20个节点分裂成两个10节点的子集群,各自选…

华为网路设备学习-29(BGP协议 四)路由策略-实验

示例 延伸-具体实验1.代码部分:基础配置R1 [Huawei]int GigabitEthernet 0/0/0 [Huawei-GigabitEthernet0/0/0]ip address 10.1.13.1 24[Huawei]int LoopBack 1 [Huawei-LoopBack1]ip address 172.16.1.1 24 [Huawei-LoopBack1]q [Huawei]int LoopBack 2 [Huawei-Lo…

500系列状态码与可能的场景

501 Not Implemented(未实现)HTTP 方法不支持客户端发送了 PUT、DELETE、PATCH 请求但服务器只实现了 GET 和 POST协议功能不支持客户端使用了 HTTP/2 的某些高级特性服务器只支持 HTTP/1.1,无法处理,返回 501API 接口未完成开发中…

大数据、hadoop、爬虫、spark项目开发设计之基于数据挖掘的交通流量分析研究

大数据、hadoop、爬虫、spark项目开发设计之基于数据挖掘的交通流量分析研究

Pytest项目_day20(log日志)

Log日志优点:记录程序运行信息,方便定位问题python日志模块logging,日志等级如下: DEBUGINFO(正常)WARNINGERROR(报错)示例代码如下:import logging import os.path impo…

elasticsearch中的分词器配置及使用

一、什么是分词器? 在 Elasticsearch(ES)中,分词器(Analyzer) 是处理文本的核心组件,负责将原始文本转换为可搜索的索引词(Term)。它是文本分析过程的核心,直…

《Linux 网络编程二:UDP 与 TCP 的差异、应用及问题应对》

一、UDP 与 TCP 对比表对比项UDPTCP连接方式无需建立连接有连接(三次握手建立,四次挥手断开)传输可靠性尽最大努力交付,可能丢包安全可靠的数据传输机制面向对象面向数据包面向数据流传输模式一对一、一对多传输本质一对一&#x…

uniapp 页面跳转及字符串转义

1. uniapp 页面跳转及字符串转义 1.1. uniapp页面跳转方法 在uniapp中,页面跳转可以通过多种方式进行,包括但不限于路由跳转和页面间事件通信。   一. 路由跳转   在uniapp中,路由跳转是指通过改变页面url的方式来跳转到不同的页面。uni-app提供了一套路由跳转的API,包…

Vue中 this.$emit() 方法详解, 帮助子组件向父组件传递事件

this.$emit()是 Vue.js 中一个很有用的方法,可以帮助子组件向父组件传递事件1、原理说明:在Vue中,this.$emit()方法用于触发自定义事件。它是Vue实例的一个方法,可以在组件内部使用。使用 this.$emit() 方法,可以向父组件发送自定…

BUCK电路的环路补偿

芯片的COMP脚是用来设计环路补偿用的,它给芯片内部的误差放大器的输出和PWM控制器输入做补偿,如果环路补偿设计得不好,会更容易引起环路的不稳定或振荡,也可能导致输出电压异常。环路补偿涉及三个指标:剪切频率&#x…

Hyperledger Fabric官方中文教程-改进笔记(十六)-策略(policy)

本Fabric中文文档专栏的阅读前言:前言 文章目录什么是策略为什么需要策略策略如何实现访问控制列表 (ACLs)智能合约背书政策修改策略如何在 Fabric 中编写策略Signature policiesImplicitMeta policies例子: 通道配置策略Organizations 部分Application部分Fabric 链…