📄 mallet.m
字号:
clc
clear
a=[ 26.00 27.50 26.63 27.00 27.50 27.25 27.25 28.50 27.88 28.23 28.45 28.23 27.90 28.00 28.00 27.60 27.90 27.75 28.30 28.65 28.65 28.50 29.00 28.80 26.60 27.75 26.80 26.75 27.25 27.00]';
x1=a(1:9); y1=a(12);
x2=a(4:12); y2=a(15);
x3=a(7:15); y3=a(18);
x4=a(10:18); y4=a(21);
x5=a(13:21); y5=a(24);
x6=a(16:24); y6=a(27);
x7=a(19:27); y7=a(30);
%x8=a(22:30); y8=a(33);
%x9=a(25:33); y9=a(36);
%x10=a(28:36);y10=a(39);
%x11=a(31:39);y11=a(42);
%x=[x1 x2 x3 x4 x5 x6 x7 ];
y=[y1 y2 y3 y4 y5 y6 y7];
%%%%%%进行输入数据的归一化
[x1n,meanx1,stdx1]=prestd(x1);
[x2n,meanx2,stdx2]=prestd(x2);
[x3n,meanx3,stdx3]=prestd(x3);
[x4n,meanx4,stdx4]=prestd(x4);
[x5n,meanx5,stdx5]=prestd(x5);
[x6n,meanx6,stdx6]=prestd(x6);
[x7n,meanx7,stdx7]=prestd(x7);
%[x8n,meanx8,stdx8]=prestd(x8);
%[x9n,meanx9,stdx9]=prestd(x9);
%[x10n,meanx10,stdx10]=prestd(x10);
%[x11n,meanx11,stdx11]=prestd(x11);
xn=[x1n x2n x3n x4n x5n x6n x7n];
I=size(xn,1);P=size(xn,2);
%%%%%%%%%%%%使目标向量归一化
yn=y./29;
%%%%%%%%%%%%给出学习率、动量因子等参数
eta=0.02;%学习率取的适当可以加快误差的减小
aerfa=0.965;%动量因子
max_perf_inc=1.04;
lr_dec=0.7;
lr_inc=1.05;c=0.5;
%假设小波函数节点数为:H个;样本数为P;
%输出节点数为:J个;输入节点数为:I个;
H=2*I+1;
J=1;
%%%%%%%%%%%%%%%%%%%%初始化权系数,阈值,小波参数;
whi=rand(I,H);
wjh=rand(H,J);
b1=rand(H,1);
b=rand(H,1);
a=rand(H,1);
b2=rand(J);
%%%%%%%%%%%保存的误差;
for p=1:P
Err_NetOut=[];
flag(p)=1;count(p)=0;
while flag(p)>0 %进入小波神经网络的运行过程
flag(p)=0;
count(p)=count(p)+1;
xhp1(p)=0;
%%%%%%%%%%%求隐层的输入值
for h=1:H
for i=1:I
xhp1(p)=xhp1(p)+whi(i,h)*xn(i,p);%求权值和输入值的乘积和
end
ixhp(h,1)=xhp1(p)+b1(h,1);%求隐层的输入值
xhp1(p)=0;
end
%%%%%%%%%%%求隐层的输出值
for h=1:H
oxhp(h,1)=fai((ixhp(h,1)-b(h,1))/a(h,1));%将小波函数(mallet)作为隐层的传递函数求隐层的输出值
end
%%%%%%%%%%%求输出层的输入值
ixjp1=0;
for h=1:H
ixjp1=ixjp1+wjh(h,1)*oxhp(h,1);
end
ixjp=ixjp1+b2(1);%求输出层的输入值
%%%%%%%%%%求输出层的输出值
ixjp2=c.*ixjp;
oxjp(p)=fnn(ixjp2); %求输出层的输出(运用的是sigmoid函数(fnn)加了一个伸缩因子c)
%%%%%%%%%%%求误差并保存
wuchayy=1/2*sumsqr(oxjp(p)-yn(p));%求输出值与目标值差值的平方和
Err_NetOut=[Err_NetOut wuchayy];%保存每次的误差;
%调节学习率eta==================================================
if count(p)==1
eta=eta;
else
if Err_NetOut(count(p))/Err_NetOut(count(p)-1)>max_perf_inc
eta=eta*lr_dec;
else eta=eta*lr_inc;
end
end
%%%%%%%%%%%%%求网络参数的梯度值
detaj=-c*(oxjp(p)-yn(p))*oxjp(p)*(1-oxjp(p));%在误差函数中对输出层的输入值求偏导并取负值
for h=1:H
detawjh(h,1)=eta*detaj*oxhp(h,1);%误差函数对隐层和输出层之间的权值的偏导
end
detab2=eta*detaj;%误差函数对输出层的阈值的偏导
for h=1:H
detah(h,1)=detaj*wjh(h,1)*diffai((ixhp(h,1)-b(h,1))/a(h,1))/a(h,1);%difmallet()函数是mallet()函数的导数,该行是求误差函数对隐层输入值的偏导
end
for h=1:H
for i=1:I
detawhi(i,h)=eta*detah(h,1)*xn(i,p);%求误差函数对输入层和隐层之间的权值的偏导
end
end
detab1=eta*detah;
detab=-eta*detah;%求误差函数对小波函数中的平移因子的偏导
for h=1:H
detaa(h,1)=-eta*detah(h,1)*((ixhp(h,1)-b(h,1))/a(h,1));%求误差函数对隐层的小波函数中的收缩因子的偏导
end
detac=ixjp*detaj/c
%%%%%%%%%%%%%%%%%%引入动量因子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;
c=c+(1+aerfa)*detac;
%%%%%%%%%%%%%%%%%%%将输出恢复到原始范围=======================================
oxjpn(p)=oxjp(p)*29;
%%%%%%%%%%%%%%%%%%网络循环计算的判断条件
if Err_NetOut(end)>1e-8
flag(p)=flag(p)+1;
else
figure;
plot(Err_NetOut);
title('误差曲线x(p)');
disp('目标达到');
disp(oxjpn(p));
disp(count);
end
if count>2000
figure;
plot(Err_NetOut);
title('误差曲线');
disp('目标未达到');
disp(oxjpn(p));
end
%break; %跳出避免死循环
disp(oxjpn(p));
end
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -