小波神经网络BP 神经网络主要存在易陷入局部最小值、收敛速度过慢(网络不收敛)、网 络结构无法确定、对于训练样本要求过高(数据波动不能太大)等问题。小波神经网络是以BP 神经网络为模型基础,把小波基函数作为神经网隐藏 层的激活函数的一种新型神经网络,它与BP 神经网络最大的不同就是他们的隐 藏层的激活函数不一样。因此小波神经网络是一种有反馈的前馈式神经网络,小 波变换可以使网络具有很快的学习速度同时也避免了数据陷入局部极小的缺陷, 使其具有了很广泛的应用领域。例如一束普通白光具有不同频率的波形,想要采集这束白光的信息,需要对 不同频率的波形进行分析。小波分析是时间与空间的局部分析,它可以通过伸缩 平移对信号进行多段细分,分别细分为高频处和第频处,小波分析可以通过平移 和伸缩变换逼近任意函数使其具有了良好的精度和容错性,而且在维空间有选择 信号方向的能力,从而使结果更加精确且具有较高的容错性。。目前两者能通过两种方式相互结合:第一“松散型”结合方式,先对数据信号 做小波分析处理,再把处理完的信号输入神经网络中;第二“紧致型”结合方式, 用小波基函数代替神经网络隐含层众多激活函数,这种模型同时具有了神经网络 和小波变换的优点。
一般的“紧致型”小波神经网络处理数据的能力更强。 1.初始化相关参数 q(1,2,...,n)p p 令为输入信号样本的个数,第 个样本的输入值为 , 为第 个pxi ykpp 样本的网络输出值, 为样本的输出目标值。输入层与隐含层、隐含层与输出zkab 层之间的连接权值为 、 。设伸缩因子为 ,平移因子为 。且按照下式wwij kjii 进行平移与伸缩。1 t b (t) (i )a,baiai 2.建立小波基函数 在 Hilbert 向量空间中选取一个母小波函数(基本小波函数) (t),使其满足 (w )2dw ( 为的Fourier 变换)。通过的伸缩和平移变 (w ) (t) (t)w R 换产生小波函数基:1 x b (x)()a,baa 其中a、b 分别为伸缩尺度因子和平移因子。 目前小编只验证了一个小波基函数如下,数据的预测主要靠小波基函数,本文 的程序处理波动数据较一般的神经网络好一点,对于其他类型的数据就 自己去找相应的小波基函数,小波基函数也可通过计算可得,网上也有相应的算 法。
y = exp(-(t.^2)/2) * cos(1.75*t); 从而建立小波神经网络激活函数 (小波基函数是小波函数的一部分): Iw x b Jji i j* i 1yw kkj aj 1 j 3.预测网络输出、计算误差 4. 网络权值修正 5.优化收敛速度 6.判断训练是否结束 该程序适于对波动程序进行预测,数据录入较繁琐,可以用Excel 来调整数据然 后复制进程序中然后再次预测下一个 程序:针对数据运行环境:Matlab2011a %% 清空环境变量 clc clear %% 网络参数配置 load traffic_flux input output input_test output_test M=size(input,2); %输入节点个数 N=size(output,2); %输出节点个数 n=6; %隐形节点个数 lr1=0.01; %学习概率 lr2=0.001; %学习概率 maxgen=3000; %迭代次数 %权值初始化 Wjk=randn(n,M);Wjk_1=Wjk;Wjk_2=Wjk_1; Wij=randn(N,n);Wij_1=Wij;Wij_2=Wij_1; a=randn(1,n);a_1=a;a_2=a_1; b=randn(1,n);b_1=b;b_2=b_1; %节点初始化 y=zeros(1,N); net=zeros(1,n); net_ab=zeros(1,n); %权值学习增量初始化 d_Wjk=zeros(n,M); d_Wij=zeros(N,n); d_a=zeros(1,n); d_b=zeros(1,n); %% 输入输出数据归一化 [inputn,inputps]=mapminmax(input'); [outputn,outputps]=mapminmax(output'); inputn=inputn'; outputn=outputn'; %%网络训练 for i=1:maxgen%误差累计error(i)=0;% 循环训练for kk=1:size(input,1)x=inputn(kk,:);yqw=outputn(kk,:);for j=1:nfor k=1:Mnet(j)=net(j)+Wjk(j,k)*x(k);net_ab(j)=(net(j)-b(j))/a(j);endtemp=mymorlet(net_ab(j));for k=1:Ny=y+Wij(k,j)*temp;%小波函数endend%计算误差和error(i)=error(i)+sum(abs(yqw-y));%权值调整for j=1:n%计算d_Wijtemp=mymorlet(net_ab(j));for k=1:Nd_Wij(k,j)=d_Wij(k,j)-(yqw(k)-y(k))*temp;end%计算d_Wjktemp=d_mymorlet(net_ab(j));for k=1:Mfor l=1:Nd_Wjk(j,k)=d_Wjk(j,k)+(yqw(l)-y(l))*Wij(l,j) ;endd_Wjk(j,k)=-d_Wjk(j,k)*temp*x(k)/a(j);end%计算d_bfor k=1:Nd_b(j)=d_b(j)+(yqw(k)-y(k))*Wij(k,j);endd_b(j)=d_b(j)*temp/a(j);%计算d_afor k=1:Nd_a(j)=d_a(j)+(yqw(k)-y(k))*Wij(k,j);endd_a(j)=d_a(j)*temp*((net(j)-b(j))/b(j))/a(j);end%权值参数更新Wij=Wij-lr1*d_Wij;Wjk=Wjk-lr1*d_Wjk;b=b-lr2*d_b;a=a-lr2*d_a;d_Wjk=zeros(n,M);d_Wij=zeros(N,n);d_a=zeros(1,n);d_b=zeros(1,n);y=zeros(1,N);net=zeros(1,n);net_ab=zeros(1,n);Wjk_1=Wjk;Wjk_2=Wjk_1;Wij_1=Wij;Wij_2=Wij_1;a_1=a;a_2=a_1;b_1=b;b_2=b_1;end end %% 网络预测 %预测输入归一化 x=mapminmax('apply',input_test',inputps); x=x'; %网络预测 for i=1:11x_test=x(i,:);for j=1:1:nfor k=1:1:Mnet(j)=net(j)+Wjk(j,k)*x_test(k);net_ab(j)=(net(j)-b(j))/a(j);endtemp=mymorlet(net_ab(j));for k=1:Ny(k)=y(k)+Wij(k,j)*temp ;endendyuce(i)=y(k);y=zeros(1,N);net=zeros(1,n);net_ab=zeros(1,n); end %预测输出反归一化 ynn=mapminmax('reverse',yuce,outputps); %% 结果分析 figure(1) plot(ynn,'r*:') hold on plot(output_test,'bo--') title('XX','fontsize',12) legend('预测','实际') xlabel('时间点') ylabel('值') l=1:1:maxgen; figure(2) plot(l,error(l))%训练误差变化图 接下来说一下数据的录入,假如有14 个数据,预测前需要检验下,下面是第几 个数据的标号。
数据标号为1 到14inputoutput 12345 23456 34567 45678 56789input_testoutput_test(时间序列预测段数据) 678910 7891 91121314 最后运行出的ynn 预测数据和output_test 的对比曲线。如果相近且达到上图修正效果,那 么采用ynn 文件数据并继续按标号更替input_test 和output_test 中的数据,循环下去,直到 运行出较满意的数据和曲线。如果不相近则多次运行,取效果最好的数据和曲线。 举个例子 首先录入数据 (20 个数据) input=[数据矩阵] ;output=[数据矩阵] ;input_test=[数据矩阵];output_test=[数据矩阵] 然后选中,点击右键,save as 保存为traffic_flux ,也可以自己命名。 运行出来的ynn 及对比图如下(每次运行都不一样): 训练误差 如果要预测下一年,则将output_test 中的数据转移到input_test 第5 列。然后将 第1 列删掉。 然后将这部分锁掉,之后逐年预测就改input ,output,input_test 就行了。改动后在matlab 界面输save traffic_flux 预测的结
发表评论