一、粒子群算法简介

1 粒子群算法简介
1.1 粒子群算法的概念

粒子群优化算法(PSO:Particle swarm optimization) 是一种进化计算技术(evolutionary computation)。源于对鸟群捕食的行为研究。粒子群优化算法的基本思想:是通过群体中个体之间的协作和信息共享来寻找最优解.

PSO的优势:在于简单容易实现并且没有许多参数的调节。目前已被广泛应用于函数优化、神经网络训练、模糊系统控制以及其他遗传算法的应用领域。

1.2 粒子群算法分析

1.2.1基本思想

粒子群算法通过设计一种无质量的粒子来模拟鸟群中的鸟,粒子仅具有两个属性:速度和位置,速度代表移动的快慢,位置代表移动的方向。每个粒子在搜索空间中单独的搜寻最优解,并将其记为当前个体极值,并将个体极值与整个粒子群里的其他粒子共享,找到最优的那个个体极值作为整个粒子群的当前全局最优解,粒子群中的所有粒子根据自己找到的当前个体极值和整个粒子群共享的当前全局最优解来调整自己的速度和位置。下面的动图很形象地展示了PSO算法的过程:

【风电功率预测】基于matlab粒子群算法优化BP神经网络风电功率预测【含Matlab源码 347期】_迭代

1.2.2 更新规则

PSO初始化为一群随机粒子(随机解)。然后通过迭代找到最优解。在每一次的迭代中,粒子通过跟踪两个“极值”(pbest,gbest)来更新自己。在找到这两个最优值后,粒子通过下面的公式来更新自己的速度和位置。

【风电功率预测】基于matlab粒子群算法优化BP神经网络风电功率预测【含Matlab源码 347期】_算法_02

公式(1)的第一部分称为【记忆项】,表示上次速度大小和方向的影响;公式(1)的第二部分称为【自身认知项】,是从当前点指向粒子自身最好点的一个矢量,表示粒子的动作来源于自己经验的部分;公式(1)的第三部分称为【群体认知项】,是一个从当前点指向种群最好点的矢量,反映了粒子间的协同合作和知识共享。粒子就是通过自己的经验和同伴中最好的经验来决定下一步的运动。以上面两个公式为基础,形成了PSO的标准形式。

【风电功率预测】基于matlab粒子群算法优化BP神经网络风电功率预测【含Matlab源码 347期】_权值_03

公式(2)和 公式(3)被视为标准PSO算法。

1.2.3 PSO算法的流程和伪代码

【风电功率预测】基于matlab粒子群算法优化BP神经网络风电功率预测【含Matlab源码 347期】_算法_04

二、BP神经网络简介

1 BP神经网络概述

BP(Back Propagation)神经网络是1986年由Rumelhart和McCelland为首的科研小组提出,参见他们发表在Nature上的论文 Learning representations by back-propagating errors 。

BP神经网络是一种按误差逆传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一。BP网络能学习和存贮大量的 输入-输出模式映射关系,而无需事前揭示描述这种映射关系的数学方程。它的学习规则是使用最速下降法,通过反向传播来不断 调整网络的权值和阈值,使网络的误差平方和最小。

2 BP算法的基本思想

上一次我们说到,多层感知器在如何获取隐层的权值的问题上遇到了瓶颈。既然我们无法直接得到隐层的权值,能否先通过输出层得到输出结果和期望输出的误差来间接调整隐层的权值呢?BP算法就是采用这样的思想设计出来的算法,它的基本思想是,学习过程由信号的正向传播与误差的反向传播两个过程组成。

正向传播时,输入样本从输入层传入,经各隐层逐层处理后,传向输出层。若输出层的实际输出与期望的输出(教师信号)不符,则转入误差的反向传播阶段。

反向传播时,将输出以某种形式通过隐层向输入层逐层反传,并将误差分摊给各层的所有单元,从而获得各层单元的误差信号,此误差信号即作为修正各单元权值的依据。这两个过程的具体流程会在后文介绍。

BP算法的信号流向图如下图所示

【风电功率预测】基于matlab粒子群算法优化BP神经网络风电功率预测【含Matlab源码 347期】_权值_05

3 BP网络特性分析——BP三要素

我们分析一个ANN时,通常都是从它的三要素入手,即

1)网络拓扑结构;

2)传递函数;

3)学习算法。

【风电功率预测】基于matlab粒子群算法优化BP神经网络风电功率预测【含Matlab源码 347期】_神经网络_06

每一个要素的特性加起来就决定了这个ANN的功能特性。所以,我们也从这三要素入手对BP网络的研究。

3.1 BP网络的拓扑结构

上一次已经说了,BP网络实际上就是多层感知器,因此它的拓扑结构和多层感知器的拓扑结构相同。由于单隐层(三层)感知器已经能够解决简单的非线性问题,因此应用最为普遍。三层感知器的拓扑结构如下图所示。

一个最简单的三层BP:

【风电功率预测】基于matlab粒子群算法优化BP神经网络风电功率预测【含Matlab源码 347期】_算法_07

3.2 BP网络的传递函数

BP网络采用的传递函数是非线性变换函数——Sigmoid函数(又称S函数)。其特点是函数本身及其导数都是连续的,因而在处理上十分方便。为什么要选择这个函数,等下在介绍BP网络的学习算法的时候会进行进一步的介绍。

单极性S型函数曲线如下图所示。

【风电功率预测】基于matlab粒子群算法优化BP神经网络风电功率预测【含Matlab源码 347期】_权值_08

双极性S型函数曲线如下图所示。

【风电功率预测】基于matlab粒子群算法优化BP神经网络风电功率预测【含Matlab源码 347期】_迭代_09

3.3 BP网络的学习算法

BP网络的学习算法就是BP算法,又叫 δ 算法(在ANN的学习过程中我们会发现不少具有多个名称的术语), 以三层感知器为例,当网络输出与期望输出不等时,存在输出误差 E ,定义如下

【风电功率预测】基于matlab粒子群算法优化BP神经网络风电功率预测【含Matlab源码 347期】_神经网络_10

【风电功率预测】基于matlab粒子群算法优化BP神经网络风电功率预测【含Matlab源码 347期】_matlab_11

【风电功率预测】基于matlab粒子群算法优化BP神经网络风电功率预测【含Matlab源码 347期】_算法_12

【风电功率预测】基于matlab粒子群算法优化BP神经网络风电功率预测【含Matlab源码 347期】_权值_13

下面我们会介绍BP网络的学习训练的具体过程。

4 BP网络的训练分解

训练一个BP神经网络,实际上就是调整网络的权重和偏置这两个参数,BP神经网络的训练过程分两部分:

前向传输,逐层波浪式的传递输出值;

逆向反馈,反向逐层调整权重和偏置;

我们先来看前向传输。

前向传输(Feed-Forward前向反馈)

在训练网络之前,我们需要随机初始化权重和偏置,对每一个权重取[ − 1 , 1 ] [-1,1][−1,1]的一个随机实数,每一个偏置取[ 0 , 1 ] [0,1][0,1]的一个随机实数,之后就开始进行前向传输。

神经网络的训练是由多趟迭代完成的,每一趟迭代都使用训练集的所有记录,而每一次训练网络只使用一条记录,抽象的描述如下:

while 终止条件未满足:
for record:dataset:
trainModel(record)

【风电功率预测】基于matlab粒子群算法优化BP神经网络风电功率预测【含Matlab源码 347期】_神经网络_14

【风电功率预测】基于matlab粒子群算法优化BP神经网络风电功率预测【含Matlab源码 347期】_matlab_15

4.1 逆向反馈(Backpropagation)

