function BpNeuralNetwork
%%
%作者:你猜
%模式 学号 你猜
%本程序功能是使用BP算法来逼近正弦函数
%三层神经网络,输入层,隐含层(1层),输出层。
%输入层和输出层只有一个节点。
%本函数学习的函数是y=sin(x);
%
clc
clear
%以下为算法的实现过程。
%初始化参数
%样本个数
p=30;
%隐含层神经元的个数
n=8;
%最大学习次数
times=10000;
%L为学习步长
L=.1;
%产生样本 x,t 为列向量
x=linspace(0,3*pi,p)';
t=sin(x);
%第一层与第二层连接权系数 w1,w2
w1=rand(n,1)*.1;
w2=rand(n,1)*.1;
%初始化第一二层的阈值yw1和yw2
yw1=rand(n,1);
yw2=rand;
count=1;
e=zeros(times,1);
%
%训练过程
%
for i=1:times
e1=0;
for j=1:p;
s1=w1*x(j)-yw1; %列向量,隐含层的输入
y1=1./(1+exp(-s1)); %,隐含层的激励函数,其导数为y'=y(1-y)
s2=y1'*w2-yw2; %输出层的输入
yout=s2; %输出层的激励函数为y=x;
delta2=(t(j)-yout)*1; %计算输出层的误差,此处1为输出层激励函数的导数。
delta1=(delta2*w2).*y1.*(1-y1);%计算隐含层的误差
%利用输入和误差修改权系数
w1=w1+delta1*x(j)*L;
w2=w2+delta2*y1*L;
yw1=yw1-delta1;
yw2=yw2-delta2;
e1=e1+delta2^2/2;
end
e(i)=e1;
if e1<0.005;
break;
end
count=count+1;
end
y=zeros(p,1);
for j=1:p
s1=w1*x(j)-yw1;
y1=1./(1+exp(-s1));
s2=y1'*w2-yw2;
y(j)=s2;
end
figure(1)
subplot(1,2,1)
plot(x,t,'g.:',x,y,'r.:');
xlabel('x')
ylabel('y=sin(x)');
legend('y=sin(x)','BP拟合结果')
if count<times
x=1:count;
y=e(1:count);
else
x=1:times;
y=e(1:times);
end
subplot(1,2,2)
plot(x,y);
xlabel('迭代次数');
ylabel('误差');
legend('学习曲线');
count
disp('迭代次数');
pause
y=0;
x=linspace(3*pi,4*pi,p);
for j=1:p
s1=w1*x(j)-yw1;
y1=1./(1+exp(-s1));
s2=y1'*w2-yw2;
y(j)=s2;
end
t=sin(x);
figure(2)
plot(x,t,'g.:',x,y,'r.:');
xlabel('x')
ylabel('y=sin(x)');
legend('y=sin(x)','BP计算结果')
title('BP泛化结果分析')
pause
close all
return;