导读:数学建模程序 Matlab神经网络预测旅游人口,也可以稍作修改用来预测失业率,你懂的...
s=[493 372 445;372 445 176;445 176 235;176 235 378;235 378 429; 378 429 561;429 561 651;561 651 467;651 467 527;467 527 668; 527 668 841;668 841 526;841 526 480;526 480 567;480 567 685]; p=s'; t=[176 235 378 429 561 651 467 527 668 841 526 480 567 685 507]; %数据归一化处理 %mapminmax函数默认将数据归一化到[-1,1] [normInput,ps]=mapminmax(p); [normTarget,ts]=mapminmax(t); %将输入的15组数据的20%,即3组,用来作为测试数据; % 样本的20%,即3组,用来作为变化数据; %另外9组用来正常输入,用来训练; testPercent=0.20; % Adjust as desired validatePercent=0.20; % Adust as desired [trainSamples,validateSamples,testSamples]=dividevec(normInput,normTarget,validatePercent,testPercent); % 设置网络参数 for j=1:200 NodeNum1=20; % 隐层第一层节点数 NodeNum2=40; % 隐层第二层节点数 TypeNum=1; % 输出维数 TF1='tansig';TF2='tansig';TF3='tansig';%各层传输函数,TF3为输出层传输函数 %如果训练结果不理想,可以尝试更改传输函数,以下这些是各类传输函数 %TF1 = 'tansig';TF2 = 'logsig'; %TF1 = 'logsig';TF2 = 'purelin'; %TF1 = 'tansig';TF2 = 'tansig'; %TF1 = 'logsig';TF2 = 'logsig'; %TF1 = 'purelin';TF2 = 'purelin'; net=newff(minmax(normInput),[NodeNum1,NodeNum2,TypeNum],{TF1 TF2 TF3},'traingdx');%网络创建 % 设置训练参数 net.trainParam.epochs=10000;%训练次数设置 net.trainParam.goal=1e-6;%训练目标设置 net.trainParam.lr=0.01;%学习率设置,应设置为较少值,太大虽然会在开始加快收敛速度,但临近最佳点时,会产生动荡,而致使无法收敛 % 指定训练参数 %--------------------------------------------------- % net.trainFcn = 'traingd'; % 梯度下降算法 % net.trainFcn = 'traingdm'; % 动量梯度下降算法 % % net.trainFcn = 'traingda'; % 变学习率梯度下降算法 % net.trainFcn = 'traingdx'; % 变学习率动量梯度下降算法 % % (大型网络的首选算法) % net.trainFcn = 'trainrp'; % RPROP(弹性BP)算法,内存需求最小 % % (共轭梯度算法) % net.trainFcn = 'traincgf'; % Fletcher-Reeves修正算法 % net.trainFcn = 'traincgp'; % Polak-Ribiere修正算法,内存需求比Fletcher-Reeves修正算法略大 % net.trainFcn = 'traincgb'; % Powell-Beal复位算法,内存需求比Polak-Ribiere修正算法略大 % % (大型网络的首选算法) %net.trainFcn = 'trainscg'; % Scaled Conjugate Gradient算法,内存需求与Fletcher-Reeves修正算法相同,计算量比上面三种算法都小很多 % net.trainFcn = 'trainbfg'; % Quasi-Newton Algorithms - BFGS Algorithm,计算量和内存需求均比共轭梯度算法大,但收敛比较快 % net.trainFcn = 'trainoss'; % One Step Secant Algorithm,计算量和内存需求均比BFGS算法小,比共轭梯度算法略大 % % (中型网络的首选算法) %net.trainFcn = 'trainlm'; % Levenberg-Marquardt算法,内存需求最大,收敛速度最快 % net.trainFcn = 'trainbr'; % 贝叶斯正则化算法 % % 有代表性的五种算法为:'traingdx','trainrp','trainscg','trainoss', 'trainlm' net.trainfcn='traingdm'; [net,tr] = train(net,trainSamples.P,trainSamples.T,[],[],validateSamples,testSamples); [normTrainOutput,Pf,Af,E,trainPerf] = sim(net,trainSamples.P,[],[],trainSamples.T);%正常输入的9组p数据,BP得到的结果t [normValidateOutput,Pf,Af,E,validatePerf] = sim(net,validateSamples.P,[],[],validateSamples.T);%用作变量3的数据p,BP得到的结果t [normTestOutput,Pf,Af,E,testPerf] = sim(net,testSamples.P,[],[],testSamples.T);%用作测试的3组数据p,BP得到的结果t trainOutput = mapminmax('reverse',normTrainOutput,ts);%正常输入的9组p数据,BP得到的归一化后的结果t trainInsect = mapminmax('reverse',trainSamples.T,ts);%正常输入的9组数据t validateOutput = mapminmax('reverse',normValidateOutput,ts);%用作变量3的数据p,BP得到的归一化的结果t validateInsect = mapminmax('reverse',validateSamples.T,ts);%用作变量3的数据t testOutput = mapminmax('reverse',normTestOutput,ts);%用作变量3组数据p,BP得到的归一化的结果t testInsect = mapminmax('reverse',testSamples.T,ts);%用作变量3组数据t %绝对误差计算 absTrainError = trainOutput-trainInsect; absTestError = testOutput-testInsect; error_sum=sqrt(absTestError(1).^2+absTestError(2).^2+absTestError(3).^2); All_error=[absTrainError absTestError error_sum]; eps=90;%其为3组测试数据的标准差,或者每个数据偏差在一定范围内而判别 if ((abs(absTestError(1))<=30 )&(abs(absTestError(2))<=30)&(abs(absTestError(3))<=30)|(error_sum<=eps)) save mynetdata net break end j end j Min_error_sqrt=min(All_error) testOutput testInsect %--------------------------------------------------- % 数据分析和绘图 %--------------------------------------------------- figure plot(1:12,[trainOutput validateOutput],'b-',1:12,[trainInsect validateInsect],'g--',13:15,testOutput,'m*',13:15,testInsect,'ro'); title('o为真实值,*为预测值') xlabel('各组'); ylabel('交通量(辆次/昼夜)'); figure xx=1:length(All_error); plot(xx,All_error) title('误差变化图')