【风电功率预测】基于matlab粒子群算法优化BP神经网络风电功率预测【含Matlab源码 347期】_神经网络_16

【风电功率预测】基于matlab粒子群算法优化BP神经网络风电功率预测【含Matlab源码 347期】_权值_17

4.2 训练终止条件

每一轮训练都使用数据集的所有记录,但什么时候停止,停止条件有下面两种:

设置最大迭代次数,比如使用数据集迭代100次后停止训练

计算训练集在网络上的预测准确率,达到一定门限值后停止训练

5 BP网络运行的具体流程

5.1 网络结构

输入层有n nn个神经元,隐含层有p pp个神经元,输出层有q qq个神经元。

5.2 变量定义

【风电功率预测】基于matlab粒子群算法优化BP神经网络风电功率预测【含Matlab源码 347期】_matlab_18

【风电功率预测】基于matlab粒子群算法优化BP神经网络风电功率预测【含Matlab源码 347期】_神经网络_19

【风电功率预测】基于matlab粒子群算法优化BP神经网络风电功率预测【含Matlab源码 347期】_迭代_20

【风电功率预测】基于matlab粒子群算法优化BP神经网络风电功率预测【含Matlab源码 347期】_迭代_21

【风电功率预测】基于matlab粒子群算法优化BP神经网络风电功率预测【含Matlab源码 347期】_算法_22

【风电功率预测】基于matlab粒子群算法优化BP神经网络风电功率预测【含Matlab源码 347期】_matlab_23

【风电功率预测】基于matlab粒子群算法优化BP神经网络风电功率预测【含Matlab源码 347期】_神经网络_24

【风电功率预测】基于matlab粒子群算法优化BP神经网络风电功率预测【含Matlab源码 347期】_神经网络_25

第九步:判断模型合理性

判断网络误差是否满足要求。

当误差达到预设精度或者学习次数大于设计的最大次数,则结束算法。

否则,选取下一个学习样本以及对应的输出期望,返回第三部,进入下一轮学习。

6 BP网络的设计

在进行BP网络的设计是,一般应从网络的层数、每层中的神经元个数和激活函数、初始值以及学习速率等几个方面来进行考虑,下面是一些选取的原则。

6.1 网络的层数

理论已经证明,具有偏差和至少一个S型隐层加上一个线性输出层的网络,能够逼近任何有理函数,增加层数可以进一步降低误差,提高精度,但同时也是网络 复杂化。另外不能用仅具有非线性激活函数的单层网络来解决问题,因为能用单层网络解决的问题,用自适应线性网络也一定能解决,而且自适应线性网络的 运算速度更快,而对于只能用非线性函数解决的问题,单层精度又不够高,也只有增加层数才能达到期望的结果。

6.2 隐层神经元的个数

网络训练精度的提高,可以通过采用一个隐含层,而增加其神经元个数的方法来获得,这在结构实现上要比增加网络层数简单得多。一般而言,我们用精度和 训练网络的时间来恒量一个神经网络设计的好坏:

(1)神经元数太少时,网络不能很好的学习,训练迭代的次数也比较多,训练精度也不高。

(2)神经元数太多时,网络的功能越强大,精确度也更高,训练迭代的次数也大,可能会出现过拟合(over fitting)现象。

由此,我们得到神经网络隐层神经元个数的选取原则是:在能够解决问题的前提下,再加上一两个神经元,以加快误差下降速度即可。

6.3 初始权值的选取

一般初始权值是取值在(−1,1)之间的随机数。另外威得罗等人在分析了两层网络是如何对一个函数进行训练后,提出选择初始权值量级为s√r的策略, 其中r为输入个数,s为第一层神经元个数。

6.4 学习速率

学习速率一般选取为0.01−0.8,大的学习速率可能导致系统的不稳定,但小的学习速率导致收敛太慢,需要较长的训练时间。对于较复杂的网络, 在误差曲面的不同位置可能需要不同的学习速率,为了减少寻找学习速率的训练次数及时间,比较合适的方法是采用变化的自适应学习速率,使网络在 不同的阶段设置不同大小的学习速率。

6.5 期望误差的选取

在设计网络的过程中,期望误差值也应当通过对比训练后确定一个合适的值,这个合适的值是相对于所需要的隐层节点数来确定的。一般情况下,可以同时对两个不同 的期望误差值的网络进行训练,最后通过综合因素来确定其中一个网络。

7 BP网络的局限性

BP网络具有以下的几个问题:

(1)需要较长的训练时间:这主要是由于学习速率太小所造成的,可采用变化的或自适应的学习速率来加以改进。

(2)完全不能训练:这主要表现在网络的麻痹上,通常为了避免这种情况的产生,一是选取较小的初始权值,而是采用较小的学习速率。

(3)局部最小值:这里采用的梯度下降法可能收敛到局部最小值,采用多层网络或较多的神经元,有可能得到更好的结果。

8 BP网络的改进

P算法改进的主要目标是加快训练速度,避免陷入局部极小值等,常见的改进方法有带动量因子算法、自适应学习速率、变化的学习速率以及作用函数后缩法等。 动量因子法的基本思想是在反向传播的基础上,在每一个权值的变化上加上一项正比于前次权值变化的值,并根据反向传播法来产生新的权值变化。而自适应学习 速率的方法则是针对一些特定的问题的。改变学习速率的方法的原则是,若连续几次迭代中,若目标函数对某个权倒数的符号相同,则这个权的学习速率增加, 反之若符号相反则减小它的学习速率。而作用函数后缩法则是将作用函数进行平移,即加上一个常数。

二、部分源代码

% function psobp 
% BP neural network trained by PSO algorithm
% Copyright by Deng Da-Peng @ 2005
% Email: rexdeng@163.com
% You can change and distribute this code freely for academic usage
% Business usage is strictly prohibited
% 清空环境变量
close all
clc
clear
% AllSamIn=input_train; % Add your all input data
% AllSamOut=output_train; % Add your all output data
%
% % Pre-processing data with premnmx, you can use other functions
% global minAllSamOut;
% global maxAllSamOut;
% [AllSamInn,minAllSamIn,maxAllSamIn,AllSamOutn,minAllSamOut,maxAllSamOut] = premnmx(AllSamIn,AllSamOut);
% % draw 10 percent from all samples as testing samples,the rest as training samples
% i=[10:10:1000];
% TestSamIn=[];
% TestSamOut=[];
% for j=1:100
% TestSamIn=[TestSamIn,AllSamInn(:,i(j))];
% TestSamOut=[TestSamOut,AllSamOutn(:,i(j))];
% end
% TargetOfTestSam=...; % add reall output of testing samples
% TrainSamIn=AllSamInn;
% TrainSamOut=AllSamOutn;
% TrainSamIn(:,i)=[];
% TrainSamOut(:,i)=[];
% % Evaluating Sample
% EvaSamIn=...
% EvaSamInn=tramnmx(EvaSamIn,minAllSamIn,maxAllSamIn); % preprocessing

%读取数据
load traindata1011 A O
load goontest inputtest_may16 outputtest_may16

%训练数据和预测数据
input_train=A(1:360,:)';
input_test=inputtest_may16(1:24,:)';
output_train=O(1:360)';
output_test=outputtest_may16(1:24)';

global minAllSamOut;
global maxAllSamOut;
[AllSamInn,minAllSamIn,maxAllSamIn,AllSamOutn,minAllSamOut,maxAllSamOut]=premnmx(input_train,output_train);

% Evaluating Sample
EvaSamIn=input_test;
EvaSamInn=tramnmx(EvaSamIn,minAllSamIn,maxAllSamIn); % preprocessing
% TargetOfTestSam=output_test; % add reall output of testing samples

