📄 mybp_old.m
字号:
clear
clc
close all
%数据输入
% input=[0.2576622 0.5001936 0.2277879 0.4703193 0.1979135 0.4404449 0.6829764 0.9255078 0.1680392 0.4105706 0.653102 0.8956335 0.1381649 0.3806963 0.6232277 0.8657591 0.1082906 0.350822 0.5933534 0.8358848];
% output=[0.3101366 0.2724358 0.2351537 0.8867011 0.1982851 0.841985 0.1618254 0.7978635 0.1257709 0.7543168];
DATA=textread('normalized.txt');
input=DATA(:,1:2); %输入数据
output=DATA(:,3); %期望输出数据
% %归一化处理
% I=(input-min(input))/(max(input)-min(input));
% O=(output-min(output))/(max(output)-min(output));
sample=5; %输入数据样本数
X=[input(1:sample,1)';input(1:sample,2)'];
T=[output(1:sample)'];
%提供两组训练集和目标值(2输入,1输出)
% X=[input(1) input(3) input(5) input(7) input(9) input(11) input(13) input(15) input(17) input(19);input(2) input(4) input(6) input(8) input(10) input(12) input(14) input(16) input(18) input(20)];
% T=[output(1) output(2) output(3) output(4) output(5) output(6) output(7) output(8) output(9) output(10)];
%BP网络的第一阶段学习期(训练加权系数wki,wij)
%初始化
lr=0.5;err_goal=0.005; %lr为学习速率;err_goal为期望误差最小值
max_epoch=10000; %max_epoch为训练的最大次数
Oi=0;Ok=0; %置隐含层和输出层各神经元输出初值为0
%初始化wki,wij(M为输入节点j的数量;Q为隐含层节点i的数量;L为输出节点k的数量)
[M,N]=size(X);Q=3;[L,N]=size(T); %N为训练集对数量
wij=rand(Q,M);
wki=rand(L,Q); %用小的随机数初始化各层权值
for epoch=1:max_epoch
%计算隐含层各神经元的输出
NETi=wij*X;
for j=1:N %分别对每个样本进行计算
for i=1:Q %分别对隐含层每个节点进行计算
Oi(i,j)=1/(1+exp(-NETi(i,j))); %计算隐含层第j个样本第i个节点的输出
end
end
%计算输出层各神经元输出
NETk=wki*Oi;
for j=1:N
for k=1:L %分别对输出层每个节点进行计算
Ok(k,j)=1/(1+exp(-NETk(k,j))); %计算输出层第j个样本第k个节点的输出
end
end
%计算误差函数
e=((T-Ok).*(T-Ok))/2;
E(epoch)=sum(e);
if(E(epoch)<err_goal)break;end
% E(epoch)=max(max(e));
% if(E(epoch)<err_goal)break;end
%调整输出层加权系数
deltak=(T-Ok).*Ok.*(1-Ok);
wki=wki+lr*deltak*Oi';
%调整隐含层加权系数
deltai=Oi.*(1-Oi).*(deltak'*wki)';
wij=wij+lr*deltai*X';
end
epoch %显示计算次数
T %显示训练时期望的输出
Ok %显示训练时计算的输出
figure(1)
plot(1:epoch,E);hold on;
plot([1:epoch],err_goal,'r');grid on;
axis([-inf inf -10*err_goal inf]);
title('训练误差曲线图');
xlabel('迭代次数');
ylabel('训练误差');
figure(2)
plot(1:N,T(1:N),'*-',1:N,Ok(1:N),'o:');grid on;
title('训练结果');
legend('训练数据','计算数据');
Absolut_error=sum(abs(Ok-T))/sample %计算训练时输出数据的绝对误差
Relative_error=sum((abs(Ok-T))./T)/sample %计算训练时输出数据的相对误差
% e=((T-Ok).*(T-Ok))/2;
% aver_wucha=mean(e)
%BP网络的第二阶段工作期(根据训练好的wki,wij和给定的输入计算输出)
% X1=[0.07841624 0.5634791 0.04854191 0.5336047 0.01866759 0.5037304 0.4738561 0.4439818 0.9290446 0.4141074;0.3209476 0.8060105 0.2910733 0.7761362 0.261199 0.7462618 0.7163875 0.6865132 0.171576 0.6566389]; %给定输入
% T1=[0.09011834 0.7113269 0.05486553 0.6688765 0.02001054 0.6269497 0.5855314 0.5446081 0.8532748 0.5041668];
% %回想
% X2=X;
% T2=T;
% %计算隐含层各神经元输出
% NETi2=wij*X2;
% for j=1:N
% for i=1:Q
% Oi2(i,j)=1/(1+exp(-NETi2(i,j)));
% end
% end
% %计算输出层各神经元的输出
% NETk2=wki*Oi2;
% for i=1:N
% for k=1:L
% Ok2(k,i)=1/(1+exp(-NETk2(k,i)));
% end
% end
% % Ok %显示网络输出层的输出
%
% Ok2 %显示网络输出层的输出
%
% figure(4)
% plot(1:N,T2(1:N),'*-',1:N,Ok2(1:N),'o:');grid on;
% title('回想结果');
% legend('训练数据','计算数据');
%泛化
X1=[input(sample+1:2*sample,1)';input(sample+1:2*sample,2)']; %泛化输入数据
T1=[output(sample+1:2*sample,1)']; %期望输出数据
%计算隐含层各神经元输出
NETi1=wij*X1;
for j=1:N
for i=1:Q
Oi1(i,j)=1/(1+exp(-NETi1(i,j)));
end
end
%计算输出层各神经元的输出
NETk1=wki*Oi1;
for j=1:N
for k=1:L
Ok1(k,j)=1/(1+exp(-NETk1(k,j)));
end
end
T1 %显示泛化时期望的输出
Ok1 %显示泛化时计算的输出
figure(3)
plot(1:N,T1(1:N),'*-',1:N,Ok1(1:N),'o:');grid on;
title('泛化结果');
legend('泛化数据','计算数据');
Absolut_error1=sum(abs(Ok1-T1))/sample %计算训练时输出数据的绝对误差
Relative_error1=sum((abs(Ok1-T1))./T1)/sample %计算训练时输出数据的相对误差
% wucha1=((abs(Ok1-T1))./T1)/sample;
% aver_wucha1=mean(wucha1)
% e1=((T1-Ok1).*(T1-Ok1))/2;
% aver_wucha1=mean(e1)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -