当前位置:文档之家› 用matlab编程实现的基于BP神经网络的预测仿真

用matlab编程实现的基于BP神经网络的预测仿真

%BP神经网络用于系统辨识训练预测程序
clear all
clc
%产生随机序列作为系统输入
A=6; x0=1; M=255; f=2; N=60;Q=2*N/3;H=N-Q-1; %初始化
for k=1:N
x2=A*x0; %分别用x2和x0表示xi和xi-1
x1=mod (x2,M); %x2除以M的余数给x1
v1=x1/256; %x1除以256得到小于1的随机数给v1
if v1-0.5>=0
u(:,k)=v1*f-1;%如果随机数v1大于0.5,就乘以系数f减去1,将结
else %果存于U的第k列中
u(:,k)=v1-1; %不满足条件的运算结果存于矩阵U中
end
x0=x1;%xi-1=xi
v0=v1;%vi-1=vi
end
z=zeros(1,N); %输出长度
v=rand(1,N); %随机噪声
for k=3:N
z(k)=1.5*z(k-1)-0.7*z(k-2)+1.1*u(k-1)+0.3*u(k-2)-v(k-1)+0.2*v(k-2);
end %理想输出作为观察值
for k=1:N-2
hl(k,:)=[-z(k+1),-z(k),u(k+1),u(k),v(k+1),v(k)];%样本矩阵HL赋值
zl(k)=z(k+2); %给样本矩阵ZL赋值
end
HL=(hl-min(min(hl)))/(max(max(hl))-min(min(hl))); %数据归一化
ZL=(zl-min(zl))/(max(zl)-min(zl)); %数据归一化
p=HL(1:Q,:); %训练样本输入
p1=HL(Q:N-2,:); %测试样本输入
b1=ones(Q,1);b2=ones(H,1); %初始化
P=[p,b1]; %增广训练样本
P1=[p1,b2]; %增广测试样本
T=ZL(1,1:Q)'; %训练样本理想输出
T1=ZL(1,Q:N-2)'; %测试样本理想输出
inputNums=6; %网络输入层节点数
outputNums=1; %网络输出层节点数
hideNums=10; %网络隐层节点数
lc=0.03; %学习率
max_epoch=3000; %最大循环次数
error_goal=0.00001; %期望误差最小值
B1=randn(1,hideNums); %输入层到隐含层的阈值初始化
B2=randn(1,outputNums); %隐含层到输出层的阈值初始化
w1=randn(inputNums,hideNums); %输入层到隐含层的权值初始化
w2=randn(hideNums,outputNums); %隐含层到输出层的权值初始化
W1=[w1;B1]; %输入层到隐含层的增广权矩阵
W2=[w2;B2]; %隐含层到输出层的增广权矩阵
error=zeros(1,max_epoch); %训练误差
%训练样本集P对BP神经网络进行训练
for k=1:max_epoch
for i=1:Q %单个样本的输入
for j=1:hideNums
net=P(i,:)*W1(:,j); %隐含层神经元的输入
y(i,j)=1/(1+exp(-net)); %隐含层输出
end
Y(i,:)=[y(i,:),1]; %带阈值隐含层输出
for j=1:outputNums
net=Y(i,:)*W2(:,j); %输出层神经元的输入
O(i,j)=1/(1+exp(-net)); %输出层输出
end
E=T(i)-O(i); %单个样本训练误差
SSE=0.5*E^2; %均方误差

if SSE>=error_goal
for c=1:hideNums
for j=1:outputNums
DW2(c,j)=(T(i,j)-O(i,j))*O(i,j)*(1-O(i,j)); %输出层误差偏导
W2(c,j)=W2(c,j)+lc*DW2(c,j)*Y(i,c); %输出层权值阈值的调整
sumDW1=0;
sumDW1=sumDW1+W2(c,j)*DW2(c,j); %输出层对前一层的误差
end
end
for m=1:inputNums
for n=1:hideNums
DW1(m,n)=Y(i,n)*(1-Y(i,n))*sumDW1; %隐含层误差偏导
W1(m,n)=W1(m,n)+lc*DW1(m,n)*P(i,m); %隐含层权值阈值的调整
end
end
end
end
e=T-O;
error(:,k)=sumsqr(e)/(2*Q); %样本集训练误差
end
w1=W1(1:inputNums,:) %输入层到隐含层的权值
B1=W1(end,:) %输入层到隐含层的阈值
w2=W2(1:hideNums,:) %隐含层到输出层的权值
B2=W2(end,:) %隐含层到输出层的阈值
%测试样本集P1用于BP神经网络预测
for i=1:H
for j=1:hideNums
net=P1(i,:)*W1(:,j); %隐含层的输入
y(i,j)=1/(1+exp(-net)); %隐含层神经元输出
end
Y(i,:)=[y(i,:),1];
for j=1:outputNums
net=Y(i,:)*W2(:,j); %输出层的输入
O1(i,j)=1/(1+exp(-net)); %BP网络实际输出
end
end
figure(1);
k=1:max_epoch;
plot(k,error); %每次训练产生的均方误差
xlabel('k');ylabel('error');
figure(2);
k=1:H;
plot(k,T1,k,O1,'*'); %期望输出值和BP网络实际输出值
xlabel('k');ylabel('T1andO1');title('BP simulation');
legend('T1 is desired output ','O1 is Network real output');

程序运行结果:
网络调整后的权值和阈值:
w1 =

-1.8970 -0.3536 -0.7324 -0.2796 -0.8915 -2.5360
-1.4659 -0.8267 1.3088 -2.9194
0.2206 0.3110 -0.4352 1.9239 0.2798 2.2846
2.3745 1.0050 1.9195 1.6357
0.3982 1.2206 -0.3522 0.3303 0.1851 0.4378
0.6983 0.7763 1.0435 1.6692
-0.0396 -0.0303 0.1196 2.5735 1.9985 0.5372
0.7766 0.2509 0.3865 -0.1207
-2.0508 -0.2577 -1.1566 -0.4017 -0.2822 -0.7683
-0.8974 -0.7947 -2.8680 -2.8010
0.5775 0.2247 -1.8290 1.2246 -1.2297 0.4094
-2.0787 -0.0308 1.4659 0.6319
B1 =

-0.0626 1.3940 -0.6442 -2.4781 0.4005 -0.4490
-0.7535 -0.7373 -1.0483 0.6430
w2 =

0.4787
-0.6121
-1.5698
1.1484
-1.3859
2.6040
2.8504
-2.0707
-3.7628
2.8872
B2 =

0.7753

网络训练过程中的误差记录:


网络实际输出与期望输出的模拟对比:



相关主题
相关文档 最新文档