1、BP 神经网络 matlab 源程序代码)%*%学习程序%*%=原始数据输入=p=2845 2833 4488;2833 4488 4554;4488 4554 2928;4554 2928 3497;2928 3497 2261;.3497 2261 6921;2261 6921 1391;6921 1391 3580;1391 3580 4451;3580 4451 2636;.4451 2636 3471;2636 3471 3854;3471 3854 3556;3854 3556 2659;3556 2659 4335;.2659 4335 2882;4335 2882 4084;4
2、335 2882 1999;2882 1999 2889;1999 2889 2175;.2889 2175 2510;2175 2510 3409;2510 3409 3729;3409 3729 3489;3729 3489 3172;.3489 3172 4568;3172 4568 4015; %=期望输出=t=4554 2928 3497 2261 6921 1391 3580 4451 2636 3471 3854 3556 2659 .4335 2882 4084 1999 2889 2175 2510 3409 3729 3489 3172 4568 4015 .3666; p
3、test=2845 2833 4488;2833 4488 4554;4488 4554 2928;4554 2928 3497;2928 3497 2261;.3497 2261 6921;2261 6921 1391;6921 1391 3580;1391 3580 4451;3580 4451 2636;.4451 2636 3471;2636 3471 3854;3471 3854 3556;3854 3556 2659;3556 2659 4335;.2659 4335 2882;4335 2882 4084;4335 2882 1999;2882 1999 2889;1999 28
4、89 2175;.2889 2175 2510;2175 2510 3409;2510 3409 3729;3409 3729 3489;3729 3489 3172;.3489 3172 4568;3172 4568 4015;4568 4015 3666; pn,minp,maxp,tn,mint,maxt=premnmx(p,t); %将数据归一化 NodeNum1 =4; % 隐层第一层节点数 NodeNum2=7; % 隐层第二层节点数 TypeNum = 5; % 输出维数 TF1 = tansig;TF2 = tansig; TF3 = tansig;net=newff(minm
5、ax(pn),NodeNum1,NodeNum2,TypeNum,TF1 TF2 TF3,traingdx);%网络创建traingdm net.trainParam.show=50; net.trainParam.epochs=50000; %训练次数设置 net.trainParam.goal=1e-5; %训练所要达到的精度net.trainParam.lr=0.01; %学习速率 net.trainParam.mc=0.9; net.trainParam.lr_inc=1.05;net.trainParam.lr_dec=0.7;net.trainParam.max_perf_inc=
6、1.04; net=train(net,pn,tn); p2n=tramnmx(ptest,minp,maxp);%测试数据的归一化an=sim(net,p2n);a=postmnmx(an,mint,maxt) %数据的反归一化 ,即最终想得到的预测结果plot(1:length(ttest),ttest,o,1:length(ttest),a,+); title(o表示预测值- *表示实际值)grid on%m=length(a); %向量a的长度%t1=t,a(m);error=ttest-a; %误差向量figureplot(1:length(error),error,-.) titl
7、e(误差变化图) grid on pn,minp,maxp,tn,mint,maxt=premnmx(p,t); % NodeNum1 =4; % NodeNum2=7; % TypeNum = 5; % TF1 = tansig;TF2 = tansig; TF3 = tansig;net=newff(minmax(pn),NodeNum1,NodeNum2,TypeNum,TF1 TF2 TF3,trainrp);%traingdm net.trainParam.show=50; net.trainParam.epochs=50000; % net.trainParam.goal=1e-5
8、; %net.trainParam.lr=0.01; % %net.trainParam.mc=0.9; %net.trainParam.lr_inc=1.05;%net.trainParam.lr_dec=0.7;%net.trainParam.max_perf_inc=1.04; %trainrpnet.trainParam.delt_inc=1.2;net.trainParam.delt_dec=0.5;net.trainParam.delta0=0.07;net.trainParam.deltamax=50.0;net=train(net,pn,tn); p2n=tramnmx(p,m
9、inp,maxp);%an=sim(net,p2n);a=postmnmx(an,mint,maxt) % plot(1:length(t),t,o,1:length(a),a,+); title(o- *)grid on%m=length(a); %a%t1=t,a(m);error=t-a; %figureplot(1:length(error),error,-.) title() grid on %输入参数依次为:样本 P 范围,各层神经元数目, 各层传递函数,训练函数%训练函数 traingd-梯度下降法,有 7 个训练参数.%训练函数 traingdm-有动量的梯度下降法,附加 1
10、个训练参数 mc(动量因子,缺省为 0.9)%训练函数 traingda-有自适应 lr 的梯度下降法,附加 3 个训练参数:lr_inc(学习率增长比,缺省为 1.05;% lr_dec(学习率下降比,缺省为 0.7);max_perf_inc(表现函数增加最大比,缺省为 1.04)%训练函数 traingdx-有动量的梯度下降法中赋以自适应 lr 的方法,附加 traingdm 和traingda 的 4 个附加参数%训练函数 trainrp-弹性梯度下降法,可以消除输入数值很大或很小时的误差,附加 4 个训练参数:% delt_inc(权值变化增加量,缺省为 1.2);delt_dec(
11、权值变化减小量,缺省为0.5);% delta0(初始权值变化,缺省为 0.07);deltamax(权值变化最大值,缺省为 50.0)% 适合大型网络%训练函数 traincgf-Fletcher-Reeves 共轭梯度法; 训练函数 traincgp-Polak-Ribiere 共轭梯度法;%训练函数 traincgb-Powell-Beale 共轭梯度法%共轭梯度法占用存储空间小,附加 1 训练参数 searchFcn(一维线性搜索方法,缺省为 srchcha);缺少 1 个训练参数 lr%训练函数 trainscg-量化共轭梯度法,与其他共轭梯度法相比,节约时间.适合大型网络 % 附加
12、 2 个训练参数:sigma( 因为二次求导对权值调整的影响参数,缺省为5.0e-5);% lambda(Hessian 阵不确定性调节参数,缺省为 5.0e-7)% 缺少 1 个训练参数 :lr%训练函数 trainbfg-BFGS 拟牛顿回退法,收敛速度快,但需要更多内存 ,与共轭梯度法训练参数相同,适合小网络%训练函数 trainoss-一步正割的 BP 训练法,解决了 BFGS 消耗内存的问题,与共轭梯度法训练参数相同%训练函数 trainlm-Levenberg-Marquardt 训练法,用于内存充足的中小型网络net=init(net);net.trainparam.epochs
13、=20000; %最大训练次数( 前缺省为 10,自 trainrp 后,缺省为 100)net.trainparam.lr=0.05; %学习率( 缺省为 0.01)net.trainparam.show=25; %限时训练迭代过程(NaN 表示不显示,缺省为 25)net.trainparam.goal=1e-8; %训练要求精度( 缺省为 0)%net.trainparam.max_fail 最大失败次数(缺省为 5)%net.trainparam.min_grad 最小梯度要求(前缺省为 1e-10,自 trainrp 后,缺省为 1e-6)%net.trainparam.time 最大训练时间(缺省为 inf)net,tr=train(net,P,t); %网络训练a=sim(net,H) %网络仿真