您的位置:首页 > 理论基础 > 计算机网络

使用BP神经网络做预测

2016-02-26 01:41 429 查看
我们知道人大脑信息的传递、对外界刺激产生反应都由神经元控制的,人脑就是由上百亿个的这样神经元构成。这些神经元之间并不孤立而且联系很密切,每个神经元平均与几千个神经元相连接,因此构成了人脑的神经网络。刺激在神经网络中的传播是遵循一定的规则的,一个神经元并非每次接到其他神经传递过来的刺激都产生反应。它首先会将与其相邻的神经元传来的刺激进行积累,到一定的时候产生自己的刺激将其传递给一些与它相邻的神经元。这样工作的百亿个的神经元构成了人脑对外界进行的反应。而人脑对外界刺激的学习的机制就是通过调节这些神经元之间联系以及其强度。当然,实际上以上说的是对人脑真正神经工作的一种简化的生物模型,利用这种简化的生物模型可以将它推广至机器学习中来,并把它描述成人工神经网络。

**

我们举个做预测的例子来说明BP神经网络在人工智能方面的运用。

**

%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);

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






用BP神经网络做预测,一般将已有数据分成两部分,一部分用作神经网络的训练,一部分作为预测可靠性的验证。

另外,这里提供一个神经网络一般参数和写法的模板:

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*')

%inputWeights=net.iw{1,1}
%layerWeights=net.lw{2,1}
%inputbias=net.b{1}
%layerbias=net.b{2}
%save mynet net;
%load mynet net;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: