【预测模型】基于狼群算法优化BP神经网络实现预测matlab源码

107 阅读8分钟

一、简介

狼群算法
1 狼群算法中的狼种类分为以下几种:
头狼、探狼、猛狼。

2 猎物分配规则:论功行赏,先强后弱。

3 狼群算法的主体构成:探狼游走、头狼召唤、猛狼围攻3种智能行为,“胜者为王”的头狼角逐规则和“优胜劣汰”的狼群更新规则。
Step1:在解空间中随机初始化狼群的空间坐标,依据目标函数值的大小角逐出人工头狼。
Step2:探狼开始随机游走搜索猎物,若发现某个位置的目标函数值大于头狼的目标函数值,将更新头狼位置,同时头狼发出召唤行为;若未发现,探狼继续游走直到达到最大游走次数,头狼在原本的位置发出召唤行为。
Step3:听到头狼召唤的猛狼以较大的步长快速向头狼奔袭,若奔袭途中猛狼的目标函数值大于头狼的目标函数值,则将对头狼位置进行更新;否则,猛狼将继续奔袭直到进入围攻范围。
Step4:靠近头狼的猛狼将联合探狼对猎物(把头狼位置视为猎物)进行围捕,围捕过程中若其他人工狼的目标函数值大于头狼的目标函数值,则对头狼位置进行更新,直到捕获猎物。
Step5:淘汰狼群中目标函数值较小的人工狼,并在解空间中随机生成新的人工狼,实现狼群的更新。
Step6:最后判断头狼的目标函数值是否达到精度要求或算法是否达到最大迭代次数。

4 人工狼群算法的若干规则:
4.1 头狼产生规则
初始解空间中,具有最优目标函数值的人工狼即为头狼;在迭代过程中,将每次迭代后最优狼的目标函数值与前一代中头狼的值进行比较,若更优则对头狼位置进行更新,若此时存在多匹的情况,则随机选一匹成为头狼。头狼不执行3种智能行为,直接进入迭代,直到被其他更强的人工狼代替。
4.2 游走行为
在这里插入图片描述
在这里插入图片描述
5 人工狼群算法的具体步骤:
在这里插入图片描述
6 BP神经网络的结构与数学原理
此节的内容 极!其!重!要!但是要涉及到一些数学,所以我尽量用人话去跟大家细细解释,并且结合实例来给大家进行一下分析。
在这里插入图片描述
在这里插入图片描述
这里一共是 11 组数据(数据量很少),很明显 y 是关于 x1,x2,x3 的三元函数,通常情况下,想要通过一套固定的套路来拟合出一个三元函数的关系式,是一件很复杂的事。而实际问题中的参数往往不止三个,可能成千上百,也就是说 决定 y 的参数会有很多,这样的问题更是复杂的很,用常规的方法去拟合,几乎不可能,那么换一种思路,用 Bp神经网络的方法来试一下。

根据上表给出的条件和问题,我们先来分析一下。首先,我们的输入信息是 3 个参数,x1,x2,x3 。输出结果是 1 个数 y 。那么可以画一个这样的关系网路图(直接手画了,凑合看吧···):

在这里插入图片描述
在这个网络中,输入层(input )有三个节点(因为有三个参数),隐藏层(hidden )先不表示,输出层(output )有1个节点(因为我们要的结果只有一个 y )。那么关键的问题来了,如何进行这一通操作,它的结构究竟是怎样的?

6.1 正向传播
正向传播就是让信息从输入层进入网络,依次经过每一层的计算,得到最终输出层结果的过程。
我直接把设计好的结构图给大家画出来,然后再一点一点地解释。结构如下:

在这里插入图片描述
看到这儿你可能会有点懵,不过不要紧,一步一步来分析。先来看网络的结构,输入层(input )没有变,还是三个节点。输出层(input )也没有变。重点看隐藏层(hidden ),就是图中红色虚线框起的部分,这里我设计了一个隐藏层为两层的网络,hidden_1和hidden_2 ,每层的节点为 2 个,至于为什么是两层,节点数为什么是 2 两个 ,这里你只需要知道,实验证明,解决这个问题,这样的网络就够用了。具体的一会儿讲。

