小波神經網絡(時間序列預測)

                                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--')

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章