声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2769|回复: 10

[心得体会] 小波神经网络

[复制链接]
发表于 2006-11-16 20:33 | 显示全部楼层 |阅读模式

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

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

x
都有那些高人在做小波神经网络进行故障诊断,介绍一下心得体会吧
回复
分享到:

使用道具 举报

发表于 2006-11-22 10:52 | 显示全部楼层

小波网络

我也想学习小波神经网络,可是这个方面的资料好像比较少吧,所以希望大家把你们拥有的共享一下,呵呵
发表于 2006-11-22 10:56 | 显示全部楼层

小波神经网络理论与应用

请问哪位有《小波神经网络理论与应用》肖胜中编写的
麻烦上传一下,谢谢!
发表于 2006-11-22 14:41 | 显示全部楼层

以前找来的小波神经网络程序流程,希望有用吧

%BP小波神经网络快速学习算法
clear
clc
SamIn=-1:0.001:1;
SamOut=2*sin(3*SamIn).*exp(-0.1*SamIn.*SamIn);
% figure;plot(SamIn,SamOut);
% pause

% Bp小波神经网络参数初始化
W=rand(15,1);
B=10*rands(15,1);
% 对伸缩因子A进行初始化
temp=rand(15,1);
i=1;
while(i<=15)
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算法训练小波神经网络
N=2001;
g=1.55;
l=0.0008;
t=SamIn;
study_rate=0.0002;
m=0.2; % 动量系数
count=0;
Err_NetworkOut_SamOuts=[]; % 全局变量

NetworkOutSet=[]; % 局部变量
for i=1:N
NetworkOut=0; % 局部变量
for j=1:15
tao=(t(i)-B(j,1))/A(j,1);
h=cos(1.75*tao).*exp(-tao^2/2);
NetworkOut=NetworkOut+h*W(j,1);
end
NetworkOutSet=[NetworkOutSet NetworkOut];
end
% 计算误差函数和相对误差
count=count+1;
Err_NetworkOut_SamOut=(1/2)*sumsqr(NetworkOutSet-SamOut); % 误差函数
former=Err_NetworkOut_SamOut; % 记录前一次的误差
Err_NetworkOut_SamOuts=[Err_NetworkOut_SamOuts Err_NetworkOut_SamOut]; % 误差函数集合
Err_SamOut=(1/2)*sumsqr(SamOut); % 函数平方和
ErrRate=Err_NetworkOut_SamOut/Err_SamOut; % 相对误差
% 计算增加量
E_diff_W=0; % 局部变量:梯度
E_diff_B=0; % 局部变量:梯度
E_diff_A=0; % 局部变量:梯度
E_diff_W1=[]; % 局部变量:梯度集合
E_diff_B1=[]; % 局部变量:梯度集合
E_diff_A1=[]; % 局部变量:梯度集合
delt_w=0;
delt_b=0;
delt_a=0; % 增加量
deltW=[];
deltB=[];
deltA=[];% 增加量集合
for i=1:15
for j=1:N
tao=(t(j)-B(i,1))/A(i,1);
h=cos(1.75*tao).*exp(-tao^2/2);
f=1.75*sin(1.75*tao)+tao*cos(1.75*tao);
s1=SamOut(j)-NetworkOutSet(j);
s2=s1*h;
s3=s1*(W(i,1)/A(i,1))*exp(-tao^2/2).*f;
E_diff_W=E_diff_W+s2;
E_diff_B=E_diff_B+s3;
E_diff_A=E_diff_A+s3*tao;
end
E_diff_W=-E_diff_W;
E_diff_B=-E_diff_B;
E_diff_A=-E_diff_A;
E_diff_W1=[E_diff_W1,E_diff_W];
E_diff_B1=[E_diff_B1,E_diff_B];
E_diff_A1=[E_diff_A1,E_diff_A];
end
delt_w=-((1-m)*study_rate*E_diff_W1');
delt_b=-((1-m)*study_rate*E_diff_B1');
delt_a=-((1-m)*study_rate*E_diff_A1');
deltW=[deltW,delt_w];
deltB=[deltB,delt_b];
deltA=[deltA,delt_a];
W=W+delt_w;
B=B+delt_b;
A=A+delt_a;


ErrRate




while ErrRate>=0.0005
% 计算前向传播网络
% 采用小波函数h(t)=cos(1.75t).*exp(-t^2/2);
NetworkOutSet=[];
for i=1:N
NetworkOut=0;
for j=1:15
tao=(t(i)-B(j,1))/A(j,1);
h=cos(1.75*tao).*exp(-tao^2/2);
NetworkOut=NetworkOut+h*W(j,1);
end
NetworkOutSet=[NetworkOutSet NetworkOut];
end
%计算误差函数和相对误差

Err_NetworkOut_SamOut=(1/2)*sumsqr(NetworkOutSet-SamOut); %误差函数
Err_NetworkOut_SamOuts=[Err_NetworkOut_SamOuts Err_NetworkOut_SamOut]; %误差函数集合
ErrRate=Err_NetworkOut_SamOut/Err_SamOut; % 相对误差
now=Err_NetworkOut_SamOut;

Err_NetworkOut_SamOut
ErrRate
pause
%计算增加量
E_diff_W=0;
E_diff_B=0;
E_diff_A=0; % 初始化为0是为了计算各个参数的梯度;
E_diff_W1=[]; % 局部变量:梯度集合
E_diff_B1=[]; % 局部变量:梯度集合
E_diff_A1=[]; % 局部变量:梯度集合
for i=1:15
for j=1:N
tao=(t(j)-B(i,1))/A(i,1);
h=cos(1.75*tao).*exp(-tao^2/2);
f=1.75*sin(1.75*tao)+tao*cos(1.75*tao);
s1=SamOut(j)-NetworkOutSet(j);
s2=s1*h;
s3=s1*(W(i,1)/A(i,1))*exp(-tao^2/2).*f;
E_diff_W=E_diff_W+s2;
E_diff_B=E_diff_B+s3;
E_diff_A=E_diff_A+s3*tao;
end
E_diff_W=-E_diff_W;
E_diff_B=-E_diff_B;
E_diff_A=-E_diff_A;
E_diff_W1=[E_diff_W1,E_diff_W];
E_diff_B1=[E_diff_B1,E_diff_B];
E_diff_A1=[E_diff_A1,E_diff_A];
end
if(now>former) % 如果这样,减少学习速度,并设动量系数为0
study_rate=l*study_rate;
delt_w=-study_rate*E_diff_W1';
delt_b=-study_rate*E_diff_B1';
delt_a=-study_rate*E_diff_A1';
else % 否则,增加学习速度,并恢复动量系数
study_rate=g*study_rate;
delt_w=m*deltW(:,count)-((1-m)*study_rate*E_diff_W1');
delt_b=m*deltB(:,count)-((1-m)*study_rate*E_diff_B1');
delt_a=m*deltA(:,count)-((1-m)*study_rate*E_diff_A1');
end
former=now;
W=W+delt_w;
B=B+delt_b;
A=A+delt_a;
deltW=[deltW,delt_w];
deltB=[deltB,delt_b];
deltA=[deltA,delt_a];
count=count+1;
end
W
B
A
ErrRate
count
plot(1:count,Err_NetworkOut_SamOuts) % 误差曲线
%end



楼主能把这个解释下吗??f=1.75*sin(1.75*tao)+tao*cos(1.75*tao);
是不是只是一个计算伸缩、平移因子改变量的一个中间变量。谢谢楼主!
顺便说句这个程序运行还是有点慢,不过很不错了,神经网路的逼近能力还可以就是不知道泛化能力怎么样,也就
是向外延伸的能力(预报)。


首先,谢谢站长和版主及各位大侠的支持!

f是计算误差函数对小波参数a和b求导(即a和b的梯度)所产生的式子中的一个因子。
我在这里写一下推导过程:(用sum表示"和号")
原信号s(t)=sum(W*h((t-b)/a))(这是用小波表示信号的物理意义,在网络中相当于标准输出);网络输出我们用s^(t)表示。
因此均方误差就是E=(1/2)*sum(s(t)-s^(t))^2;
那么,各个参数的梯度如下:
E_diff_W=-sum((s(t)-s^(t))*h(tao));
E_diff_B=-sum((s(t)-s^(t))*(W/A)*exp(-tao^2/2)*f);
E_diff_A=-sum((s(t)-s^(t))*tao*(W/A)*exp(-tao^2/2)*f);
这下,应该清楚了。

该程序的泛化能力我没试过,这个程序肯定还有改进的地方,还有许多不完善的地方。这个程序是我根据一
篇很简单的论文编写的,我们可以通过多看小波神经网络的文章,多学习改进的算法,从这个简单的程序入手,
对它进行改造。这样循序渐进的学习,我们就会达到一定的高度。

以后,我编写的小波算法会发上来同大家讨论,通过团结大家的力量,我们就能走出自己的道路。
 楼主| 发表于 2006-11-22 15:41 | 显示全部楼层
大家用小波神经网络都来做什么,我想用来做故障诊断,用LABVIEW和MATLAB结合做,大家都说说自己的用途和采取的方法
发表于 2006-11-22 17:08 | 显示全部楼层
我也是打算用小波神经网络来做故障诊断,是关于单相接地故障诊断的。用小波先提取故障信号特征,再输入到神经网络进行学习训练,
发表于 2006-12-28 14:57 | 显示全部楼层

小波都是用来做特征提取的

发表于 2006-12-28 20:01 | 显示全部楼层
原帖由 kasy631 于 2006-11-22 17:08 发表
我也是打算用小波神经网络来做故障诊断,是关于单相接地故障诊断的。用小波先提取故障信号特征,再输入到神经网络进行学习训练,


这方向好象挺有前景的
发表于 2006-12-30 01:20 | 显示全部楼层

我是初学者

请问小波网络是在MATLAB上运行的吗?怎么利用小波来提取故障信息啊
发表于 2012-9-18 20:32 | 显示全部楼层
学习中、。。。。。。。。。
发表于 2012-9-19 00:01 | 显示全部楼层
来学习一下~~
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-12-27 10:45 , Processed in 0.078813 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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