【GRU时序预测】基于matlab卷积神经网络结合门控循环单元CNN-GRU时间序列预测【含Matlab源码 2287期】

news2024/9/27 8:11:09

⛄一、CNN-GRU数据预测

1 理论基础
1.1 CNN算法

负荷序列数据为一维数据,用一维卷积核对数据进行卷积处理,以获取数据的特征。
现设定卷积核的维度为3,移动步长为1,对输入数据进行卷积,以获得特征图图谱,即:
在这里插入图片描述
式中:yj为第j个位置的特征值输出;xj为第j个位置的数据值;uj为第j个位置的卷积核值。

1.2 GRU算法
将经过卷积之后产生的特征序列作为GRU的输入。GRU由LSTM发展而来,LSTM是RNN的变体。RNN网络通过对输入信号的循环保证了信号的持续存在。LSTM是由RNN网络改进而来,在RNN的基础上加入了记忆单元和门机制,有效地解决了长序列训练中存在的梯度消失和梯度爆炸问题。

LSTM用输入门、遗忘门和输出门3个门函数来控制输入值、遗忘值和输出值。GRU网络较LSTM网络有所简化,GRU网络由新门和重置门两个门函数构成,其结构如图1所示。
在这里插入图片描述
图1 GRU的网络结构图
zt为更新门,用来决定上一层隐藏层状态中有多少信息传递到当前的隐藏状态ht中,经过sigmoid函数将结果映射到0~1之间,即:
在这里插入图片描述
rt为重置门,决定上一时刻隐藏层状态有多少信息需要被遗忘,经过sigmoid函数将结果映射到0~1之间,越接近1信息越容易被保留,即:
在这里插入图片描述
确定当前的记忆内容,将重置门rt与ht–1进行Hadamard乘积决定当前的记忆内容中要遗忘多少上一时刻的隐藏层的内容,然后与新的输入数据结合放入tanh激活函数中,即:
在这里插入图片描述
最后确定当前隐藏层保留的信息,通过zt和1–zt确定哪些历史数据和当前数据需要更新,即:
在这里插入图片描述
2 预测结果及分析
2.1 CNN-GRU预测模型建立

1)获取数据。本文选取某地区商业生活、工业生产的总负荷数据作为实验数据。在电网上搭建负荷采集设备,每h采集一次。研究发现在气象因素中温度对负荷的影响最大。由于其他气象因素获取困难、不易量化,在数据集中加入最高温度、最低温度、平均温度结合负荷数据构成测试样本;

2)数据处理。获得的数据中除含有负荷值外,还有最高温度、最低温度、平均温度等温度数据。由于现场采集情况复杂,数据中有许多空值数据,在进行模型训练之前需要对数据进行清洗并进行归一化处理。将数据分为训练数据和测试数据;

3)搭建CNN-GRU网络模型,对模型进行训练。首先将处理后的数据放入CNN网络中,进行卷积和池化操作,提取数据新的特征。然后将经过卷积处理之后的数据放入RNN网络中,由于输入数据为一维时间序列,因此使用一维卷积层。在卷积层中,卷积步长设为1,使用RELU函数作为激活函数。将归一化后的训练集数据输入搭建好的CNN-GRU网络中进行训练;

4)模型评价。将测试集数据输入到训练好的CNN-GRU网络中,以均方根误差(root mean square error,RMSE)和平均相对误差(mean absolute percent error,MAPE)作为准确度评价指标对训练好的模型进行评价。
在这里插入图片描述
式中:n为预测点个数;ai为第i个预测点的电力负荷预测值;bi为第i个预测点的电力负荷真实值。MAPE值和RMSE值越小,预测准确率越高。

⛄二、部分源代码

%% CNN-GRU时间序列预测
%% 输入参数
clc;
clear;
close all
clearvars
% 时间滞后阶数;
Lag = 1:8;
% 训练集比例
ratio = 0.9;
% 批处理样本
MiniBatchSize =24;
% 最大迭代次数
MaxEpochs = 60;
% 学习率
learningrate = 0.005;
%% 加载数据
load data;
data = [data{:}];
%% 在训练和测试中划分顺序
% 在训练和测试中拆分数据。
% 90%的数据用于训练,而10%的数据用于测试。
numStepsTraining = round(ratio*numel(data));
indexTrain = 1:numStepsTraining;
dataTrain = data(indexTrain );
indexTest = numStepsTraining+1:size(data,2);
dataTest = data(indexTest);
%% 数据标准化还是数据规范化
% 为了改善收敛过程,建议对数据进行标准化或规范化。
mu = mean(dataTrain);
sig = std(dataTrain);
TrainStandardizeddata = (dataTrain - mu) / sig;
TestStandardizeddata = (dataTest - mu) / sig;
% 训练数据矩阵变换
XTrain = lagmatrix(TrainStandardizeddata,Lag);
XTrain = XTrain(max(Lag)+1:end,:)';
YTrain = TrainStandardizeddata(max(Lag)+1:end);
% 创建一维列元胞或向量,长度为滞后训练集大小;
XrTrain = cell(size(XTrain,2),1);
YrTrain = zeros(size(YTrain,2),1);
for i=1:size(XTrain,2)
XrTrain{i,1} = XTrain(:,i);
YrTrain(i,1) = YTrain(:,i);
end

% 测试数据矩阵变换
XTest = lagmatrix(TestStandardizeddata,Lag);
XTest = XTest(max(Lag)+1:end,:)';
YTest = TestStandardizeddata(max(Lag)+1:end);
XrTest = cell(size(XTest,2),1);
YrTest = zeros(size(YTest,2),1);
for i=1:size(XTest,2)
XrTest{i,1} = XTest(:,i);
YrTest(i,1) = YTest(:,i);
end
%% 创建混合CNN-GRU网络架构
% 输入特征维度
numFeatures = size(XTrain,1);
% 输出特征维度
numResponses = 1;
FiltZise = 10;
% 创建"CNN-GRU"模型
layers = […
% 输入特征
sequenceInputLayer([numFeatures 1 1],‘Name’,‘input’)
sequenceFoldingLayer(‘Name’,‘fold’)
% CNN特征提取
convolution2dLayer(FiltZise,32,‘Padding’,‘same’,‘WeightsInitializer’,‘he’,‘Name’,‘conv’,‘DilationFactor’,1);
batchNormalizationLayer(‘Name’,‘bn’)
eluLayer(‘Name’,‘elu’)
averagePooling2dLayer(1,‘Stride’,FiltZise,‘Name’,‘pool1’)
% 展开层
sequenceUnfoldingLayer(‘Name’,‘unfold’)
% 平滑层
flattenLayer(‘Name’,‘flatten’)
% GRU特征学习
gruLayer(128,‘Name’,‘GRU1’,‘RecurrentWeightsInitializer’,‘He’,‘InputWeightsInitializer’,‘He’)
dropoutLayer(0.25,‘Name’,‘drop1’)
% GRU输出
gruLayer(32,‘OutputMode’,“last”,‘Name’,‘bil4’,‘RecurrentWeightsInitializer’,‘He’,‘InputWeightsInitializer’,‘He’)
dropoutLayer(0.25,‘Name’,‘drop2’)
% 全连接层
fullyConnectedLayer(numResponses,‘Name’,‘fc’)
regressionLayer(‘Name’,‘output’) ];

layers = layerGraph(layers);
layers = connectLayers(layers,'fold/miniBatchSize','unfold/miniBatchSize');

%% 训练选项
if gpuDeviceCount>0
mydevice = ‘gpu’;
else
mydevice = ‘cpu’;
end
options = trainingOptions(‘adam’, …
‘MaxEpochs’,MaxEpochs, …
‘MiniBatchSize’,MiniBatchSize, …
‘GradientThreshold’,1, …
‘InitialLearnRate’,learningrate, …
‘LearnRateSchedule’,‘piecewise’, …
‘LearnRateDropPeriod’,56, …
‘LearnRateDropFactor’,0.25, …
‘L2Regularization’,1e-3,…
‘GradientDecayFactor’,0.95,…
‘Verbose’,false, …
‘Shuffle’,“every-epoch”,…
‘ExecutionEnvironment’,mydevice,…
‘Plots’,‘training-progress’);
%% 模型训练
rng(0);
net = trainNetwork(XrTrain,YrTrain,layers,options);

%% 测试数据预测
% 测试集预测
YPred = predict(net,XrTest,“ExecutionEnvironment”,mydevice,“MiniBatchSize”,numFeatures);
YPred = YPred’;
% 数据反归一化
YPred = sig.*YPred + mu;
YTest = sig.*YTest + mu;

⛄三、运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

⛄四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1]张立峰,刘旭.基于CNN-GRU神经网络的短期负荷预测[J].电力科学与工程. 2020,36(11)

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

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

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

相关文章

转行AI产品经理的学习过程

学习内容及思考 引言 当别人问你为什么转行AI产品经理? 你回答因为自己喜欢。 这是一句多么空洞的话呀,苍白又无力,那你为什么喜欢呢?你了解他么?仅凭自己这一腔热情,一句轻描淡写的我喜欢,是…

行为树 --- [7] BehaviorTree.CPP 4.x版本的编译及使用

根据BehaviorTree.CPP的官方介绍,3.x版本已经不再维护了,建议使用4.x版本, 4.x版本和3.x版本的区别可以看这里 — https://www.behaviortree.dev/migration 本文介绍4.x版本的编译及使用,环境是Debian 10.5,编译器是…

笔试强训(四十七)

目录一、选择题二、编程题2.1 合唱团2.1.1 题目2.1.2 题解2.2 马戏团2.2.1 题目2.2.2 题解一、选择题 (1)对于IP地址130.63.160.2,MASK为255.255.255.0,子网号为(B) A.160.2 B.160 C.63.160 D.130.63.160 …

学Python好找工作吗?需要满足Python岗位哪些要求?

学Python好找工作吗?需要满足哪些要求?随着Python的火爆,国内Python的岗位也随之增多,只要技术能力强项目经验充足,找到工作不是问题。即使是一些二线城市,Python的薪资待遇也比较好。 一、学Python好找工作…

学习编程的中小学生越来越多,是盲目追风,还是确有其用?!

首先,中小学生为什么要学习编程?未来社会,随姜信息技术和人工智能的发展,越来越多行业的工作离不开编程。美国前总统奥巴马就呼吁:“如果我们想让美国保持地位,就需要年轻代的美国人掌握这种(编程)工具和技术,它将改变我们所有的…

最简单的canvas基础+实践,确定不进来看看嘛

前言 怎么突然提到 canvas 呢❓其实是因为工作中有一个小需求,就是给特定的区域做水印😤,思来想去😎就选择使用 canvas 去做,简单效果如下: 实现思路🤷‍♂️:封装一个全局指令&am…

新装的Ubuntu无法连接有线(无有线标志)

解决方法 1、lspci命令(查看网卡型号) labhlab:~$ lspci 00:00.0 Host bridge: Intel Corporation Device 4660 (rev 02) 00:01.0 PCI bridge: Intel Corporation Device 460d (rev 02) 00:06.0 PCI bridge: Intel Corporation Device 464d (rev 02) 0…

【图像增强】局部对比度增强的CLAHE算法直方图增强【含Matlab源码 1341期】

⛄一、简介 基于matlab局部对比度增强的CLAHE算法直方图增强 ⛄二、部分源代码 %% tic %% 清空工作区与变量 clc; clear; for image_number1:1 imageNamestrcat(num2str(image_number),‘.jpg’); img imread(imageName); %% 在LAB空间进行去雾 % RGB转LAB transform mak…

【数据结构】堆(一)——堆的实现

作者:一个喜欢猫咪的的程序员 专栏:《数据结构》 喜欢的话:世间因为少年的挺身而出,而更加瑰丽。 ——《人民日报》 目录 堆的概念及结构: 堆的实现思路:(我…

【教学类-23-01】20221217《不会写学号的中班幼儿的学号描字贴》(中班描字)

成品样式: 每个孩子3页A4横板,供6次书写 打印样式: 背景需求: 前期进行6次的Python学具教学活动,对中3班幼儿书写学号和名字的情况评估: 筛选出10位需要练习学号的幼儿。 学号、名字需要持续性、强化性练…

科技改变世界,科技改变世界杯

2022年11月20日,2022年卡塔尔世界杯(英语:FIFA World Cup Qatar 2022)在充满阿拉伯风情的开幕式中拉开了帷幕。 相比以往世界杯,今年卡塔尔世界杯在赛场上加设的黑科技,让我们在赛场上反复领略到了各种剧情…

机器学习100天(四):004 数据预处理之类别特征编码

机器学习100天,今天讲的是:数据预处理之类别特征编码。 在上一节,我们对特征 X 的 NaN 值进行了平均数插值处理。 我们打开 X,查看第一列特征,国家这一列: 发现这一列特征都是字符串,例如:法国、德国、韩国。 大部分机器学习模型,字符串类别特征是不能用来直接进行…

极简TS语法入门

@关于TypeScript 微软/大项目:诸位,都按我定义好的类型撸码,谁也别TM瞎搞!哥也没时间跟你们浪费口舌了,凡瞎**搞的让丫连编译都通不过!(内心:不把C++的一点基因伸到前端被窝去你们当我微软是真软啊…)各种装X大厂:收到!立马装起来!什么?研发成本?这个我们不考虑的…

LeetCode刷题复盘笔记—一文搞懂动态规划之5. 最长回文子串问题(动态规划系列第二十五篇)

今日主要总结一下动态规划的一道题目,5. 最长回文子串 题目:5. 最长回文子串 Leetcode题目地址 题目描述: 给你一个字符串 s,找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同,则该字符串称为回文字符串…

Java项目:SSM失物招领网站信息管理系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目为后台管理系统,分为管理员与用户两种角色; 管理员角色包含以下功能: 管理员登录,修改个人信息,用户…

零编程基础小白学习python应该看的python入门书籍

Python作为目前的大势,是很多人转行的首选,会python的人工资通常都比较高。Python在人工智能、大数据、自动化运维、全栈开发方面有着得天独厚的优势。随着Python继续占领编程语言主流的趋势,全国各城市的招聘职位和薪资均会大幅度上涨。另外…

使用java访问HDFS

文章目录利用Java编写程序访问HDFS1、创建Maven项目2、添加相关依赖3、创建日志属性文件4、启动集群HDFS服务5、在HDFS上创建文件利用Java编写程序访问HDFS 1、创建Maven项目 创建Maven项目 - HDFSDemo 单击【Create】按钮 2、添加相关依赖 在pom.xml文件里添加hadoop和…

【问答篇】Java 基础篇面试题(二)

每天进步一点~ 01、问:PreparedStatement与Statement的区别? 答: PreparedStatement是预编译语句执行者,数据库对sql语句进行预编译;Statement是执行时对sql语句进行编译 Statement存在sql注入的问题,Prep…

25.读写文件

到目前为止,我们讨论了如何处理数据, 以及如何构建、训练和测试深度学习模型。 然而,有时我们希望保存训练的模型, 以备将来在各种环境中使用(比如在部署中进行预测)。 此外,当运行一个耗时较…

English Learning - L1-3 从此没有不会的表达(上) 2022.12.12 周一

English Learning - L1-3 从此没有不会的表达(上) 2022.12.12 周一4 名词性从句名词性从句的类型4.1 各种从句的变身4.1.1 陈述句的变身一个严肃的问题:为什么要加 that ?那什么情况下,that 是可以省略的?特殊动词4.1…