qq_38631690 2017-05-03 08:55
浏览 5466

遗传算法优化BP神经网络

主函数:需调用函数fx2、evaluate和errorBP
clc
clear

%随机产生200组输入数据x、输出数据y
input=10*rand(2,200)-5;
output=zeros(1,200);
for i=1:200
output(i)=fx2(input(:,i));
end

%设置网络节点数
inputnum=2;
hiddennum=5;
outputnum=1;

%随机选择100组训练数据和100组预测数据
input_train=input(:,1:100)';
output_train=output(1:100)';
input_test=input(:,101:200)';
output_test=output(101:200)';

%训练数据归一化
[inputn,mininput,maxinput]=premnmx(input_train);
[outputn,minoutput,maxoutput]=premnmx(output_train);

%构建BP神经网络
net=newff([-5 5;-5 5],[5,1],{'tansig' 'purelin'}, 'trainlm' );

%模拟退火算法参数初始化
Tmax=50; %初温
L=100; %最大退火次数
Tmin=0.01; %终止温度

%BP神经网络算法优化权值和阈值
numsum=inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum; %权值和阈值总数
net=train(net,inputn',outputn');

%将BP神经网络优化后权值和阈值赋给模拟退火算法的初始解
s1=reshape(net.iw{1,1},1,inputnum*hiddennum);
s2=reshape(net.b{1},1,hiddennum);
s3=reshape(net.lw{2,1},1,hiddennum*outputnum);
s4=reshape(net.b{2},1,outputnum);
s=[s1,s2,s3,s4];

%模拟退火算法优化权值和阈值
t=Tmax;
while t>Tmin
k=1;
for i=1:numsum
sx(i)=s(i)+(0.2*rand-0.1)*errorBP; %产生新解
end
c=evaluate(sx,inputnum,hiddennum,outputnum,net,inputn,outputn,minoutput,maxoutput)-evaluate(s,inputnum,hiddennum,outputnum,net,inputn,outputn,minoutput,maxoutput);
%计算增量
if c<0
s=sx;
t=t*0.95; %!!!!!!
elseif rand<exp(-c/t)
s=sx;
t=t*0.99;
else
t=t*1.01;
end
%
if t<=Tmin
break;
end
k=k+1;
end

%将最优结果赋值给BP神经网络的权值和阈值
w1=s(1:inputnum*hiddennum);
v1=s(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);
w2=s(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
v2=s(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(v1,hiddennum,1);
net.b{2}=v2;

%配置网络参数(迭代次数、学习率、目标)
net.trainParam.epochs=100;
net.trainParam.lr=0.1;
net.trainParam.goal=0.00001;

%BP神经网络训练
net=train(net,inputn',outputn');

%预测数据归一化
inputn_test=tramnmx(input_test,mininput,maxinput);

%BP神经网络预测输出
an=sim(net,inputn_test');

%输出结果反归一化
BPoutput=postmnmx (an,minoutput,maxoutput);
%计算误差
error=BPoutput-output_test';

%网络预测结果图像
figure(1)
plot(BPoutput,':og')
hold on
plot(output_test,'-*');
legend('预测输出','期望输出')
title('BP网络预测输出','fontsize',12)
ylabel('函数输出','fontsize',12)
xlabel('样本','fontsize',12)

%网络预测误差图像
figure(2)
plot(error,'-*')
title('BP网络预测误差','fontsize',12)
ylabel('误差','fontsize',12)
xlabel('样本','fontsize',12)

拟合函数fx2
function y=fx2(x)
y=x(1)^2+x(2)^2;

调用的适应度值函数evaluate
function error=evaluate(s,inputnum,hiddennum,outputnum,net,inputn,outputn,minoutput,maxoutput)
%%该函数用于计算模拟退火算法适应度值evaluate
%s:权值、阈值的个体
%inputnum:输入层节点数
%hiddennum:隐含层节点数
%outputnum:输出层节点数
%net:网络
%inputn:训练输入数据
%outputn:训练输出数据
%
%

%BP神经网络初始权值和阈值
w1=s(1:inputnum*hiddennum);
v1=s(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);
w2=s(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
v2=s(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(v1,hiddennum,1);
net.b{2}=v2;

%构建BP神经网络
net=newff([-5 5;-5 5],[5,1],{'tansig' 'purelin'}, 'trainlm' );
net.trainParam.epochs=20;
net.trainParam.lr=0.1;
net.trainParam.goal=0.00001;
net.trainParam.show=100;
net.trainParam.showWindow=0;

%BP神经网络训练
net=train(net,inputn',outputn');

%BP神经网络预测
an=sim(net,inputn');

%输出结果反归一化
BPoutput=postmnmx (an,minoutput,maxoutput);

%预测误差和作为个体适应度值
error=sum(abs(an-BPoutput));

调用的误差函数errorBP
function error=errorBP
%%用于计算模拟退火算法产生新解时所需的BP神经网络的误差

%随机产生200组输入数据x、输出数据y
input=10*rand(2,200)-5;
output=zeros(1,200);
for i=1:200
output(i)=fx2(input(:,i));
end

%随机选择100组训练数据和100组预测数据
input_train=input(:,1:100)';
output_train=output(1:100)';
input_test=input(:,101:200)';
output_test=output(101:200)';

%训练数据归一化
[inputn,mininput,maxinput]=premnmx(input_train);
[outputn,minoutput,maxoutput]=premnmx(output_train);

%构建BP神经网络
net=newff([-5 5;-5 5],[5,1],{'tansig' 'purelin'}, 'trainlm' );

%配置网络参数(迭代次数、学习率、目标)
net.trainParam.epochs=100;
net.trainParam.lr=0.1;
net.trainParam.goal=0.00001;

%BP神经网络训练
net=train(net,inputn',outputn');

%预测数据归一化
inputn_test=tramnmx(input_test,mininput,maxinput);

%BP神经网络预测输出
an=sim(net,inputn_test');

%输出结果反归一化
BPoutput=postmnmx (an,minoutput,maxoutput);

%计算误差
error=sum(abs(BPoutput-output_test'))/100;

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 C++使用Gunplot
    • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
    • ¥15 matlab数字图像处理频率域滤波
    • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
    • ¥15 ELGamal和paillier计算效率谁快?
    • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
    • ¥15 Arcgis相交分析无法绘制一个或多个图形
    • ¥15 关于#r语言#的问题:差异分析前数据准备,报错Error in data[, sampleName1] : subscript out of bounds请问怎么解决呀以下是全部代码:
    • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
    • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)