📄 bpelmanrbfgrnn.m
字号:
data =[1990,44624,97.4,38474,307.8,469,3.1,170199;1991,43529,98,55472,347.6,519,2.9,168471;1992,44266,103.4,51333,376,603,3,165840;1993,45649,113.4,48829,440.5,687,3,165764;1994,44510,139.9,55043,533,958,3,162816;1995,46662,119.9,45821,547.9,1155,3,165090;1996,50454,104.2,46989,700.4,1248,4.9,168822;1997,49417,95.5,53429,766.4,1379,5.5,169368;1998,51230,92,50145,1154.8,1399,9.1,170681;1999,50839,87.8,49981,1085.8,1363,9.1,169741;2000,46218,96.4,54688,1231.5,1260,9.7,162694;2001,45264,103.1,52155,1456.7,1201,10.3,159120;2002,45706,99.7,47119,1580.8,1031,9.9,155836;2003,43070,104.4,54506,1754.5,869,12.4,149116;2004,46947,113.1,37106,2357.9,582,13.2,152409;]
yucecishu=2;%预测次数
n=0;%预测项数初始化
k=15;%数据总项数
for xxxx=1:yucecishu
k=k+n;
for xxx=2:8
c=xxx;%源数据在源数据库中列数
n=3;%结果向量项数
date=4;%样本年数
tet=0;%数据仿真项数.要求tet<k/2.
if c==2,
t=5000;%预留的波动幅度
elseif c==3,
t=50;%预留的波动幅度
elseif c==4,
t=5000;%预留的波动幅度
elseif c==5,
t=500;%预留的波动幅度
elseif c==6,
t=500;%预留的波动幅度
elseif c==7,
t=5;%预留的波动幅度
elseif c==8,
t=5000;%预留的波动幅度
end
a=0.2;%标准化数据下限
b=0.7;%标准化数据的最大值限制
dataname='cPdata';%选择数据源:cPdata为原始数据;cPwave为波动数据
method='grnn';%选择神经网络训练方法:rbf为径向基网络;elman为反馈网络;grnn为广义回归网络;bp为前向网络
m1=k-(date+n)+1;
%%%%%%%%%%%%----------参数设置部分结束---------- %%%%%%%%%%%%%%
wave=data(2:k,c)-data(1:(k-1),c)%计算前后两年的变动
%%%%%%%%%%%%----------数据计算部分结束---------- %%%%%%%%%%%%%%
for i=1:(date+n)
Pdata(1:m1,i)=data(i:(m1-1+i),c) %录入股市原始数据
Pwave(1:m1-1,i)=wave(i:(m1+i-2),:) %录入波动数据
end
%%%%%%%%%%%%----------数据录入部分结束---------- %%%%%%%%%%%%%%
if (strcmp(dataname,'cPdata'))
m=m1-1;
Psourse=Pdata;
elseif (strcmp(dataname,'cPwave'))
m=m1-2;
Psourse=Pwave;
end
%%%%%%%%%%%%----------数据选择部分结束---------- %%%%%%%%%%%%%%
pmax=max(max(Psourse(:,:)))+t;
pmin=min(min(Psourse(:,:)))-t;
for i=1:(m-1)
for j=1:(date+n)
p2(i,j)=b*(Psourse(i,j)-pmin)/(pmax-pmin)+a; %数据标准化
end
end
P1=p2(1:(m-tet-1),1:date)';%截取样本向量
T1=p2(1:(m-tet-1),(date+1):(date+n))';%截取样本结果向量z
P_test=p2((m-tet):(m-1),1:date)';%数据仿真样本
%%%%%%%%%%%%----------训练数据选择部分结束---------- %%%%%%%%%%%%%%
if (strcmp(method,'rbf'))
spread=5000;%径向基函数分布密度
net=newrbe(P1,T1,spread);%径向基神经网络函数
elseif (strcmp(method,'bp'))
S2 = n; % 输出层的神经元个数
S1 = 20; %中间层有20个神经元
threshold(1:date,1)=0;
threshold(1:date,2)=1;
net=newff(threshold,[S1,S2],{'tansig','logsig'},'trainrp');%带反弹的BP训练函数
net.trainParam.epochs=80000;
net.trainParam.goal=0.0000001;
LP.lr=0.05;
net=train(net,P1,T1);
elseif (strcmp(method,'elman'))
S2 = n; % 输出层的神经元个数
S1 = 20; %中间层有20个神经元
threshold(1:date,1)=0;
threshold(1:date,2)=1;
net=newelm(threshold,[S1,S2],{'tansig','purelin'});
%设定网络训练次数
net.trainParam.epochs=80000;
net.trainParam.goal=0.0000001;
net=train(net,P1,T1);
elseif (strcmp(method,'grnn'))
spread=0.025;%径向基函数分布密度
net=newgrnn(P1,T1,spread);
%网络对训练数据的逼近
end
%%%%%%%%%%%%----------训练网络选择及参数设置部分结束---------- %%%%%%%%%%%%%%
%%%%%%%%%%%%----------神经网络训练部分结束---------- %%%%%%%%%%%%%%
YP=sim(net,P1);%数据仿真
YP1=((pmax-pmin)*((YP-a)/b))+pmin; %仿真数据反标准化
TP_TEXT1=((pmax-pmin)*((T1-a)/b))+pmin;%数据仿真样本结果反标准化
X=T1-YP;%仿真误差
X1=TP_TEXT1-YP1;%仿真误差反标准化
Y=sim(net,P_test);%数据仿真
Y1=((pmax-pmin)*((Y-a)/b))+pmin; %仿真数据反标准化
T_TEXT=p2((m-tet):(m-1),(date+1):(date+n))';%数据仿真样本结果
T_TEXT1=((pmax-pmin)*((T_TEXT-a)/b))+pmin;%数据仿真样本结果反标准化
X2=T_TEXT-Y;%仿真误差
X3=T_TEXT1-Y1;%仿真误差反标准化
Ysim=sim(net,p2((m-1),date:(date+n))')';%最终预测
Ysim1(xxx-1,:)=((pmax-pmin)*((Ysim-a)/b))+pmin;%最终预测反标准化
net= init(net);
end
%%%%%%%%%%%%----------神经网络仿真部分结束---------- %%%%%%%%%%%%%%
Y2=Ysim1';
if (strcmp(dataname,'cPdata'))
for xxx1=1:n
data(k+xxx1,2:8)=Y2(xxx1,1:7);
end
elseif (strcmp(dataname,'cPwave'))
for xxx1=1:n
data(k+xxx1,2:8)=Y2(xxx1,1:7)+data(k+xxx1-1,2:8);
end
end
end
subplot(2,2,1);plot(X', 'DisplayName', 'X', 'YDataSource', 'X'); title('仿真误差');
hold;
subplot(2,2,2);plot(X1', 'DisplayName', 'X1', 'YDataSource', 'X1'); title('仿真误差反标准化');
hold;
subplot(2,2,3:4);plot(Ysim1', 'DisplayName', 'Ysim1', 'YDataSource', 'Ysim1'); title('最终预测结果反标准化');
hold;
%%%%%%%%%%%%----------绘图部分结束---------- %%%%%%%%%%%%%%
Ysim1
%%%%%%%%%%%%---------- 程序结束---------- %%%%%%%%%%%%%%
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -