声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1028|回复: 0

[综合讨论] 小波神经网络程序,计算不收敛

[复制链接]
发表于 2007-4-17 22:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
最近在做小波神经网络的预测问题,以下是参考别人的程序写的程序:
%BP小波神经网络快速学习算法
clear
clc
shuju=load('data.txt');
% figure;plot(SamIn,SamOut);
% pause
I=3; %输入层个数
M=15; %隐含层个数
N=2; %输出层个数
P=16; %样本个数

% Bp小波神经网络参数初始化
W=rand(M,N);
V=rand(I,M);
B=10*rands(M,1);
% 对伸缩因子A进行初始化
temp=rand(M,1);
i=1;
while(i<=M)
if temp(i,1)<=0.5
A(i,1)=2*temp(i,1);
else
A(i,1)=8*temp(i,1)-3;
end
i=i+1;
end

% BP算法训练小波神经网络
g=1.55;
l=0.0008;
study_rate=0.004;% 学习率
m=0.8; % 动量系数
count=0;
Err_NetworkOut_SamOuts=[]; % 全局变量


NetworkOutSet=zeros(P,N); % 局部变量
for r=1:P
t=shuju(r:r,1:3);
SamOut(r,:)=shuju(r:r,4:5);
xhp1=zeros(M,1);
for i=1:M
for j=1:I
xhp1(i)=xhp1(i)+V(j,i)*t(j);
end
tao(i)=(xhp1(i)-B(i,1))/A(i,1);
h(i)=cos(1.75*tao(i)).*exp(-tao(i)^2/2); %%%%%%%%%%%%%%计算每个样本的输出
end
for i=1:N
NetworkOut=0; % 局部变量
for j=1:M
NetworkOut=NetworkOut+h(i)*W(j,i);
end
NetworkOutSet(r,i)=NetworkOut;
end
end


% 计算误差函数和相对误差
count=count+1;
Err_NetworkOut_SamOut=(1/2)*sumsqr(NetworkOutSet-SamOut)/P; % 误差函数
former=Err_NetworkOut_SamOut; % 记录前一次的误差
Err_NetworkOut_SamOuts=[Err_NetworkOut_SamOuts Err_NetworkOut_SamOut]; % 误差函数集合
Err_SamOut=(1/2)*sumsqr(SamOut)/P; % 函数平方和
ErrRate=Err_NetworkOut_SamOut/Err_SamOut; % 相对误差
% 计算增加量

for i=1:N
   for k=1:M
  mwxn=0;
for j=1:P
   mwxn =mwxn+(NetworkOutSet(j,i)- SamOut(j,i))*h(k);
end
E_diff_W(k,i)=mwxn;% 局部变量:W梯度
end
end

for k=1:M
  mbxm=0;
for i=1:N
  for j=1:P
      f=1.75*sin(1.75*h(k))+h(k)*cos(1.75*h(k));
      s3=(W(k,i)/A(k,1))*exp(-h(k)^2/2).*f;
       mbxm= mbxm+(NetworkOutSet(j,i)- SamOut(j,i))*s3;
  end
end
E_diff_B(k)=mbxm;   % 局部变量:B梯度
end

for k=1:M
E_diff_A(k)=E_diff_B(k)*h(k); % 局部变量:A梯度
end

for k=1:M
  for i=1:I
    E_diff_V(i,k)=-E_diff_B(k)*t(i);% 局部变量:V梯度
end
end