global Ptrain;
Ptrain = input_train;
global Ttrain;
Ttrain = output_train;

% Ptest = input_train(:,350:360);
% Ttest = output_train(:,350:360);

% Initialize BPN parameters
global indim;
indim=4;
global hiddennum;
hiddennum=5;
global outdim;
outdim=1;

% Initialize PSO parameters
vmax=0.5; % Maximum velocity
minerr=0.001; % Minimum error
wmax=0.90;
wmin=0.30;
global itmax; %Maximum iteration number
itmax=200;
c1=2;
c2=2;
for iter=1:itmax
W(iter)=wmax-((wmax-wmin)/itmax)*iter; % weight declining linearly
end
% particles are initialized between (a,b) randomly
a=-1;
b=1;
%Between (m,n), (which can also be started from zero)
m=-1;
n=1;
global N; % number of particles
N=40;
global D; % length of particle
D=(indim+1)*hiddennum+(hiddennum+1)*outdim;
% Initialize positions of particles
rand('state',sum(100*clock));
X=a+(b-a)*rand(N,D,1); %取值范围[-1,1] rand * 2 - 1 ,rand 产生[0,1]之间的随机数

%Initialize velocities of particles
V=m+(n-m)*rand(N,D,1);

global fvrec;
MinFit=[];
BestFit=[];

%Function to be minimized, performance function,i.e.,mse of net work 神经网络建立
global net;
net=newff(minmax(Ptrain),[hiddennum,outdim],{'tansig','purelin'});
fitness=fitcal(X,net,indim,hiddennum,outdim,D,Ptrain,Ttrain,minAllSamOut,maxAllSamOut);
fvrec(:,1,1)=fitness(:,1,1);
[C,I]=min(fitness(:,1,1));
MinFit=[MinFit C];
BestFit=[BestFit C];
L(:,1,1)=fitness(:,1,1); %record the fitness of particle of every iterations
B(1,1,1)=C; %record the minimum fitness of particle
gbest(1,:,1)=X(I,:,1); %the global best x in population

%Matrix composed of gbest vector
for p=1:N
G(p,:,1)=gbest(1,:,1);
end
for i=1:N;
pbest(i,:,1)=X(i,:,1);
end
V(:,:,2)=W(1)*V(:,:,1)+c1*rand*(pbest(:,:,1)-X(:,:,1))+c2*rand*(G(:,:,1)-X(:,:,1));
%V(:,:,2)=cf*(W(1)*V(:,:,1)+c1*rand*(pbest(:,:,1)-X(:,:,1))+c2*rand*(G(:,:,1)-X(:,:,1)));
%V(:,:,2)=cf*(V(:,:,1)+c1*rand*(pbest(:,:,1)-X(:,:,1))+c2*rand*(G(:,:,1)-X(:,:,1)));
% limits velocity of particles by vmax
for ni=1:N
for di=1:D
if V(ni,di,2)>vmax
V(ni,di,2)=vmax;
elseif V(ni,di,2)<-vmax
V(ni,di,2)=-vmax;
else
V(ni,di,2)=V(ni,di,2);
end

三、运行结果

【风电功率预测】基于matlab粒子群算法优化BP神经网络风电功率预测【含Matlab源码 347期】_迭代_26

【风电功率预测】基于matlab粒子群算法优化BP神经网络风电功率预测【含Matlab源码 347期】_matlab_27

【风电功率预测】基于matlab粒子群算法优化BP神经网络风电功率预测【含Matlab源码 347期】_权值_28

四、matlab版本及参考文献

1 matlab版本

2014a

2 参考文献

[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.

[2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.

[3]周品.MATLAB 神经网络设计与应用[M].清华大学出版社,2013.

[4]陈明.MATLAB神经网络原理与实例精解[M].清华大学出版社,2013.

[5]方清城.MATLAB R2016a神经网络设计与应用28个案例分析[M].清华大学出版社,2018.