happy 发表于 2006-9-8 15:55

小波神经网络程序

clc
clear
%step 1=========================
%定义输入样本;
t=0:0.01:1.5;
x=-sin(2*pi*t);
targ=;
eta=0.02;aerfa=0.935;
%初始化连接权wjh(输出层和隐层的连接权);whi(隐层和输出层的连接权);
%假设小波函数节点数为:H个;样本数为P;
%输出节点数为:J个;输入节点数为:I个;
H=15;P=2;
I=length(t);
J=length(targ);
%初始化小波参数
b=rand(H,1);
a=rand(H,1);
%初始化权系数;
whi=rand(I,H);
wjh=rand(H,J);
%阈值初始化;
b1=rand(H,1);
b2=rand(J,1);
p=0;
%保存的误差;
Err_NetOut=[];
flag=1;count=0;
while flag>0
flag=0;
count=count+1;

%step 2=================================
xhp1=0;
for h=1:H
for i=1:I
xhp1=xhp1+whi(i,h)*x(i);
end
ixhp(h)=xhp1+b1(h);
xhp1=0;
end
for h=1:H
oxhp(h)=fai((ixhp(h)-b(h))/a(h));
end
%step 3====================================
ixjp1=0;
for j=1:J
for h=1:H
ixjp1=ixjp1+wjh(h,j)*oxhp(h);
end
ixjp(j)=ixjp1+b2(j);
ixjp1=0;
end
for i=1:J
oxjp(i)=fnn(ixjp(i));
end
%step 6==保存每次误差=====
wuchayy=1/2*sumsqr(oxjp-targ);
%E_x=1/2*sumsqr(x);
Err_NetOut=;%保存每次的误差;
%Err_rate=Err_NetOut/E_x;

%Err_rate

%oxjp

%求detaj ,detab2==================================
for j=1:J
detaj(j)=-(oxjp(j)-targ(j))*oxjp(j)*(1-oxjp(j));
end

for j=1:J
for h=1:H
detawjh(h,j)=eta*detaj(j)*oxhp(h);
end
end
detab2=eta*detaj;

%求detah, detawhi detab1 detab detaa;========================

sum=0;
for h=1:H
for j=1:J
sum=detaj(j)*wjh(h,j)*diffai((ixhp(h)-b(h))/a(h))/a(h)+sum;
end
detah(h)=sum;
sum=0;
end
for h=1:H
for i=1:I
detawhi(i,h)=eta*detah(h)*x(i);
end
end
detab1=eta*detah;
detab=-eta*detah;
for h=1:H
detaa(h)=-eta*detah(h)*((ixhp(h)-b(h))/a(h));
end

%引入动量因子aerfa,修正各个系数==========================================
wjh=wjh+(1+aerfa)*detawjh;
whi=whi+(1+aerfa)*detawhi;
a=a+(1+aerfa)*detaa';
b=b+(1+aerfa)*detab';
b1=b1+(1+aerfa)*detab1';
b2=b2+(1+aerfa)*detab2';

%======================================================
%引入修正算法!!

%判断所有的样本是否计算完==================================
p=p+1;
if p~=P
flag=flag+1;
else
if Err_NetOut(end)>0.05
flag=flag+1;

else
figure;
plot(Err_NetOut);
title('误差曲线');
disp('目标达到');
%disp(oxjp);
end
end
if count>2000
figure;
plot(Err_NetOut);
title('误差曲线');
disp('目标未达到');
disp(oxjp);
break;
end
end

这里还需要定义三个函数

1. diffai.m
function y3=diffai(x);
    y3=-0.75*sin(1.75*x)*exp(-x.^2/2)-cos(1.75*x)*exp(-x.^2/2)*x;

2. fai.m
function yl=fai(x)
    yl=cos(0.75.*x)+exp(-x.^2/2);
3. fnn.m
function y2=fnn(x)
    y2=1/(1+exp(-x));

橄榄石 发表于 2006-10-11 19:27

请问怎么在MATLAB中用训练好的小波神经网络来预测呢?
本人是新手,请多多包涵!

amygod 发表于 2006-10-12 21:08

同问,请楼主解答~~~~~~~~~~

橄榄石 发表于 2006-10-13 17:43

还有一个问题,楼主的程序好像是以单输入单输出的。
能提供多输入单输出的程序吗?
小弟先谢了!

[ 本帖最后由 橄榄石 于 2006-10-13 17:50 编辑 ]

suffer 发表于 2006-10-20 15:01

原帖由 橄榄石 于 2006-10-13 17:43 发表
还有一个问题,楼主的程序好像是以单输入单输出的。
能提供多输入单输出的程序吗?
小弟先谢了!


请看说明“%输出节点数为:J个;输入节点数为:I个;”

suffer 发表于 2006-10-20 15:03

原帖由 橄榄石 于 2006-10-11 19:27 发表
请问怎么在MATLAB中用训练好的小波神经网络来预测呢?
本人是新手,请多多包涵!

不是可以输出权值吗?

橄榄石 发表于 2006-10-20 16:32

不好意思,新手,见笑了!
请多多指教!

橄榄石 发表于 2006-10-20 16:48

输入节点数跟输入层维数好像不是一个概念吧

suffer 发表于 2006-10-21 07:57

原帖由 橄榄石 于 2006-10-20 16:48 发表
输入节点数跟输入层维数好像不是一个概念吧


输入层和输出层节点数选择由应用要求而定:输入节点数一般等于要训练的样本矢量维数,可以是原始数据维数或提取的特征维数;输出单元数在分类网络中取类别数M或log2m,在逼近网络中取要逼近的函数输出空间维数。当网络用于工业过程辨识或时间序列预测建模时,输入节点数的选择应由非线性系统定阶的结果确定。

橄榄石 发表于 2006-10-23 22:17

0.38 37 526 47.6 56.9
0.38 43 526 47.6 58.1
0.49 43 408 47.6 46.5
0.49 31 408 47.6 46.4
0.57 31 351 47.6 32.6
0.57 37 351 47.6 34.7
0.33 32 606 48.9 68.5
0.33 38 606 48.9 72.3
0.43 38 465 48.9 56.5
0.43 26 465 48.9 53.0
0.64 26 313 48.9 29.2
0.64 32 313 48.9 30.8
0.43 32 449 40.4 44.1
0.69 35 283 48.9 27.1
0.43 32 465 48.9 50.7
0.60 36 325 48.9 35.6
0.67 45 289 48.9 32.1
0.54 43 361 48.9 43.3
0.54 43 380 48.9 38.6
0.43 40 436 48.9 57.9
suffer,您好!
我有以上一个训练样本集,其中前4列的数据为输入,后一列数据为输出用小波网络进行训练,网络训练好之后,输入一组数据如:0.41 42 444 48.9,希望得出它对应的输出值。
请问用上面的程序能实现吗?谢谢!

suffer 发表于 2006-10-24 15:46

应该是可以的,你试试吧,这个程序我也没用过,只是简单的看了看

lsq001 发表于 2006-11-1 17:00

先顶起
这个看起来还是不错的
希望更多人看到
学些一下

wateropt 发表于 2006-11-2 22:34

原帖由 橄榄石 于 2006-10-23 22:17 发表
0.38 37 526 47.6 56.9
0.38 43 526 47.6 58.1
0.49 43 408 47.6 46.5
0.49 31 408 47.6 46.4
0.57 31 351 47.6 32.6
0.57 37 351 47.6 34.7
0.33 32 606 48.9 68.5
0.33 38 606 48.9 72.3
0.43...
就是,最好能有 个计算实例就好了

wateropt 发表于 2006-11-2 22:36

程序中的
eta=0.02;aerfa=0.935
代表什么意思?

suffer 发表于 2006-11-7 11:04

原帖由 wateropt 于 2006-11-2 22:36 发表
程序中的
eta=0.02;aerfa=0.935
代表什么意思?


参考改进型bp算法
页: [1] 2
查看完整版本: 小波神经网络程序