E_diff_W=-E_diff_W;
E_diff_B=-E_diff_B;
E_diff_A=-E_diff_A;
E_diff_V=-E_diff_V;
delt_w=-((1-m)*study_rate*E_diff_W);
delt_b=-((1-m)*study_rate*E_diff_B');
delt_a=-((1-m)*study_rate*E_diff_A');
delt_v=-((1-m)*study_rate*E_diff_V);
W=W+delt_w;
B=B+delt_b;
A=A+delt_a;
V=V+delt_v;

while ErrRate>=0.0002
% 计算前向传播网络
% 采用小波函数h(t)=cos(1.75t).*exp(-t^2/2);
NetworkOutSet=zeros(P,N); % 局部变量
for r=1:P
t=shuju(r:r,1:3);
SamOut(r,:)=shuju(r:r,4:5);
xhp1=zeros(M,1);
for i=1:M
for j=1:I
xhp1(i)=xhp1(i)+V(j,i)*t(j);
end
tao(i)=(xhp1(i)-B(i,1))/A(i,1);
h(i)=cos(1.75*tao(i)).*exp(-tao(i)^2/2); %%%%%%%%%%%%%%计算每个样本的输出
end
for i=1:N
NetworkOut=0; % 局部变量
for j=1:M
NetworkOut=NetworkOut+h(i)*W(j,i);
end
NetworkOutSet(r,i)=NetworkOut;
end
end

Err_NetworkOut_SamOut=(1/2)*sumsqr(NetworkOutSet-SamOut)/P; % 误差函数
Err_NetworkOut_SamOuts=[Err_NetworkOut_SamOuts Err_NetworkOut_SamOut]; % 误差函数集合
ErrRate=Err_NetworkOut_SamOut/Err_SamOut; % 相对误差
now=Err_NetworkOut_SamOut;
Err_NetworkOut_SamOut
ErrRate
%pause
%计算增加量
for i=1:N
   for k=1:M
  mwxn=0;
for j=1:P
   mwxn =mwxn+(NetworkOutSet(j,i)- SamOut(j,i))*h(k);
end
E_diff_W(k,i)=mwxn;% 局部变量:W梯度
end
end

for k=1:M
  mbxm=0;
for i=1:N
  for j=1:P
      f=1.75*sin(1.75*h(k))+h(k)*cos(1.75*h(k));
      s3=(W(k,i)/A(k,1))*exp(-h(k)^2/2).*f;
       mbxm= mbxm+(NetworkOutSet(j,i)- SamOut(j,i))*s3;
  end
end
E_diff_B(k)=mbxm;   % 局部变量:B梯度
end

for k=1:M
E_diff_A(k)=E_diff_B(k)*h(k); % 局部变量:A梯度
end

for k=1:M
  for i=1:I
    E_diff_V(i,k)=-E_diff_B(k)*t(i);% 局部变量:V梯度
end
end

E_diff_W=-E_diff_W;
E_diff_B=-E_diff_B;
E_diff_A=-E_diff_A;
E_diff_V=-E_diff_V;
if(now>former) % 如果这样,减少学习速度,并设动量系数为0
study_rate=l*study_rate;
delt_w=-study_rate*E_diff_W;
delt_b=-study_rate*E_diff_B';
delt_a=-study_rate*E_diff_A';
delt_v=-study_rate*E_diff_V;
else % 否则,增加学习速度,并恢复动量系数
study_rate=g*study_rate;
delt_w=m*delt_w-((1-m)*study_rate*E_diff_W);
delt_b=m*delt_b-((1-m)*study_rate*E_diff_B');
delt_a=m*delt_a-((1-m)*study_rate*E_diff_A');
delt_v=m*delt_v-((1-m)*study_rate*E_diff_V);
end
former=now;
W=W+delt_w;
B=B+delt_b;
A=A+delt_a;
V=V+delt_v;
count=count+1;
if count>2000
figure;
plot(1:count,Err_NetworkOut_SamOuts);
title('误差曲线');
disp('目标未达到');
break;
end
end

W
B
A
ErrRate
count
plot(1:count,Err_NetworkOut_SamOuts) % 误差曲线
其中data.txt文件为:
0.106 0.312 0.74 0 0
0.530 0.150 0.90 1 0
0.580 0.176 0.90 0 1
0.096 0.230 0.57 0 0
0.360 0.205 0.50 1 0
0.820 0.185 0.38 1 0
0.315 0.241 0.93 1 0
0.270 0.217 0.50 1 0
0.357 0.241 0.50 1 0
0.420 0.217 0.50 1 0
0.380 0.217 0.50 1 0
0.440 0.269 0.55 0 1
0.317 0.217 0.50 1 0
0.300 0.204 0.50 0 1
0.377 0.284 0.50 1 0
0.774 0.175 0.55 1 1
计算不收敛,不知道怎么回事?
麻烦大虾们指点下.计算不收敛怎么处理.急用!!!!
小弟感激不尽!!

[ 本帖最后由 eight 于 2007-4-17 22:53 编辑 ]
回复
分享到:

使用道具 举报

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-12-13 00:45 , Processed in 0.054463 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表