2 juanshine juanshine 于 2015.05.27 18:44 提问

模拟退火算法优化BP神经网络函数拟合源程序,急求,毕设用 matlab

想用模拟退火优化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;
改进前的拟合误差
改进后的拟合误差

5个回答

u013643920
u013643920   2015.05.27 19:41
agvfdvcvcxz
agvfdvcvcxz   2015.05.27 20:15

input=10*rand(2,200)-5;
output=zeros(1,200);
for i=1:200
output(i)=fx2(input(:,i));
end

u012141858
u012141858   2015.05.27 21:42
baidu_32855437
baidu_32855437   2015.11.16 20:08

楼主,我为什么运行您的程序报错的呢,请指教!
图片说明

baidu_32855437
baidu_32855437   2015.11.16 20:09

楼主,我为什么运行您的程序报错的呢,请指教!
图片说明

Csdn user default icon
上传中...
上传图片
插入图片