[
] 逼近sin函数
人工神经网络作业
王辉鹏
(华南理工大学自动化科学与工程学院,2004级硕士研究生,学号200420109189) 1(作业:
一个前向网络逼近一个函数,该函数为
,, y,sin(x,x),x,x,[,,]121222
使用两种方法,第一种用随机方法逼近,第二种用统计方法逼近。 设计一个BP网络模型,源代码如下:
clear
step_length=0.9 %input('请输入步长,建议为0,2: ');
N=20 %input('请输入采样点数,建议为20: ');
0 % input('请输入隐层节点的数目,建议为2,10: '); M=1
,0.8: '); b=0.7 %input('输入惯性因子,建议为0
% tic,t=cputime;
Training=30000;
X=zeros(2,N);
d=zeros(1,N);
y=zeros(1,N);
for i=0:N-1;
X(1,i+1)=-1.57+3.14*i/N;
%X(1,i+1)=2*pi*i/N;
X(2,i+1)=-1.57+3.14*i/N;
%X(2,i+1)=2*pi*i/N;
d(i+1)=0.5+0.4*sin(X(1,i+1)+X(2,i+1));
%d(i+1)=sin(X(1,i+1)+X(2,i+1)); end
% plot3(X(1,:),X(2,:),d); % grid on;
W=randn(2,M); % 输入层到隐含层的权值(0-1)
B=randn(1,M); % 隐含层对应的阈值
V=randn(1,M); % 隐含层到输出层的权值(包含输出层的阈值)
V1=randn(1); % 输出层的阈值
P=zeros(M,1); % 隐含层的输入
Q=zeros(M,1); % 隐含层的输出
vv=zeros(M,1);
ww1=zeros(M,1);
ww2=zeros(M,1);
bb=zeros(M,1);
for NUM=1:Training;
E=0;
Emax=0;
for k=1:N; % 单个样本
Z=0;
P=W'*X(:,k)+B';%对应隐含层输入(M行1列)
I=ones(M,1);
Q=I./(I+exp(-P)); %对应隐含层输出(M行1列)
Z=V*Q+V1; % 输出层的输入
y(k)=1/(1+exp(-Z)); %输出层的输出
e=0.5*(d(k)-y(k))*(d(k)-y(k));
if e>0.0002
ww1=step_length*(d(k)-y(k))*y(k)*(1-y(k))*X(1,k)*((Q.*(I-Q)).*V');
%输入到隐含层的权值的调整,对应节点1(X1)(M*1)
ww2=step_length*(d(k)-y(k))*y(k)*(1-y(k))*X(2,k)*((Q.*(I-Q)).*V');
%输入到隐含层的权值的调整,对应节点2(X2)(M*1)
bb=step_length*(d(k)-y(k))*y(k)*(1-y(k))*((Q.*(I-Q)).*V'); %对应隐含层阈值的调整,(M*1)
W(1,:)=W(1,:)+ww1';
W(2,:)=W(2,:)+ww2';
B=B+bb';
vv=step_length*(d(k)-y(k))*y(k)*(1-y(k))*Q;
vv1=step_length*(d(k)-y(k))*y(k)*(1-y(k)); %
V=(V'+vv)';
V1=V1+vv1; %
%j 隐含层到输出层的权值(包括阈值)的调整
end
if Emax
0.02 )
end
if ( e_av<0.002 )
break
end
end %Training
e_av
M
NUM
plot3(X(1,:),X(2,:),y)
grid on;
toc,cputime-t;
运行结果如下:
0.75
0.74
0.73
0.72212100-1-1-2-2
图2 用统计方法逼近函数的运行结果 2. 用随机方法逼近y,sin(x,x)函数,源代码如下: 12
clear
c1=0.002;
c2=0.0002;
c3=0.002;
b=input('输入一个数,输入1可以设定部分参数,输入其他数自动运行: ');
if b==1;
s1=input('输入学习的最大步长: ');
s2=input('输入学习的最小步长,0到1: ');
s=s1;
N=input('输入采样点数,建议为20: ');
Mmax=input('请输入隐层节点的最大数目,必须大于2: ');
a=input('输入学习率,建议输0.8: '); else
s1=2;
s2=0.8;
N=20;
Mmax=10;
a=0.8;
end
NUMmax=10000;
X=zeros(1,N);
Y=zeros(1,N);
y=zeros(1,N);
for i=0:N-1;
X(i+1)=2*pi*i/N;
Y(i+1)=0.5+0.4*sin(X(i+1));
end
for m=4:Mmax;
W=random('exp',0.5,2,m);
V=random('exp',0.5,1,m+1);
P=zeros(1,m);
Q=zeros(1,m+1);
Q(m+1)=1;
for NUM=1:NUMmax;
E=0;
Emax=0;
for k=1:N;
Z=0;
for j=1:m;
P(j)=W(1,j)*X(k)+W(2,j);
Q(j)=1/(1+exp(-P(j)));
end
for j=1:m+1;
Z=Z+V(j)*Q(j);
end
y(k)=1/(1+exp(-Z));
e=0.5*(Y(k)-y(k))*(Y(k)-y(k));
if ec2
for j=1:m;
ww1=s*Q(j)*(1-Q(j))*X(k)*(Y(k)-y(k))*y(k)*(1-y(k))*V(j);
ww2=s*Q(j)*(1-Q(j))*(Y(k)-y(k))*y(k)*(1-y(k))*V(j);
W(1,j)=W(1,j)+a*ww1;
W(2,j)=W(2,j)+a*ww2;
end %j
for j=1:m+1;
vv=s*(Y(k)-y(k))*y(k)*(1-y(k))*Q(j);
V(j)=V(j)+a*vv;
end %j
end
if Emax0)
u1=0.5+0.4*sin(x);
z=0;
for j=1:m;
P(j)=W(1,j)*x+W(2,j);
Q(j)=1/(1+exp(-P(j)));
end
for j=1:m+1;
z=z+V(j)*Q(j);
end
u2=1/(1+exp(-z));
e2=0.5*(u1-u2)*(u1-u2);
u1
u2
e2
end
运行结果如下:
学习模型的学习曲线,***为实际值,绿线为学习值1
0.8
0.6
0.4
0.2
00123456
学习得到的模型对实际值的输出曲线,红线为仿真值1
0.8
0.6
0.4
0.2
00123456
图3 用随机方法逼近函数的运行结果