遗传算法优化BP神经网络
遗传算法GA, 是一种最优化方法, 它借鉴了自然界的遗传机制, 并模拟了生物进化的过程, 采用并行随机搜索的方式。这种搜索算法借鉴了自然界生物进化的优胜劣汰法则,通过引入优化参数来构建编码群体,并采用迭代方式不断优化,群体中每个个体的优劣由适应度函数来评判,依据遗传学的选择、交叉和变异机制进行筛选,适应能力强的个体得以保留,适应能力弱的个体被替换,新产生的群体既承袭了前代的信息,又展现出更优的性能。反复循环,直至满足条件。
每个生命体都代表一个方案,这种方案称作“基因链”,基因链由一连串标记组成,比如二进制序列。通过“价值”(评价函数)来评估基因链的优劣。遗传学计算方法主要步骤包括:
挑选过程:按照某个比率从原种群中挑选个体加入新种群,个体被挑选的比率取决于其适应程度,适应性越强被挑选的可能性越高。
基因重组,借鉴信息互换理念,挑选两个体,互换部分基因片段,创造出更优的个体,实现基因位点的调换。
变异过程偶尔出现,基因座会随之改变,这个概率通常设定在千分之一到百分之一之间。遗传算法凭借出色的启发式探寻能力以及同步运算的优势,被广泛用于解决函数优化、组合优化以及生产安排等问题。
算法核心构成包括,基因表达方式,评估指标体系,繁殖行为机制,以及调控因子设定,其中调控因子包含,种群规模数值,迭代周期次数,配对繁殖几率,基因突变比率。
遗传算法用于改进BP神经网络,涵盖网络架构选择、遗传算法调优及BP网络预测三个环节。通过遗传算法调整BP网络的初始权重和偏差,确保优化后的BP网络能更精确地推算函数结果。运用遗传算法来改进BP神经网络的效果在于能够获得更理想的网络起始参数,其核心构思在于将网络初始参数视作个体,将初始化后的BP神经网络预测误差作为个体的评价标准,借助选择、组合、变异等步骤来寻找最佳个体,也就是最恰当的BP网络起始参数。
算法实现:遗传算法旨在改进BP神经网络的起始权重和偏差,以便通过优化后的网络进行更准确的预测。先前已提及步骤,现就具体流程展开说明:
1、种群初始化
编码方案采用连续数值表示,每个编码单元对应一个实数序列,该序列由四部分构成,分别是输入层到隐含层的连接参数、隐含层的偏置参数、隐含层到输出层的连接参数以及输出层的偏置参数。每个编码单元完整存储了神经网络的所有参数开元棋官方正版下载,当网络架构固定时,便能够定义一个具有特定结构和参数的神经网络模型。
2、适应度函数
依据个体确定BP神经网络的起始权值与阈值,借助训练数据对BP神经网络进行训练开yunapp体育官网入口下载手机版,然后预测系统输出,将预测输出与期望输出之间误差的绝对值记为E,该E值即为个体适应度值F的计算公式
公式里,n代表整个网络最终要输出的节点总个数,yi是反向传播神经网络中第i个单元预设的应得值,oi是第i个单元实际计算出来的结果值,k是一个需要确定的常数。
3、选择操作
遗传算法挑选方式包含多种,例如轮盘赌方式和锦标赛方式等。采用轮盘赌方式时,依据适应度值的相对比例进行挑选,个体i被选中的几率pi等于:
该公式里,Fi代表成员i的优良程度,因为越低表示越理想,所以在挑选成员前要计算它的倒数;k是一个常数;N是整个群体中成员的总数。
4、交叉操作
个体以实数形式进行编码,因此交叉运算需选用实数交叉方式,第k个基因型a_k与第l个基因型a_l在位置j处进行的交叉运算具体执行方法如下:
式中,b是之间的随机数。
5、变异操作
选取第i个个体的第j个基因aij进行变异变异操作方法如下:
式中,amax为基因aij的上界;amin为基因的下界;
该数值是偶然产生的,g代表当前的循环次数,Gmax指代最大的迭代次数,r是另一组随机数值,接下来展示种群大小为十开元ky888棋牌官网版,经过五十次迭代,配对概率为四成,基因突变率为两成的情况下的代码编写
适应度函数:
函数 error 等于 fun 的调用结果,参数为 x,输入数量 inputnum,隐藏层数量 hiddennum,输出数量 outputnum,网络结构 net,输入维度 inputn,输出维度 outputn
%该函数用来计算适应度值
%x          input     个体
%inputnum   input     输入层节点数
%outputnum  input     隐含层节点数
%net        input     网络
%inputn     input     训练输入数据
%outputn    input     训练输出数据
%error      output    个体适应度值
%提取
w1=x(1:inputnum*hiddennum);
B1等于输入数乘以隐层数再加一,到输入数乘以隐层数加隐层数的数组部分
w2赋值为输入数与隐层数乘积再加隐层数加一至输入数与隐层数乘积加隐层数加隐层数与输出数乘积之间的数据
B2等于输入数乘以隐层数再加上隐层数,再加上隐层数乘以输出数再加一,到输入数乘以隐层数加上隐层数再加上隐层数乘以输出数加输出数这一段数值
net是新建的神经网络模型,输入层节点数为inputn,输出层节点数为outputn,隐藏层节点数为hiddennum。
%网络进化参数
net.trainParam.epochs=20;
net.trainParam.lr=0.1;
net.trainParam.goal=0.00001;
net.trainParam.show=100;
net.trainParam.showWindow=0;
 
%网络权值赋值
net的iw1,1部分等于将w1进行重塑,其形状为hiddennum和inputnum
net的第二个权重矩阵被重塑为具有输出数量和隐藏数量的结构;
netB1重新构造成hiddennum行1列的矩阵,每个元素独立存在
net.b{2}=B2;
%网络训练
网络通过输入数据训练,目标为输出数据,完成更新过程。
an=sim(net,inputn);
error=sum(abs(an-outputn));
选择操作函数
函数 ret 等于 select 个体集合,种群规模大小
% 该函数用于进行选择操作
% individuals input    种群信息
% sizepop     input    种群规模
新种群生成,依据选择过程,由输出结果决定
%求适应度值倒数   
适应度值被除以十,结果赋给fitness1, 个体适应度值作为被除数
%个体选择概率
sumfitness=sum(fitness1);
sumf=fitness1./sumfitness;
%采用轮盘赌法选择新个体
index=[]; 
对于每一个个体编号,从一至种群总数,进行下列操作
    pick=rand;
    while pick==0    
        pick=rand;        
    end
    for i=1:sizepop    
        pick=pick-sumf(i);        
        if pick<0        
            index=[index i];            
            break;  
        end
    end
end
%新种群
individuals.chrom=individuals.chrom(index,:);   %individuals.chrom为种群中个体
individuals.fitness=individuals.fitness(index);
ret=individuals;
交叉操作:
函数 ret 等于交叉 pcross, 长度 lenchrom 的染色体 chrom, 种群大小 sizepop, 边界值 bound 进行操作
%本函数完成交叉操作
概率交叉输入
染色体的尺寸输入为长度,具体数值是多少
% chrom     input  : 染色体群
种群数量输入为多少
交叉后的染色体,是输出结果,通过这种方式获得
每一轮遍历种群时,可能会实施一次配对过程,选取的基因序列是随机的,配对点同样随机确定,但本轮是否执行配对,取决于配对几率,由特定变量调控
     % 随机选择两个染色体进行交叉
     pick=rand(1,2);
     while prod(pick)==0
         pick=rand(1,2);
     end
     index=ceil(pick.*sizepop);
     % 交叉概率决定是否进行交叉
     pick=rand;
     while pick==0
         pick=rand;
     end
     if pick>pcross
         continue;
     end
     flag=0;
     while flag==0
         % 随机选择交叉位
         pick=rand;
         while pick==0
             pick=rand;
         end
选择进行交叉的特定点,依据是取整后的数值,该数值等于各个染色体长度的总和乘以随机选取的数值,即确定要交换的基因序列位置,要求两个染色体在交换基因序列时,选择相同的位置进行操作
         pick=rand; %交叉开始
         v1=chrom(index(1),pos);
         v2=chrom(index(2),pos);
对第一个索引进行操作,计算结果为 pick 乘以 v2,加上(1 减去 pick)乘以 v1,最终赋值给 chrom 变量在 pos 位置上
计算第二个索引位置上的染色体的值时,结果等于选择概率乘以第一个父代基因的值,加上未选择概率乘以第二个父代基因的值,杂交过程到此完成
flag1=测试长度,依据界限,针对染色体的第一个片段进行评估;确保其符合标准。
flag2等于计算长度,根据边界条件,从第二位开始到末尾的染色体值;这个值用来判断第二个染色体的合理性
         if   flag1*flag2==0
             flag=0;
         else flag=1;
         end    %如果两个染色体不是都可行,则重新交叉
     end
 end
ret=chrom;
变异操作:
基因值限定在 bound 范围内
% 本函数完成变异操作
变异发生的几率是多少
染色体长度输入值,即为该染色体的测量总长。
% chrom     input  : 染色体群
% sizepop               input  : 种群规模
变异手段的确定,依据输入内容
当前种群所处的进化阶段,以及整个进化过程的最大阶段数
每个个体的上级和下级,都要输入进去,不能遗漏
最大循环次数,输入值为
当前循环的次数,就是这一次的轮数
变异后的染色体结果输出
每一轮循环都可能实施一次变异,具体哪个个体被选作变异对象是随机确定的,变异发生的位置同样也是随机指定的
该轮for循环是否实施变异,取决于变异概率,由continue来调控
    % 随机选择一个染色体进行变异
    pick=rand;
    while pick==0
        pick=rand;
    end
    index=ceil(pick*sizepop);
    % 变异概率决定该轮循环是否进行变异
    pick=rand;
    if pick>pmutation
        continue;
    end
    flag=0;
    while flag==0
        % 变异位置
        pick=rand;
        while pick==0      
            pick=rand;
        end
染色体变异的位点通过计算得出,等于选取的个体编号乘以所有染色体长度的总和后向上取整,这个位置上的基因将会发生变异
    
        pick=rand; %变异开始     
        fg=(rand*(1-num/maxgen))^2;
        if pick>0.5
染色体的该位置值等于其当前值加上位置边界值减去该位置值与适应度函数的乘积
        else
染色体的当前位置减去差值,该差值等于当前位置与边界位置之差乘以适应度值,最终结果赋值给染色体的新位置
        end   %变异结束
检验染色体的适用性,依据长度参数、边界条件以及染色体第i个元素的具体数值,执行flag赋值操作。
    end
end
ret=chrom;
主函数:首先,随机产生初始种群,然后,评估种群中每个个体的适应度,并识别出最优的那个,接着,执行选择过程,之后,进行交叉运算,再之后,实施变异过程,最后,判定进化是否完成,若未完成,则回到计算适应度值的环节,输入为原始数据,输出为最终结果。
% 清空环境变量
clc
clear
% 
%% 网络结构建立
%读取数据
load data input output
%节点个数
inputnum=2;
hiddennum=5;
outputnum=1;
%训练数据和预测数据
输入训练数据是从第一个到一千九百个数据组成的集合,并将其转换为文本格式。
输入测试等于输入的一千九百零一到两千之间,并且后面有个分号
输出训练集为前1900个输出结果,用分号隔开
output_test是1901到2000区间的输出结果,带有引号
%选连样本输入输出数据归一化
输入训练集通过映射最小最大值函数得到输入和输入属性的新范围值,用逗号分隔这两个值
[输出n,输出ps]经过映射最小最大化处理,使用了训练数据作为参考标准,结果保存在这两个变量中。
%构建网络
net=newff(inputn,outputn,hiddennum);
%% 遗传算法参数初始化
进化代数设定为十次,每一次迭代代表一个世代,总共进行十次迭代过程。
种群规模设定为十,
pcross设定为0.3,代表一个介于零和一之间的数值,用于表示交叉概率的选择
变异概率设定为0.1,该值介于零与一之间
%节点总数
计算结果等于输入数量乘以隐藏数量,再加上隐藏数量,再加上隐藏数量乘以输出数量,最后再加上输出数量。
lenchrom=ones(1,numsum);        
边界值等于负三乘以单位向量乘以数值总和的乘积,边界值等于正三乘以单位向量乘以数值总和的乘积,这表示数据的取值区间
种群初始阶段,全部个体随机生成,每个个体基因长度一致,数值范围设定在特定区间内,确保多样性基础建立,为后续进化提供丰富素材,初始种群规模根据问题复杂度选择,通常取几十到几百个个体,保证种群足够大以维持遗传多样性,避免局部最优过早收敛,每个个体的基因编码方式需明确,可以是二进制码,也可以是实数编码,具体取决于优化目标性质,初始化过程需独立重复多次,选取表现最佳的结果作为最终种群起始点,确保初始种群质量,提高算法全局搜索能力
个体=创建结构体('适应度',用零填充的向量,长度等于种群规模),并设置字段'基因型'为空列表;这个结构体用于存储整个群体的数据
平均值列表为空;该列表用于记录每一代中所有个体的适应度算术平均数
最优个体适应度列表为空;该列表记录每一代中的最佳适应度值。
最优染色体列表为空;该列表用于存放适应度表现最佳的基因序列,其中每个序列均由若干位基因组成,且每个基因都对应一个特定的数值,用于评估其适应度
%初始化种群
for i=1:sizepop
    %随机产生一个种群
个体染色体i的元素被赋予编码值,依据染色体长度和界限;这个编码过程将二进制和灰度编码结果转化为一个实数,而浮点数编码则生成一个实数向量;
    x=individuals.chrom(i,:);
    %计算适应度
个体的适配度计算为函数调用结果,输入参数为染色体编码,以及网络结构参数,包括输入层节点数,隐藏层节点数和输出层节点数,同时提供网络对象和输入输出数据集,函数名为individuals.fitness,结果赋值给变量i
end
%找最好的染色体
最佳适配度和索引值等于个体适应度中的最小值
最优染色体=个体染色体最优索引,全部基因片段;  %挑选出的最佳基因序列
平均适应度值等于个体适应度总和除以种群规模,即avgfitness,计算方式为将所有个体的适应度值加起来,再除以当前种群中的个体数量,最终得到的结果作为平均适应度值
% 记录每一代进化中最好的适应度和平均适应度
追踪等于平均适应度,最佳适应度
 
%% 迭代求解最佳初始阀值和权值
% 进化开始
for i=1:maxgen
    i
    % 选择
个人列表=筛选个人列表,总人数数量
平均适应度等于个体适应度之和除以种群规模;
    %交叉
个体染色体=交叉操作(父代染色体,染色体长度,个体染色体,种群规模,边界值);
    % 变异
个体染色体=变异函数计算结果(突变概率,染色体长度,个体染色体,种群规模,个体编号,最大世代数,变异界限);
    
    % 计算适应度 
    for j=1:sizepop
        x=individuals.chrom(j,:); %解码
个人体适能函数j=函数名(x,输入参数数量,隐藏层参数数量,输出层参数数量,网络结构,输入节点数,输出节点数)
    end
    
  %找到最小和最大适应度的染色体及它们在种群中的位置
将individuals对象中的fitness属性值找出最小的一个,然后将其对应的索引号和最小值分别赋值给newbestfitness和newbestindex变量
最差的适应度值和最差的指标,是从所有个体中选取出的最大适应度值和最大指标,通过比较得出,并分别赋值给最差的适应度和最差的指标变量中,以便后续使用
    % 代替上一次进化中最好的染色体
    if bestfitness>newbestfitness
        bestfitness=newbestfitness;
最佳染色体=个体染色体数组的新最佳索引位置到当前索引位置之间的部分数据,
    end
个人染色体最差索引位置赋值为最优染色体,其他位置保持不变。
个人最优索引的适应度等于最高适应度值,
    
    avgfitness=sum(individuals.fitness)/sizepop;
    
记录每一代进化中的最佳适应度值,同时记录平均适应度值,将二者存入trace列表中。
end
%% 遗传算法结果分析 
 figure(1)
[r c]=size(trace);
绘制序列从一至r的图像,纵坐标为trace矩阵第二列的数据,线条颜色为蓝色,采用虚线样式。
设置标题为适应度曲线, 终止代数为最大代数数值
坐标横轴标注为迭代轮次,坐标纵轴标注为适应度值
绘制曲线图时标注曲线代表平均适应度,同时标注曲线代表最佳适应度
适应度                   变量
x=bestchrom;
%% 把最优初始阀值权值赋予网络预测
% %用遗传算法优化的BP网络进行值预测
w1=x(1:inputnum*hiddennum);
B1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);
w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
B2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);
net.iw{1,1}=reshape(w1,hiddennum,inputnum);
net.lw{2,1}=reshape(w2,outputnum,hiddennum);
net.b{1}=reshape(B1,hiddennum,1);
net.b{2}=B2;
%% BP网络训练
%网络进化参数
net.trainParam.epochs=100;
net.trainParam.lr=0.1;
%net.trainParam.goal=0.00001;
%网络训练
网络经过训练,得到参数per2,结果存储在net中,输入数据为inputn,输出数据为outputn
%% BP网络预测
%数据归一化
inputn_test通过调用mapminmax函数实现映射归一化,参数包括操作名,输入数据input_test,以及归一化范围inputps,最终得到归一化后的结果赋值给inputn_test
an=sim(net,inputn_test);
test_simu=映射最小最大('颠倒',an,输出概率);
error=test_simu-output_test;