关键看一下连线代表的意义,和计算过程。可以从图上看到,每层的节点都与下一层的每个节点有一一对应的连线,每条连线代表一个权重,这里你可以把它理解为信息传输的一条通路,但是每条路的宽度是不一样的,每条通路的宽度由该通道的参数,也就是该通路的权重来决定。为了说明这个问题,拿一个节点的计算过程来进行说明,看下图:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
图像来自百度百科,可以看到sigmoid函数能够将函数限制在 0到1 的范围之内。
这里还要进行一下说明,sigmoid 是最早使用的激励函数,实际上还有更多种类的激励函数 ,比如 Relu ,tanh 等等,性质和表达式各有不同,以后再说,这里先用 sigmoid 来说明。
如果说看到这儿,你对 激励函数 这个概念还是不太懂的话 ,没关系,可以假装自己明白了,你就知道这个东西很有用,里面必有道道就行了,以后慢慢体会,慢慢理解,就行了。接着往下看。
刚刚解释了一个节点的计算过程,那么其他节点也就可以举一反三,一一计算出来。现在我们来简化一下网络。我们可以把x1,x2,x3作为一个向量 [x1,x2,x3] ,权重矩阵 u 也作为一个 3x2 的矩阵 ,w 作为一个 2x2 的矩阵 ,v作为一个 2x1 的矩阵,三个矩阵如下:
在这里插入图片描述
可以看到这三个矩阵与网络中的结构图中是一一对应的。下面我们把隐藏层与输出层也写成矩阵的形式:
在这里插入图片描述
可以看到这两层隐藏层(hidden)的输入Hi 与 Ho 均为 1x2 的矩阵,输出层(output )为 1x1 的矩阵。下面就可以把网络简化为下面的结构:
在这里插入图片描述
根据我们刚才讲过的每个节点的计算方法,以及我们简化后的网络,则可以将整个计算过程等效的化为以下几个矩阵相城的步骤(矩阵相乘是怎么会回事,请复习线性代数…):

注意:下式中,除sigmoid代表激励函数以外,其余各个符号都代表一个矩阵(或者向量),而非常数,乘积符号“ x ”代表常规的矩阵乘法计算。
在这里插入图片描述
6.2 反向传播
那么有正向传播,就必须得有反向传播,下面来讲一下 反向传播 的过程。首先明确一点,反向传播的信息是什么,不卖关子,直接给答案,反向传播的信息是误差,也就是 输出层(output )的结果 与 输入信息 x 对应的真实结果 之间的差距(表达能力比较差,画个图说明…)。
拿出上文的数据表中的第一组数据 x1 = 1,x2=1,x3=2,y=2 为例。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
6.3 网络的训练
通过一次正向传播,和一次反向传播,我们就可以将网络的参数更新一次,所谓训练网络,就是让正向传播和反向传播不断的往复进行,不断地更新网络的参数,最终使网络能够逼近真实的关系。

理论上,只要网络的层数足够深,节点数足够多,可以逼近任何一个函数关系。但是这比较考验你的电脑性能,事实上,利用 Bp 网络,能够处理的数据其实还是有限的,比如 Bp 网络在图像数据的识别和分类问题中的表现是很有限的。但是这并不影响 Bp 网络是一种高明的策略,它的出现也为后来的 AI 技术做了重要的铺垫

二、源代码

%% 改进WPA-BP神经网络
%% 清空环境
clear all;
close all;
clc;
data=xlsread('Test.xlsx','Sheet1','A2:G46');%读取数据
[M,NN]=size(data);%M是样本数,N是变量数
inputn=data(:,1:NN-1)';%训练样本输入
outputn=data(:,NN)';%训练样本输出
%节点个数
inputnum=NN-1;%输入个数
hiddennum=12;%隐藏层
outputnum=1;%输出个数
%构建网络
net=newff(inputn,outputn,hiddennum);
%% 狼群算法参数设置
tic
 
time = toc;
disp(['用时=  ',num2str(time)])
x=zbest;
%% 把最优初始阀值权值赋予网络预测
 
 
%% BP网络训练
%网络进化参数
net.trainParam.epochs=100;%bp神经网络的代数
net.trainParam.lr=0.1;
%net.trainParam.goal=0.00001;
 
%网络训练
[net,per2]=train(net,inputn,outputn);
%% BP网络预测
% load data inputn_test output_test
inputn_test=inputn;%测试数据输入
output_test=outputn;%测试数据输出
an=sim(net,inputn_test);%预测
error=(an-output_test);%误差
error_xiangdui=(an-output_test)./output_test;%相对误差
figure(1)
plot(error_xiangdui,'ko-')
ylabel('相对误差值')
title('狼群优化BP神经网络')
figure(2)
plot(error,'ro-')
ylabel('误差值')
title('狼群优化BP神经网络')
figure(3)
plot(output_test,'r + -');
hold on;
plot(an,'b * -')
hold off
legend('真实值','预测值');
title('狼群优化BP神经网络')

三、运行结果

在这里插入图片描述