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