一、相关技术原理简介
1 BP神经网络原理
反向传播(Back Propagation,BP)神经网络于1986年由Rumelhart和McCelland领导的科学家小组提出,是一种按误差逆传播算法训练的多层前馈神经网络。BP神经网络能学习和存贮大量的输入与输出模式映射关系,无需事前揭示描述这种映射关系的数学方程。其学习规则是使用最速下降法,通过反向传播不断调整网络的权值和阈值,从而使网络的误差平方和达到最小。BP神经网络拓扑结构可分为3层,分别是输入层、隐藏层以及输出层。其中,隐藏层的神经元个数计算公式为:
式中:m为输入层节点的个数,n为输出层节点的个数,a一般取1~10内的整数。隐藏层的个数越多,误差范围越小。
2 遗传优化算法
遗传算法是模拟达尔文生物进化论中自然选择和遗传学机理等生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。依据BP神经网络的拓扑结构,确定优化BP神经网络权值阈值的参数个数,从而确定遗传算法中个体的编码长度,再根据适应度函数计算个体的适应值,经过选择、交叉、变异操作得到最优的权值阈值。
2.1 轮盘赌算法
轮盘赌算法是为了防止适应度数值较小群体中的个体被直接淘汰而提出的,每一个个体被选中的概率与其适应度函数值大小成正比关系。适应度数值越高,它被选中的概率就越大。设某一个体xi的适应度值为f(xi),则部分被选中的概率为:
累计概率为:
式中:xi和xj都表示某个个体。
首先,计算每个部分的被选中概率p(xi)和累积概率q(xi)。其次,随机生成一个数组m,数组m中的元素取值范围为[0,1]。若累积概率q(xi)大于数组中的元素m[i],则个体xi被选中;若小于m[i],则比较下一个个体xi+1,直至选出一个个体为止。最后,若需要选择N个个体,则将上述步骤重复N次即可。
2.2 两点交叉算法
两点交叉是指在个体染色体中随机设置两个交叉点,然后进行部分基因交换。先从编码串中不定向选出两个交叉点,再对两个交叉点进行部分染色体交叉,交叉后产生新个体,如图1所示。其中,左侧为交叉前的个体,右侧为两点交叉后产生的新个体。
图1 两点交叉示例
2.3 高斯变异
高斯变异是指进行变异操作时,用符合均值为μ、方差为S2的正态分布的一个随机数替代原有的基因值。根据正态分布的特性,高斯变异重点搜索原个体附近的某个局部区域。高斯概率密度公式为:
其中,标准高斯概率密度的μ和S分别设置为0和1。高斯变异不仅提高了优化算法的优化精度,而且有利于跳出局部最优区域。
二、部分源代码
% 清空环境变量
clc
clear
close all
%读取数据X为输入 指标为列向量
%读取数据Y为输出
load X
load Y
% load XX
% load YY
%% 数据加载
input=X;
output=Y;
%训练数据和预测数据
input_train=input(:,1:1000); %训练输入
output_train=output(:,1:1000); %训练输出
input_test=input(:,1001:end); %测试输入
output_test=output(:,1001:end); %测试输出
% input_train=input(:,1:16); %训练输入
% output_train=output(:,1:16); %训练输出
% input_test=input(:,17:end); %测试输入
% output_test=output(:,17:end); %测试输出
%% 样本输入输出数据归一化
[inputn,inputps]=mapminmax(input_train);
[outputn,outputps]=mapminmax(output_train);
inputn_test=mapminmax('apply',input_test,inputps);
inputnum=size(input_train,1); %%输入神经元个数
hiddennum=2*inputnum+1; %%隐含层神经元数量根据你的要求设定
outputnum=size(output_train,1); %%输出神经元个数
%% 构建网络
net=newff(inputn,outputn,hiddennum);
%% 基础BP预测
% 网络参数
net.trainParam.epochs=1000; % 训练次数
net.trainParam.lr=0.01; % 学习速率
net.trainParam.goal=0.000001; % 训练目标最小误差
%% BP神经网络训练
net=train(net,inputn,outputn);
%% BP神经网络测试
ann=sim(net,inputn_test); %用训练好的模型进行仿真
test_simu_bp=mapminmax('reverse',ann,outputps); % 预测结果反归一化
error1=test_simu_bp-output_test; %预测值和真实值的误差
%% BP神经网络预测
bn=sim(net,inputn);
%网络训练输出反归一化
train_simu_bp=mapminmax('reverse',bn,outputps);
%% 遗传算法参数初始化
maxgen=20; %进化代数,即迭代次数
sizepop=10; %种群规模
pcross=[0.2]; %交叉概率选择,0和1之间
pmutation=[0.1]; %变异概率选择,0和1之间
%节点总数
numsum=inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum;
lenchrom=ones(1,numsum);
bound=[-3*ones(numsum,1) 3*ones(numsum,1)]; %数据范围
%% 种群初始化
%% 种群初始化
individuals=struct('fitness',zeros(1,sizepop), 'chrom',[]); %将种群信息定义为一个结构体
avgfitness=[]; %每一代种群的平均适应度
bestfitness=[]; %每一代种群的最佳适应度
bestchrom=[]; %适应度最好的染色体
%初始化种群
for i=1:sizepop
%随机产生一个种群
individuals.chrom(i,:)=Code(lenchrom,bound); %编码(binary和grey的编码结果为一个实数,float的编码结果为一个实数向量)
x=individuals.chrom(i,:);
%计算适应度
individuals.fitness(i)=fun(x,inputnum,hiddennum,outputnum,net,inputn,outputn); %染色体的适应度
end
FitRecord=[];
%找最好的染色体
[bestfitness,bestindex]=min(individuals.fitness);
bestchrom=individuals.chrom(bestindex,:); %最好的染色体
avgfitness=sum(individuals.fitness)/sizepop; %染色体的平均适应度
% 记录每一代进化中最好的适应度和平均适应度
trace=[avgfitness bestfitness];
%% 迭代求解最佳初始阀值和权值
% 进化开始
for i=1:maxgen
% 选择
individuals=Select(individuals,sizepop);
avgfitness=sum(individuals.fitness)/sizepop;
%交叉
individuals.chrom=Cross(pcross,lenchrom,individuals.chrom,sizepop,bound);
% 变异
individuals.chrom=Mutation(pmutation,lenchrom,individuals.chrom,sizepop,i,maxgen,bound);
% 计算适应度
for j=1:sizepop
x=individuals.chrom(j,:); %解码
individuals.fitness(j)=fun(x,inputnum,hiddennum,outputnum,net,inputn,outputn);
end
三、运行结果
四、matlab版本及参考文献
1 matlab版本
2014a
2 参考文献
[1]张三妞.基于遗传算法优化BP神经网络的电信客户流失预测研究[J].电视技术. 2022,46(05)
转载:https://blog.csdn.net/TIQCmatlab/article/details/125398943