基于Elman神经网络的电力负荷预测(附源码)

一、算法原理

    Elman神经网络是一种典型的动态递归神经网络,它是在BP网络基本结构的基础上,在隐含层增加一个承接层,作为一步延时算子,达到记忆的目的,从而使系统具有适应时变特性的能力,增强了网络的全局稳定性,它比前馈型神经网络具有更强的计算能力,还可以用来解决快速寻优问题。ELMAN的构造分为四层神经元:输入层、隐含层、承接层以及输出层。如图1为Elman神经网络的结构图。下面对Elman神经网络的结构进行简述。

图1 Elman神经网络结构图

(1)输入层和输出层

     输入层的神经元数量与输入数据特征的维数是相等的,输出层的神经元节点数量也等同于输出数据标签的维度。

(2) 隐含层

    不管在BP还是ELMAN,或者其他的神经网络,隐含层的神经元个数都不是固定的。如果选择的隐含层神经元个数较少时,就会导致网络的学习程度减小甚至无法学习。节点个数较多时,则会导致网络训练的过程变慢,也很难得出预计的情况。只有当隐含层神经元数量只有控制在一个合理的范围内,才能使得网络模型好的进行学习运算。

(3)承接层

    承接层也叫做上下文层和状态层,主要功能是用来记忆隐含层上一个时间点的输出数值。所以承接层的神经元个数与隐含层相同,确定方法为:先根据训练误差最小确定最佳的隐含层神经元节点,再得到承接层的神经元节点个数。

二、代码实战

    以电力负荷预测为例。

%总共10天的数据,选取前面9天的数据作为神经网络的训练样本,每3天的负荷作为输入向量,
%第四天的负荷作为目标向量,这样可以得到6组训练样本。第10天的数据作为网络的测试样本
%验证网络能否准确预测当天的负荷数据
clear all
clc
% close all
% nntwarn off;
%导入题中所给样本数据
a=[0.37 0.51 0.71;...
    0.12 0.17 0.88;...
    0.32 0.99 0.69;...
    0.13 0.55 0.63;...
    0.11 0.42 0.84;...
    0.24 0.53 0.71;...
    0.33 0.44 0.9;...
    0.19 0.66 0.44;...
    0.31 0.67 0.49;...
    0.37 0.51 0.71];

%%%%%%%%%%选取训练数据和测试数据%%%%%%%%%%%%%
for i=1:7
    p(i,:)=[a(i,:),a(i+1,:),a(i+2,:)];
end
% 训练数据输入
p_train=p(1:6,:);
% 训练数据输出
t_train=a(4:9,:);
% 测试数据输入
p_test=p(7,:);
% 测试数据输出
t_test=a(10,:);

%为适应网络结构,对数据做转置处理
p_train=p_train';
t_train=t_train';
p_test=p_test';


%%%%%%%%%%%网络的建立和训练%%%%%%%%%%%%%%%%%
%设置不同的隐藏层神经元个数
nn=[5 10 15 20];
for i=1:4
    threshold=[0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1];
    %建立Elman神经网络 隐藏层为nn(i)个神经元
    net=newelm(threshold,[nn(i),3],{'tansig','purelin'});
    %设置网络训练参数
    net.trainparam.epochs=2000;
    net.trainparam.show=200;
    %初始化网络
    net=init(net);
    %Elman网络训练
    net=train(net,p_train,t_train);
    % 预测数据
    y(i,:)=sim(net,p_test);
    % 计算绝对误差
    error(i,:)=y(i,:)-t_test;
end

%观察网络在不同隐藏层神经元个数时的预测绝对误差
figure(1)
plot(1:3,error(1,:),'-ro','linewidth',2);
hold on;
plot(1:3,error(2,:),'b:x','linewidth',2);
hold on;
plot(1:3,error(3,:),'k-.s','linewidth',2);
hold on;
plot(1:3,error(4,:),'c--d','linewidth',2);
title('Elman预测误差图')
set(gca,'Xtick',[1:3])
legend('5','10','15','20','location','best')
xlabel('预测时间点')
ylabel('不同神经元网络预测的绝对误差')
hold off;
figure(2)
plot(1:3,y(1,:),'-ro','linewidth',2);
hold on;
plot(1:3,y(2,:),'b:x','linewidth',2);
hold on;
plot(1:3,y(3,:),'k-.s','linewidth',2);
hold on;
plot(1:3,y(4,:),'c--d','linewidth',2);
title('Elman预测结果图')
set(gca,'Xtick',[1:3])
legend('5','10','15','20','location','best')
xlabel('预测时间点')
ylabel('不同神经元网络预测的绝对误差')
hold off;

%计算相对误差
for i=1:4
    average(i)=(abs(error(i,1))+abs(error(i,2))+abs(error(i,3)))/3;
end

%绘制不同神经元个数时网络预测一天3个时间点的平均误差
figure(3)
plot(5:5:20,average,'k-.s','linewidth',2)
xlabel('建立网络的神经元个数')
ylabel('不同神经元网络预测的平均误差')
hold off;

 

猜你喜欢

转载自blog.csdn.net/qq_45013535/article/details/131489697