Matlab(小波神经网络时间序列预测)
时间序列数据:
公共号“数据统计分析与挖掘”中回复“数据”,获取本文所需数据。
公共号“数据统计分析与挖掘”中回复“书籍”,获取50本数据分析、python、统计学经典书籍。
扫描二维码,回复“数据”,获取本文所需数据。
输入向量与输出向量的确定
输入向量:预测时间点的前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--')
————————————————
版权声明:本文为CSDN博主「codeQin」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_42394743/article/details/81587756
转载:https://blog.csdn.net/weixin_45620071/article/details/102016533