📄 nn2.m
字号:
%取样本数据
clc
clear
k=1;
x0=rand(2,5)
yd=rand(2,5)
[m,n]=size(x0);
% 初值定义
w1=[0.21 0.2 0.43 0.43 0.57;0.21 0.23 0.43 0.43 0.57];
w2=[0.25 0.02; 0.3 0.454 ;0.63 0.34 ;0.26 0.57; 0.72 0.34];
fi=[0.15 0.45 0.52 0.15 0.05]'; %各神经元的阈值
fo=[0.5;0.5]; %输出阈值
a=0.6 ; %a为学习速率
[wm,wn]=size(w1);
%开始学习,其中times为学习次数
for k=1:1:n
e=1;
times=0;
while e>0.0001×<1000 %循环条件
for i=1:1:wn %计算第二层各神经元的状态
net1(i)=w1(1,i)*x0(1,k)+w1(2,i)*x0(2,k)+fi(i);
end
for j=1:1:wn %计算第二层各神经元的输出o
o(j)=1/(1+exp(-net1(j)));
end
%计算第三层神经元的状态
net2(1)=w2(1,1)*o(1)+w2(2,1)*o(2)+w2(3,1)*o(3)+w2(4,1)*o(4)+w2(5,1)*o(5)+fo(1,1);
net2(2)=w2(1,2)*o(1)+w2(2,2)*o(2)+w2(3,2)*o(3)+w2(4,2)*o(4)+w2(5,2)*o(5)+fo(2,1);
y1=1/(1+exp(-net2(1))); %计算第三层神经元的输出,即实际输出
y2=1/(1+exp(-net2(2)));
%误差计算并判断神经网络逼近误差是否满足要求或迭代次数是否达到最大容许值
e=((yd(1,k)-y1)^2)/2;
times=times+1;
%误差大于0.01时,继续迭代,修改各个权值及阈值
e2=(yd(1,k)-y1)*y1*(1-y1); %计算广义误差
for i=1:1:wn
e1(i)=e2*w2(i)*o(i)*(1-o(i));
end
for j=1:1:wn %权值更新
w1(j)=w1(j)+a*e1(j)*x0(k);
w2(j)=w2(j)+a*e2*o(j);
fi(j)=fi(j)+a*e1(j);
fo=fo+a*e2;
end
end
yy(1,k)=y1;
end
%输出学习结果:权值及阈值
w1
w2
fi
fo
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -