📄 bpnn.m
字号:
clear;
%标准输入输出数据
p=[1 1 1 1 1;0 1 0 0 0;1 0 0 0 0;1 1 0 0 0;1 1 1 0 0;1 1 1 1 0];
t=[0 0 0 0 0;1 0 0 0 0;0 1 0 0 0;0 0 1 0 0;0 0 0 1 0;0 0 0 0 1];
%给权值赋初值
w1=eye(5,10);
w2=eye(10,5);
wr=eye(10,10)/3;
wobias=eye(6,5)/4;
wbias=eye(6,10)/3;
x=ones(6,10)/3;
ww2=zeros(10,5)/6;
ww1=zeros(5,10)/6;
wwr=zeros(10,10)/6;
wwobias=zeros(6,5)/5;
wwbias=zeros(6,10)/4;
g=[1 1 1 1 1];
f=[1 1 1 1 1 1 1 1 1 1];
mmax=0.2;
mmmax=0.1;
%要求的偏差值
h=0.04;
u=0.04;
%输出层权值得学习速度
a=1.5;
%隐含层权值的学习速度
b=1.18;
%递归层权值的学习速度
v=1.5;
%输出bias unit的学习速度
r=3000;
%输入bias unit的学习速度
w=10;
%学习的步数
n=0;
mm=0;
while mmax>0.01
%六个输入模式对依次输入
%while mmax>0.01
%十个隐含层单元的输入输出
s=p*w1+x*wr+h*wbias;
x=exp(-s.^2./2);
%五个输出层单元的输入输出
y=x*w2+u*wobias;
c=exp(-y.^2./2);
%希望的输出与实际的输出的偏差
j=t-c;
dj=max(abs(j));
mmax=max(dj');
if mmax>0.04
for k=1:6
%输出层单元的一般化误差
d=-j.*y.*exp(-y.^2./2);
%隐含层单元的一般化误差
e=-d*w2'.*s.*exp(-s.^2./2);
ww2=ww2+a*(f'*d(k,:)).*(g'*x(k,:))';
wwobias=wwobias+r*d*h;
ww1=ww1+b*(f'*p(k,:))'.*(g'*e(k,:));
wwr=wwr+v*(f'*x(k,:))'.*(f'*e(k,:));
wwbias=wwbias+w*e*u;
end
ww2=ww2./6;
ww1=ww1./6;
wwr=wwr./6;
wwobias=wwobias./6;
wwbias=wwbias./6;
w2=w2+ww2;
w1=w1+ww1;
wr=wr+wwr;
wobias=wobias+wwobias;
wbias=wbias+wwbias;
end
mm=mm+1;
n=n+1;
nn(mm)=n;
ee(n)=mmax;
ww2=zeros(10,5)/6;
ww1=zeros(5,10)/6;
wwr=zeros(10,10)/6;
wwobias=zeros(6,5)/5;
wwbias=zeros(6,10)/4;
end
%找出所有实际输出与希望输出的最大误差
%所有模式训练后的满足要求的实际输出
x=1:1:n;
plot(x,ee);
grid on;
xlabel('训练步数');
ylabel('最大误差');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -