欢迎光临散文网 会员登陆 & 注册

【预测模型】基于差分进化算法优化BP神经网络实现数据预测matlab源码

2021-09-20 17:13 作者:Matlab工程师  | 我要投稿

1 算法介绍

说明:1.1节主要是概括和帮助理解考虑影响因素的BP神经网络算法原理,即常规的BP模型训练原理讲解(可根据自身掌握的知识是否跳过)。1.2节开始讲基于历史值影响的BP神经网络预测模型。

使用BP神经网络进行预测时,从考虑的输入指标角度,主要有两类模型:



1.1 受相关指标影响的BP神经网络算法原理

如图一所示,使用MATLAB的newff函数训练BP时,可以看到大部分情况是三层的神经网络(即输入层,隐含层,输出层)。这里帮助理解下神经网络原理:
1)输入层:相当于人的五官,五官获取外部信息,对应神经网络模型input端口接收输入数据的过程。
2)隐含层:对应人的大脑,大脑对五官传递来的数据进行分析和思考,神经网络的隐含层hidden Layer对输入层传来的数据x进行映射,简单理解为一个公式hiddenLayer_output=F(w*x+b)。其中,w、b叫做权重、阈值参数,F()为映射规则,也叫激活函数,hiddenLayer_output是隐含层对于传来的数据映射的输出值。换句话说,隐含层对于输入的影响因素数据x进行了映射,产生了映射值。
3)输出层:可以对应为人的四肢,大脑对五官传来的信息经过思考(隐含层映射)之后,再控制四肢执行动作(向外部作出响应)。类似地,BP神经网络的输出层对hiddenLayer_output再次进行映射,outputLayer_output=w *hiddenLayer_output+b。其中,w、b为权重、阈值参数,outputLayer_output是神经网络输出层的输出值(也叫仿真值、预测值)(理解为,人脑对外的执行动作,比如婴儿拍打桌子)。
4)梯度下降算法:通过计算outputLayer_output和神经网络模型传入的y值之间的偏差,使用算法来相应调整权重和阈值等参数。这个过程,可以理解为婴儿拍打桌子,打偏了,根据偏离的距离远近,来调整身体使得再次挥动的胳膊不断靠近桌子,最终打中。

再举个例子来加深理解:

图一所示BP神经网络,具备输入层、隐含层和输出层。BP是如何通过这三层结构来实现输出层的输出值outputLayer_output,不断逼近给定的y值,从而训练得到一个精准的模型的呢?

从图中串起来的端口,可以想到一个过程:坐地铁,将图一想象为一条地铁线路。王某某坐地铁回家的一天:在input起点站上车,中途经过了很多站(hiddenLayer),然后发现坐过头了(outputLayer对应现在的位置),那么王某某将会根据现在的位置离家(目标Target)的距离(误差Error),返回到中途的地铁站(hiddenLayer)重新坐地铁(误差反向传递,使用梯度下降算法更新w和b),如果王某某又一次发生失误,那么将再次进行这个调整的过程。

从在婴儿拍打桌子和王某某坐地铁的例子中,思考问题:BP的完整训练,需要先传入数据给input,再经过隐含层的映射,输出层得到BP仿真值,根据仿真值与目标值的误差,来调整参数,使得仿真值不断逼近目标值。比如(1)婴儿受到了外界的干扰因素(x),从而作出反应拍桌(predict),大脑不断的调整胳膊位置,控制四肢拍准(y、Target)。(2)王某某上车点(x),过站点(predict),不断返回中途站来调整位置,到家(y、Target)。

在这些环节中,涉及了影响因素数据x,目标值数据y(Target)。根据x,y,使用BP算法来寻求x与y之间存在的规律,实现由x来映射逼近y,这就是BP神经网络算法的作用。再多说一句,上述讲的过程,都是BP模型训练,那么最终得到的模型虽然训练准确,但是找到的规律(bp network)是否准确与可靠呢。于是,我们再给x1到训练好的bp network中,得到相应的BP输出值(预测值)predict1,通过作图,计算Mse,Mape,R方等指标,来对比predict1和y1的接近程度,就可以知道模型是否预测准确。这是BP模型的测试过程,即实现对数据的预测,并且对比实际值检验预测是否准确。

在这里插入图片描述


图一 3层BP神经网络结构图

1.2 基于历史值影响的BP神经网络

以电力负荷预测问题为例,进行两种模型的区分。在预测某个时间段内的电力负荷时:

一种做法,是考虑 t 时刻的气候因素指标,比如该时刻的空气湿度x1,温度x2,以及节假日x3等的影响,对 t 时刻的负荷值进行预测。这是前面1.1所说的模型。

另一种做法,是认为电力负荷值的变化,与时间相关,比如认为t-1,t-2,t-3时刻的电力负荷值与t时刻的负荷值有关系,即满足公式y(t)=F(y(t-1),y(t-2),y(t-3))。采用BP神经网络进行训练模型时,则输入到神经网络的影响因素值为历史负荷值y(t-1),y(t-2),y(t-3),特别地,3叫做自回归阶数或者延迟。给到神经网络中的目标输出值为y(t)。

 1.3 差分进化算法

Differential Evolution(DE)是由Storn等人于1995年提出的,和其它演化算法一样,DE是一种模拟生物进化的随机模型,通过反复迭代,使得那些适应环境的个体被保存了下来。但相比于进化算法,DE保留了基于种群的全局搜索策略,采用实数编码、基于差分的简单变异操作和一对一的竞争生存策略,降低了遗传操作的复杂性。同时,DE特有的记忆能力使其可以动态跟踪当前的搜索情况,以调整其搜索策略,具有较强的全局收敛能力和鲁棒性,且不需要借助问题的特征信息,适于求解一些利用常规的数学规划方法所无法求解的复杂环境中的优化问题。目前,DE已经在许多领域得到了应用,譬如人工神经元网络、化工、电力、机械设计、机器人、信号处理、生物信息、经济学、现代农业、食品安全、环境保护和运筹学等。

DE 算法主要用于求解连续变量的全局优化问题,其主要工作步骤与其他进化算法基本一致,主要包括变异(Mutation)、交叉(Crossover)、选择(Selection)三种操作。算法的基本思想是从某一随机产生的初始群体开始,利用从种群中随机选取的两个个体的差向量作为第三个个体的随机变化源,将差向量加权后按照一定的规则与第三个个体求和而产生变异个体,该操作称为变异。然后,变异个体与某个预先决定的目标个体进行参数混合,生成试验个体,这一过程称之为交叉。如果试验个体的适应度值优于目标个体的适应度值,则在下一代中试验个体取代目标个体,否则目标个体仍保存下来,该操作称为选择。在每一代的进化过程中,每一个体矢量作为目标个体一次,算法通过不断地迭代计算,保留优良个体,淘汰劣质个体,引导搜索过程向全局最优解逼近。

算法图解:

算法伪代码:

2 部分代码

%% 差分进化算法应用于优化BP神经网络的初始权值和阈值 %% 清空环境变量 clear all; clc; warning off load v357; load y357; Pn_train=v; Tn_train=y; Pn_test=v; Tn_test=y; P_train=v; T_train=y; % P_train=[0 25.27 44 62.72 81.4 100.2; %     290.5 268.8 247.2 224.5 206 184.4; %     0 16.12 33.25 50.42 67.62 84.73; %     542.5 517.8 493 465.3 435.6 410.8; %     0 11.1 28.1 44.93 61.38 78.57; %     826.1 800.2 769.1 740.0 706.2 669.3]; % T_train=[0 1 2 3 4 5];%以上是未处理的数据 %  P_test=[0 25.25 43 62.75 81.6 100.7; %     290.3 268.4 247.5 224.6 206 184.2; %     0 16.14 33.26 50.47 67.68 84.79; %     542.7 517.9 495 465.8 435.6 410.9; %     0 11.4 28.6 44.94 61.36 78.59; %     826.3 800.7 769.8 740.5 706.7 669.3]; % T_test=[0 1 2 3 4 5]; % Pn_train=[0 0.252 0.439 0.626 0.813 1 0 0.19 0.392 0.595 0.798 1 0 0.141 0.358 0.572 0.781 1; %           1 0.795 0.592 0.378 0.204 0 1 0.815 0.626 0.415 0.189 0 1 0.835 0.637 0.451 0.235 0]; % %T 为目标矢量 ,归一化后的数据 % Tn_train=[0.05,0.23,0.41,0.59,0.77,0.95,0.05,0.23,0.41,0.59,0.77,0.95,0.05,0.23,0.41,0.59,0.77,0.95]; % Pn_test=[ 0 0.17 0.39 0.595 0.798 1 0 0.141 0.358 0.572 0.781 1 0 0.258 0.439 0.626 0.813 1; %          1 0.815 0.625 0.415 0.189 0 1 0.835 0.635 0.451 0.235 0 1 0.795 0.599 0.378 0.204 0 ]; % Tn_test=[0.05,0.23,0.41,0.59,0.77,0.95,0.05,0.23,0.41,0.59,0.77,0.95,0.05,0.23,0.41,0.59,0.77,0.95]; %% 参数设置 S1 = size(Pn_train,1);              % 输入层神经元个数 S2 = 6;                            % 隐含层神经元个数 S3 = size(Tn_train,1);              % 输出层神经元个数 Gm=10;    %最大迭代次数 F0=0.5;      %F为缩放因子 Np=5; %种群规模 CR=0.5;  %杂交参数 G=1;%初始化代数 N=S1*S2 + S2*S3 + S2 + S3;%所求问题的维数 % 设置网络初始权值和阈值 net_optimized.IW{1,1} = W1; net_optimized.LW{2,1} = W2; net_optimized.b{1} = B1; net_optimized.b{2} = B2; % 设置训练参数 net_optimized.trainParam.epochs = 3000; net_optimized.trainParam.show = 100; net_optimized.trainParam.goal = 0.001; net_optimized.trainParam.lr = 0.1; % 利用新的权值和阈值进行训练 net_optimized = train(net_optimized,Pn_train,Tn_train); %% 仿真测试 Tn_sim_optimized = sim(net_optimized,Pn_test);     % 结果对比 result_optimized = [Tn_test' Tn_sim_optimized']; %均方误差 E_optimized = mse(Tn_sim_optimized - Tn_test) MAPE_optimized = mean(abs(Tn_sim_optimized-Tn_test)./Tn_sim_optimized)*100 % figure(1) % % plot(T_train,P_train(1,:),'r') % hold on % plot(T_train,P_train(3,:),'y') % hold on % plot(T_train,P_train(5,:),'b') % hold on % grid on % xlabel('标准设备的约定真值(10KP)'); %  ylabel('压力传感器的输出(mv)'); %  title('压力传感器的工作曲线'); %  legend('t=22','t=44','t=70'); figure(2) plot(Tn_train(1:6),Pn_train(1,1:6),'r') hold on plot(Tn_train(7:12),Pn_train(1,7:12),'y') hold on plot(Tn_train(13:18),Pn_train(1,13:18),'b') hold on grid on xlabel('设备约定真值(10KP)'); ylabel('压力传感器的输出(mv)'); title('归一化后的训练样本压力传感器的工作曲线'); legend('t=22','t=44','t=70'); figure(3) plot(Tn_test(1:6),Pn_test(1,1:6),'r') hold on plot(Tn_test(7:12),Pn_test(1,7:12),'y') hold on plot(Tn_test(13:18),Pn_test(1,13:18),'b') hold on grid on xlabel('设备约定真值(10KP)'); ylabel('压力传感器的输出(mv)'); title('归一化后的测试样本压力传感器的工作曲线'); legend('t=22','t=44','t=70'); figure(4) plot(Tn_test(1:6),Tn_sim_optimized(1:6),'r')%输出DE-BP仿真结果的曲线 hold on plot(Tn_test(7:12),Tn_sim_optimized(7:12),'y') hold on plot(Tn_test(13:18),Tn_sim_optimized(13:18),'b') hold on xlabel('约定真值(10KP)'); ylabel('压力传感器的输出(mv)'); title('DE-BP的压力传感器的工作曲线'); legend('t=22','t=44','t=70'); grid on %% 未优化的BP神经网络 %net = newff(Pn_train,Tn_train,S2); net=newff(minmax(Pn_train),[6,1],{'logsig','purelin'},'traingdm');%隐含层神经元S型正切,输出层S型对数,动量梯度下降法训练BP网络, % 设置训练参数 net.trainParam.epochs = 3000; net.trainParam.show = 100; net.trainParam.goal = 0.001; net.trainParam.lr = 0.1; net=init(net); inputWeights=net.IW{1,1};% 当前输入层权值和阈值 inputbias=net.b{1}; layerWeights=net.LW{2,1};% 当前网络层权值和阈值 layerbias=net.b{2} % 利用新的权值和阈值进行训练 net = train(net,Pn_train,Tn_train); %% 仿真测试 Tn_sim = sim(net,Pn_test);     %% 结果对比 result = [Tn_test' Tn_sim']; % 均方误差 E1 = mse(Tn_sim - Tn_test) MAPE1= mean(abs(Tn_sim-Tn_test)./Tn_sim)*100 % end % figure(4) % plot(T_train,P_train(1,:),'r') % hold on % plot(T_train,P_train(3,:),'y') % hold on % plot(T_train,P_train(5,:),'b') % hold on % grid on % xlabel('标准设备的约定真值(10KP)'); %  ylabel('压力传感器的输出(mv)'); %  title('压力传感器的工作曲线'); %  legend('t=22','t=44','t=70'); figure(5) plot(Tn_test(1:6),Tn_sim(1:6),'r')%输出BP仿真结果的曲线 hold on plot(Tn_test(7:12),Tn_sim(7:12),'y') hold on plot(Tn_test(13:18),Tn_sim(13:18),'b') hold on xlabel('约定真值(10KP)'); ylabel('压力传感器的输出(mv)'); title('BP的压力传感器的工作曲线'); legend('t=22','t=44','t=70'); grid on

3 仿真结果

 

4 参考文献

[1]牛庆,曹爱民,陈潇一,周冬.基于花朵授粉算法和BP神经网络的短期负荷预测[J].电网与清洁能源,2020,36(10):28-32.



【预测模型】基于差分进化算法优化BP神经网络实现数据预测matlab源码的评论 (共 条)

分享到微博请遵守国家法律