📄 wavenet.m
字号:
%step1--------网络初始化-------------------------------------------clc;clear all;%设定期望的误差最小值err_goal=0.01;%设定最大循环次数max_epoch=50;%设定修正权值的学习速率0.01-0.7lr=0.6;%设定动量因子的大小0-1af=0.6;epoch=0;%产生一个1--60之间的随机数Y=randperm(9);mm=Y(1);%%四种故障模式,训练数据有60个 xxxx=[0.2286 0.1292 0.0720 0.1592 0.1335 0.0733 0.1159 0.0940 0.0522 0.1345 0.0090 0.1260 0.3619 0.0690 0.1828; 0.2090 0.0947 0.1393 0.1387 0.2558 0.0900 0.0771 0.0882 0.0393 0.1430 0.0126 0.1670 0.2450 0.0508 0.1328; 0.0442 0.0880 0.1147 0.0563 0.3347 0.1150 0.1453 0.0429 0.1818 0.0378 0.0092 0.2251 0.1516 0.0858 0.0670; 0.2603 0.1715 0.0702 0.2711 0.1491 0.1330 0.0968 0.1911 0.2545 0.0871 0.0060 0.1793 0.1002 0.0789 0.0909; 0.3690 0.2222 0.0562 0.5157 0.1872 0.1614 0.1425 0.1506 0.1310 0.0500 0.0078 0.0348 0.0451 0.0707 0.0880; 0.0359 0.1149 0.1230 0.5460 0.1977 0.1248 0.0624 0.0832 0.1640 0.1002 0.0059 0.1503 0.1837 0.1295 0.0700; 0.1759 0.2347 0.1829 0.1811 0.2922 0.0655 0.0774 0.2273 0.2056 0.0925 0.0078 0.1852 0.3501 0.1680 0.2668; 0.0724 0.1909 0.1340 0.2409 0.2842 0.0450 0.0824 0.1064 0.1909 0.1586 0.0116 0.1698 0.3644 0.2718 0.2494; 0.2634 0.2258 0.1165 0.1154 0.1074 0.0657 0.0610 0.2623 0.2588 0.1155 0.0050 0.0978 0.1511 0.2273 0.3220];dd=[1 0 0;1 0 0;1 0 0; 0 1 0;0 1 0;0 1 0; 0 0 1;0 0 1;0 0 1];M=15;%输入节点的个数N=3;%输出节点的个数n=31;%隐层节点的个数5-15%是通过经验公式设定的,具体哪个好,要通过观察训练误差的大小来决定Wjk=randn(n,M);Wij=randn(N,n);vWjk=zeros(n,M);vWij=zeros(N,n);a=randn(1,n);%a=1:1:n;%a=[7 7 7 7 7 7 7 7 7 7 7 7 7];b=randn(1,n);va=zeros(1,n);vb=zeros(1,n);% stepa=0.2*(x(M)-x(1));% a=stepa:1n-1)+stepa;% step=(x(M)-x(1))/n;% b=x(1)+step:step:x(1)+n*step;% y=zeros(1,N);%输出节点初始化y=zeros(1,N);%输出节点初始化net=zeros(1,n);%隐形节点初始化net_ab=zeros(1,n);%隐形节点初始化%初始化一个保存误差的向量sse=zeros(1,1601);mmm=1;%初始化一个保存测试误差的向量PP=1;ssee=zeros(1,100);mmmm=1;YY=randperm(20);cm=YY(1);%x=xx(mm,:);d=dd(mm,:);%%step2--------对网络进行训练-------------------------------------------%for i=1:1:Nfor j=1:1:nfor k=1:1:Mnet(j)=net(j)+Wjk(j,k)*x(k);net_ab(j)=(net(j)-b(j))/a(j);endy(i)=y(i)+Wij(i,j)*mymorlet(net_ab(j));%mymorlet是morlet小波% y(i)=mysigmoid(2,y(i));endy(i)=mysigmiod(y(i));end% plot(x,d,'r',x,y); % title('训练前的目标序列和实际输出序列');err=d-y;SSE=err*err'/2; % 总体误差 %step3--------调整各个参数-------------------------------------------while (epoch<max_epoch)%while (SSE>err_goal & epoch<max_epoch)d_Wjk=zeros(n,M);d_Wij=zeros(N,n);d_a=zeros(1,n);d_b=zeros(1,n);for i=1:1:Nfor j=1:1:nd_Wij(i,j)=(d(i)-y(i))*(1-y(i))*y(i);%调整d_Wij(i,j)for k=1:1:M d_Wjk(j,k)=d_Wjk(j,k)+(d(i)-y(i))*(1-y(i))*y(i)*Wij(i,j) ;%计算还没有结束d_Wjk(j,k)=d_Wjk(j,k)*d_mymorlet(net_ab(j))*x(k)/a(j);%计算结束end%调整d_Wjk(j,k)d_b(j)=d_b(j)+(d(i)-y(i))*(1-y(i))*y(i)*Wij(i,j);%计算还没有结束d_b(j)=-d_b(j)*d_mymorlet(net_ab(j))/a(j);%计算结束%调整d_b(j)d_a(j)=d_a(j)+(d(i)-y(i))*(1-y(i))*y(i)*Wij(i,j);%计算还没有结束d_a(j)=-d_a(j)*d_mymorlet(net_ab(j))*((net(j)-b(j))/a(j))/a(j);%计算结束%调整d_a(j)endend%step4--------网络重新计算-------------------------------------------%修正各个权值lWij=Wij;lWjk=Wjk;lb=b;la=a;Wij=Wij+lr*d_Wij+af*vWij;Wjk=Wjk+lr*d_Wjk+af*vWjk;b=b+lr*d_b+af*vb;a=a+lr*d_a+af*va;%修正从上次调整量中提取出的量vWij=Wij-lWij;vWjk=Wjk-lWjk;vb=b-lb;va=a-la;y=zeros(1,N);%输出节点初始化net=zeros(1,n);%隐形节点初始化net_ab=zeros(1,n);%隐形节点初始化%Y=randperm(9);mm=Y(1);x=xx(mm,:);d=dd(mm,:);%xfor i=1:1:Nfor j=1:1:nfor k=1:1:Mnet(j)=net(j)+Wjk(j,k)*x(k);net_ab(j)=(net(j)-b(j))/a(j);endy(i)=y(i)+Wij(i,j)*mymorlet(net_ab(j));endy(i)=mysigmiod(y(i));endepoch=epoch+1;err=d-y;SSE=(err*err')/2;%sse(mmm)=SSE;mmm=mmm+1;%epoch%训练一次后,测试一下%end %总的end%step5--------输出-------------------------------------------%plot(x,d,'r',x,y,':'); %title('训练后的目标序列和实际输出序列');% gtext({'This is the first line','This is the second line'})% gtext({'First line','Second line'},'FontName','Times','Fontsize',12)%legend('target output','WNN output',1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -