话不多说,直接分享几个可执行的神经网络代码,仅供学习交流
%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;4335 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];
ptest=[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 2889 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 =20; % 隐层第一层节点数
NodeNum2=40; % 隐层第二层节点数
TypeNum = 1; % 输出维数
TF1 = 'tansig';
TF2 = 'tansig';
TF3 = 'tansig';
net=newff(minmax(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=train(net,pn,tn);
%---------------------------------------------------
% 设置训练参数
%---------------------------------------------------
%net.trainParam.epochs=10000;%训练次数设置
%net.trainParam.goal=1e-6;%训练目标设置
%PL.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);
%---------------------------------------------------
% 训练完成后,就可以调用sim()函数,进行仿真了
%---------------------------------------------------
p2n=tramnmx(ptest,minp,maxp);%测试数据的归一化
an=sim(net,p2n);
[a]=postmnmx(an,mint,maxt) %数据的反归一化 ,即最终想得到的预测结果
plot(1:length(t),t,'o',1:length(t)+1,a,'+');
title('O表示预测值---+表示实际值')
grid on
m=length(a); %向量a的长度
t1=[t,a(m)];
error=t1-a; %误差向量
figure
plot(1:length(error),error,'-.')
title('误差变化图')
grid on
clc,clear,clf
P=[0 0 0 0 0 0 0 0;
0 0 1 1 1 1 1 1;
0 0 2 2 2 2 2 2;
0 1 0 0 1 1 2 2;
0 1 1 1 2 2 0 0;
0 1 2 2 0 0 1 1;
0 2 0 1 0 2 1 2;
0 2 1 2 1 0 2 0;
0 2 2 0 2 1 0 1;
1 0 0 2 2 1 1 0;
1 0 1 0 0 2 2 1;
1 0 2 1 1 0 0 2;
1 1 0 1 2 0 2 1;
1 1 1 2 0 1 0 2;
1 1 2 0 1 2 1 0;
1 2 0 2 1 2 0 1;
1 2 1 0 2 0 1 2;
1 2 2 1 0 1 2 0;]';
%按每行为一个样本输入并装置,下次输入直接按列做样本即可。
T = [53.44096386 137.9638554 99.42409639 91.27951807 177.2987952 203.8819277 23.80481928 171.2120482 146.1445783 144.9253012 ...
55.84096386 127.7445783 110.653012 170.6626506 128.0361446 225.6795181 46.55421687 124.1012048];
[P PS_P]=mapminmax(P,0.1,0.9)
%max min按列求最大最小,标准化处理还可以[P,minp,maxp,T,mint,maxt] = premnmx(P,T)
[T PS_T]=mapminmax(T,0.1,0.9)
n=length(T)
n1=10%设置用来训练的样本个数
n2=n-n1
rd=randperm(n)%随机打乱一个数字序列
P1=P(:,rd(1:n1))
P2=P(:,rd(n1+1:n))
%将样本分为训练样本和监控样本
T1=T(rd(1:n1));%训练的
T2=T(rd(n1+1:n))%监控的
net=newff(minmax(P),[7,1],{'logsig','purelin'},'traingdx');
%训练前馈网络的第一步是建立网络对象
%常用的激活函数有线性函数purelin 对数s形转移logsig 双曲正切tansig 激活函数无论对于识别率或收敛速度都有显著的影响。在逼近高次曲线时,S形函数精度比线性函数要高得多,但计算量也要大得多
%常用训练函数有traingd traingdx trainscg
%traninglm等 隐含节点个数过多会增加运算量,使得训练较慢。
%learn属性 'learngdm' 附加动量因子的梯度下降学习函数
%net.iw{1,1}= inputWeights
%net.lw{2,1}=layerWeights
%net.b{1}=inputbias
%net.b{2}=layerbias
net.trainParam.mc = 0.8;
%动量因子一般取0.6 ~0.8
net.trainParam.epochs = 1000;
net.trainParam.show = 10;
net.trainParam.goal = 1e-2;
net.performParam.ratio=0.7;
%训练速率越大,权重变化越大,收敛越快;
%但训练速率过大,会引起系统的振荡,
%因此,训练速率在不导致振荡前提下,越大越好。一般取0.9
net.trainParam.lr=0.05;
%学习率设置偏小可以保证网络收敛,但是收敛较慢。
%相反,学习率设置偏大则有可能使网络训练不收敛,影响识别效果。
[net,tr]=train(net,P1,T1);%net=init(net)
%[ net, tr, Y1, E ] = train( net, X, Y )
%参数:X:网络实际输入Y:网络应有输出 tr:训练跟踪信息 Y1:网络实际输出 E:误差矩阵
T1_sim=sim(net,P1)
T2_sim=sim(net,P2)
e1=sum(abs((T1_sim-T1)./T1))/n1
e2=sum(abs((T2_sim-T2)./T2))/n2%求相对平均误差绝对值
en=e1*n1/n+e2*n2/n%逼近误差
dn=100/exp(10*en)%逼近度
net=init(net)
subplot(1,2,1),plot(T1);hold on;plot(T1_sim,'r')
subplot(1,2,2),plot(T2,':mo');hold on;plot(T2_sim,'-.r*')