小波神经网络(时间序列预测)

                                Matlab(小波神经网络时间序列预测)

时间序列数据

66 64 60 58 17 49 34 17 8 53 15 15 45 57 33 42 8 52 24 29 -13 37 37 4 32 38 68 77 95 119 161 184 276 247 251 193 226 213 195 182 166 188 149 132 167 181 203 219 226 216 234 197 219 230 247 238 259 270 232 202 243 223 202 235 184 215 217 209 199 197 226 217 254 243 281 285 285 251 288 236 266 214 213 186 209 176 163 199 171 170 134 128 72 113 94 78 42 25 21 32

 

输入向量与输出向量的确定

输入向量:预测时间点的前4个数据

输出向量:预测时间点的数据

 

代码调试分析

%设置网络节点数

M = size(input,2);   %输入层节点数(input:N x M)

n = 6;                     %隐含层节点数

N = size(output,2); %输出层节点数(output:N x 1)

 

%设置网络权值初始化

Wjk = randn(n,M);Wjk_1 = Wjk;Wjk_2 = Wjk_1;     %输入层-隐含层权值

Wij = randn(N,n);Wij_1 = Wjk;Wij_2 = Wjk_1;     %隐含层-输出层权值

a = randn(1,n);a_1 = a;a_2 = a_1;                 %小波函数的平移因子

b = randn(1,n);b_1 = a;b_2 = b_1;                 %小波函数的伸缩因子

 

%权值学习增量初始化

d_Wjk=zeros(n,M);

d_Wij=zeros(N,n);

d_a=zeros(1,n);

d_b=zeros(1,n);

%设置学习率

lr1 = 0.01;

lr2 = 0.001;

time = 1000; %最大迭代次数

 

%数据归一化

[inputn,inputps] = mapminmax(input');      %归一化的数据格式:M x N

[outputn,outputps] = mapminmax(output');  %归一化的数据格式:1 x N

inputn = inputn';

outputn = outputn';

 

%节点初始化

y=zeros(1,N);

net=zeros(1,n);

net_ab=zeros(1,n);

 

%网络训练

for i=1:time

    error(i) = 0; %保存训练误差

    for kk=1:size(input,1)

        %提取输入输出数据

        x=inputn(kk,:);         

        yqw=outputn(kk,:);

        %网络预测输出

        for j=1:n               

            for k=1:M

                net(j)=net(j)+Wjk(j,k)*x(k);

                net_ab(j)=(net(j)-b(j))/a(j);

            end

            temp=mymorlet(net_ab(j));   %小波函数

            for k=1:N

                y=y+Wij(k,j)*temp;   

            end

        end

        %计算误差和

        error(i)=error(i)+sum(abs(yqw-y));

        %权值调整

        for j=1:n

            %计算d_Wij(隐含层-输出层权值修正)

            temp=mymorlet(net_ab(j));

            for k=1:N

                d_Wij(k,j)=d_Wij(k,j)-(yqw(k)-y(k))*temp;

            end

            %计算d_Wjk(输入层-隐含层权值修正)

            temp=d_mymorlet(net_ab(j));

            for k=1:M

                for l=1:N

                    d_Wjk(j,k)=d_Wjk(j,k)+(yqw(l)-y(l))*Wij(l,j) ;

                end

                d_Wjk(j,k)=-d_Wjk(j,k)*temp*x(k)/a(j);

            end

            %计算d_b(输出层阈值修正)

            for k=1:N

                d_b(j)=d_b(j)+(yqw(k)-y(k))*Wij(k,j);

            end

            d_b(j)=d_b(j)*temp/a(j);

            %计算d_a(隐含层阈值修正)

            for k=1:N

                d_a(j)=d_a(j)+(yqw(k)-y(k))*Wij(k,j);

            end

            d_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

function y=mymorlet(t)

y = exp(-(t.^2)/2) * cos(1.75*t);

end

%网络预测

test = mapminmax('apply',input_test',inputps);

test = test';

for i=1:size(test,1)

    vec = test(i,:);

    for j=1:n

        for k=1:M

            net(j) = net(j)+Wjk(j,k)*vec(k);

            net_ab(j)=(net(j)-b(j))/a(j);

        end

        temp=mymorlet(net_ab(j));

        for k=1:N

            y(k)=y(k)+Wij(k,j)*temp ;

        end

    end

    yuce(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,'-or')

hold on

plot(output_test,'b--')

猜你喜欢

转载自blog.csdn.net/qq_42394743/article/details/81587756
今日推荐