600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 【GRU时序预测】基于matlab卷积神经网络结合门控循环单元CNN-GRU时间序列预测【含Matl

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

时间:2020-10-16 03:22:52

相关推荐

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

⛄一、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版本

a

2 参考文献

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

3 备注

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

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。