目标:
步骤:
未经遗传算法优化的BP神经网络建模
1、
2、
3、
4、
5、
6、
遗传算法优化的BP神经网络建模
1、
2、
3、
4、
5、
6、
7、
8、
9、
10、
算法流程图如下:
运行后使用遗传算法改进前后误差的对比图:
程序:
1、未经遗传算法优化的BP神经网络建模
clear;
clc;
%%%%%%%%%%%%%输入参数%%%%%%%%%%%%%%
N=2000;
M=1500;
%%%%%%%%%%%%%训练数据%%%%%%%%%%%%%%
for i=1:N
end
output=input(:,1).^2+input(:,2).^2;
save data input output
load data.mat
%从1到N随机排序
k=rand(1,N);
[m,n]=sort(k);
%找出训练数据和预测数据
input_train=input(n(1:M),:)';
output_train=output(n(1:M),:)';
input_test=input(n((M+1):N),:)';
output_test=output(n((M+1):N),:)';
%数据归一化
[inputn,inputs]=mapminmax(input_train);
[outputn,outputs]=mapminmax(output_train);
%构建BP神经网络
net=newff(inputn,outputn,5);
net.trainParam.epochs=100;
net.trainParam.lr=0.1;
net.trainParam.goal=0.0000004;
%BP神经网络训练
net=train(net,inputn,outputn);
%测试样本归一化
inputn_test=mapminmax('apply',input_test,inputs);
%BP神经网络预测
an=sim(net,inputn_test);
%%网络得到数据反归一化
BPoutput=mapminmax('reverse',an,outputs);
figure(1)
%plot(BPoutput,':og');
scatter(1:(N-M),BPoutput,'rx');
hold on;
%plot(output_test,'-*');
scatter(1:(N-M),output_test,'o');
legend('预测输出','期望输出','fontsize',12);
title('BP网络预测输出','fontsize',12);
xlabel('样本','fontsize',12);
xlabel('优化前输出的误差','fontsize',12);
figure(2)
error=BPoutput-output_test;
plot(1:(N-M),error);
xlabel('样本','fontsize',12);
ylabel('优化前输出的误差','fontsize',12);
%save net net inputs outputs
2、遗传算法优化的BP神经网络建模
(1)主程序
%清空环境变量
clc
clear
%读取数据
load data.mat
%节点个数
inputnum=2;
hiddennum=5;
outputnum=1;
%训练数据和预测数据
input_train=input(1:1500,:)';
input_test=input(1501:2000,:)';
output_train=output(1:1500)';
output_test=output(1501:2000)';
%选连样本输入输出数据归一化
[inputn,inputps]=mapminmax(input_train);
[outputn,outputps]=mapminmax(output_train);
%构建网络
net=newff(inputn,outputn,hiddennum);
%% 遗传算法参数初始化
maxgen=10;
sizepop=30;
pcross=[0.3];
pmutation=[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
end
%找最好的染色体
[bestfitnessbestindex]=min(individuals.fitness);
bestchrom=individuals.chrom(bestindex,:);
%avgfitness=sum(individuals.fitness)/sizepop;%染色体的平均适应度
% 记录每一代进化中最好的适应度和平均适应度
%trace=[avgfitness bestfitness];
%% 迭代求解最佳初始阀值和权值
% 进化开始
for i=1:maxgen
end
%% 遗传算法结果分析
%[r c]=size(trace);
%plot([1:r]',trace(:,2),'b--');
%title(['适应度曲线
%xlabel('进化代数');ylabel('适应度');
%legend('平均适应度','最佳适应度');
disp('适应度
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;
%网络训练
[net,per2]=train(net,inputn,outputn);
%% BP网络预测
%数据归一化
inputn_test=mapminmax('apply',input_test,inputps);
an=sim(net,inputn_test);
test_simu=mapminmax('reverse',an,outputps);
error=test_simu-output_test;
%figure(4);
hold on;plot(1:500,error,'r');
legend('优化前的误差','优化后的误差','fontsize',12)
(2)编码子程序code.m
function ret=Code(lenchrom,bound)
%本函数将变量编码成染色体,用于随机初始化一个种群
% lenchrom
%bound
%ret
flag=0;
while flag==0
end
(3)适应度函数fun.m
function error =fun(x,inputnum,hiddennum,outputnum,net,inputn,outputn)
%该函数用来计算适应度值
%x
%inputnum
%outputnum
%net
%inputn
%outputn
%error
%提取
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=newff(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.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;
%网络训练
net=train(net,inputn,outputn);
an=sim(net,inputn);
error=sum(abs(an-outputn));
(4)选择操作Select.m
function ret=select(individuals,sizepop)
% 该函数用于进行选择操作
% individualsinput
%sizepop
%ret
%求适应度值倒数
[a bestch]=min(individuals.fitness);
%b=individuals.chrom(bestch);
%c=individuals.fitness(bestch);
fitness1=10./individuals.fitness;%individuals.fitness为个体适应度值
%个体选择概率
sumfitness=sum(fitness1);
sumf=fitness1./sumfitness;
%采用轮盘赌法选择新个体
index=[];
for i=1:sizepop
end
%index=[index bestch];
%新种群
individuals.chrom=individuals.chrom(index,:);
individuals.fitness=individuals.fitness(index);
%individuals.chrom=[individuals.chrom;b];
%individuals.fitness=[individuals.fitness;c];
ret=individuals;
(5)交叉操作cross.m
functionret=Cross(pcross,lenchrom,chrom,sizepop,bound)
%本函数完成交叉操作
%pcorss
%lenchrom
%chrom
%sizepop
%ret
ret=chrom;
(6)变异操作Mutation.m
functionret=Mutation(pmutation,lenchrom,chrom,sizepop,num,maxgen,bound)
% 本函数完成变异操作
%pcorss
%lenchrom
%chrom
%sizepop
%opts
%pop
%bound
%maxgen
%num
%ret
for i=1:sizepop
end
ret=chrom;