一、BP神经网络
BP神经网络(Back Propagation Neural Network,BPNN)是一种按误差反向传播训练的多层前馈网络,基本思想是梯度下降法,利用梯度搜索技术,以使网络的实际输出值和期望输出值的误差均方差为最小。
BP神经网络包括信号正向传播和反向传播调整两个过程,即计算误差输出时按从输入到输出的方向进行,而调整权值和阈值则从输出到输入的方向进行。正向传播时,输入信号通过隐含层作用于输出节点,经过非线性变换,产生输出信号,若实际输出与期望输出不相符,则转入误差的反向传播过程。反向传播调整两是将输出误差通过隐含层向输入层逐层反传,并将误差分摊给各层所有单元,以从各层获得的误差信号作为调整各单元权值的依据。通过调整输入节点与隐层节点的联接强度和隐层节点与输出节点的联接强度以及阈值,使误差沿梯度方向下降,经过反复学习训练,确定与最小误差相对应的网络参数(权值和阈值),BP网络训练即告完成。此时经过训练完成的神经网络即能对类似样本的输入信息,自行处理输出误差最小的经过非线形转换的信息。
二、遗传算法
遗传算法(Genetic Algorithm,GA)是基于达尔文进化论中自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。遗传算法模拟了生物群体的特征进化和自然选择过程中的基因选择、基因交叉和基因突变现象。遗传算法的中心思想是:种群中的每个个体是问题的一个解,称为“染色体”,利用适应度值测量染色体的好坏。遗传算法初始化时依据随机生成的准则,设置初始解并计算个体适应度值。按照所选择的适应度函数并通过遗传中的选择、交叉和变异对个体进行筛选,使适应度值好的个体被保留,适应度差的个体被淘汰,新的群体既继承了上一代的信息,又优于上一代,反复循环,直至满足条件。 遗传算法步骤如下:
- 编码。遗传算法不能直接处理问题空间的参数,必须通过编码将要求解的问题表示成遗传空间的染色体或者个体,因此遗传算法编码是将问题的解在编码过程中转换为相应的基因,称作问题的表述。
- 适应度函数。遗传算法的适应度函数也称评价函数,用于判断种群中的个体的优劣程度的指标,根据所求问题的来进行评估的。遗传算法中,个体染色体能否进入到新种群中的概率是由适应度决定。适应度函数将问题转化为个体的适应度值,作为所寻求优化值与目标值之间的桥梁,因此将网络模型的误差函数作为适应度值,将种群进化描述为误差减小过程。
- 选择算子。种群进行选择操作的目的为选择基因较优个体,繁衍下一代新个体,达到群体进化。具有良好适应度的个体属于优秀个体,最终被保留下来。本研究选择轮盘赌方法计算选择操作时个体被选中的概率。
交叉变异。交叉操作是采用两两配对的方式在特定条件下两个个体交换部分基后,获得两个新的个体。突变是指染色体上的基因变化而产生的新染色体。遗传算法运算时个体的选择概率通常受到个体适应度的限制,开始具有较高适应度的个体将在整体中处于主导地位,最初的最佳个体之间通过交叉和突变也产生了新个体。在遗传进化的后期阶段,种群中的个体都可能具有优异的适应度值,此时进化效率会降低。
三、关键代码展示
net=newff(inputn,outputn,hiddennum_best,{'tansig','purelin'},'trainlm');% 建立模型
%网络参数配置
net.trainParam.epochs=1000; % 训练次数
net.trainParam.lr=0.01; % 学习速率
net.trainParam.goal=0.00001; % 训练目标最小误差
net.trainParam.show=25; % 显示频率
net.trainParam.mc=0.01; % 动量因子
net.trainParam.min_grad=1e-6; % 最小性能梯度
net.trainParam.max_fail=6; % 最高失败次数
%初始化ga参数
PopulationSize_Data=30; %初始种群规模
MaxGenerations_Data=60; %最大进化代数
CrossoverFraction_Data=0.8; %交叉概率
MigrationFraction_Data=0.2; %变异概率
nvars=inputnum*hiddennum_best+hiddennum_best+hiddennum_best*outputnum+outputnum;
lb=repmat(-3,nvars,1); %自变量下限
ub=repmat(3,nvars,1); %自变量上限
%调用遗传算法函数
options = optimoptions('ga');
options = optimoptions(options,'PopulationSize', PopulationSize_Data);
options = optimoptions(options,'CrossoverFraction', CrossoverFraction_Data);
options = optimoptions(options,'MigrationFraction', MigrationFraction_Data);
options = optimoptions(options,'MaxGenerations', MaxGenerations_Data);
options = optimoptions(options,'SelectionFcn', @selectionroulette); %轮盘赌选择
options = optimoptions(options,'CrossoverFcn', @crossovertwopoint); %两点交叉
options = optimoptions(options,'MutationFcn', { @mutationgaussian [] [] }); %高斯变异
options = optimoptions(options,'Display', 'iter'); %‘off’为不显示迭代过程,‘iter’为显示迭代过程
options = optimoptions(options,'PlotFcn', { @gaplotbestf }); %最佳适应度作图
%求解
[x,fval] = ga(@fitness,nvars,[],[],[],[],lb,ub,[],[],options);
四、运行结果展示
(1)根据隐含层节点计算公式,计算最佳隐含层节点数
(2) BP和GA-BP预测对比及误差
(3)计算各项误差指标