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;
1 matlab版本
2014a
2 参考文献
[1]张立峰,刘旭.基于CNN-GRU神经网络的短期负荷预测[J].电力科学与工程. 2020,36(11)
3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除