什么是BP神经网络
BP神经网络是1986年由Rumelhart和McClelland为首的科学家提出的概念,是一种按照误差逆向传播算法训练的多层前馈神经网络,是应用最广泛的神经网络。它的基本思想是梯度下降法,利用梯度搜索技术,以期使网络的实际输出值和期望输出值的误差均方差为最小。
BP神经网络由输入层、隐含层、输出层三大层组成,其中隐含层可以为一层或多层。隐含层内的神经元与外界没有直接的联系,但其状态的改变能影响输入和输出之间的关系。
如何应用BP神经网络进行预测
MATLAB中可以实现BP神经网络预测,只要通过输入输入层神经元,及设定隐含层层数、节点数及预测精度的控制要求就可以实现预测。它的原理实际上是分析输入神经元与输出神经元的非线性关系,这就要求输出项参数实际上是与输入项参数需要具有一定的关联性。
BP网络构建
(1)生成BP网络
PR:由R维的输入样本最小最大值构成的R*2维矩阵。
[S1S2...SN]:各层的神经元个数。
{TF1 TF2 ...TFN}:各层的神经元传递函数。
BTF:训练用函数的名称。
(2)网络训练
(3)网络仿真
BP网络的训练函数
BP网络训练参数
BP网络举例
举例1
双输入单输出五组样本 网络结构是2-5-1
%traingd
clear;
clc;
P=[-1 -1 2 2 4;0 5 0 5 7];
T=[-1 -1 1 1 -1];
%利用minmax函数求输入样本范围
net = newff(minmax(P),[5,1],{'tansig','purelin'},'trainrp');
net.trainParam.show=50;%
net.trainParam.lr=0.05;
net.trainParam.epochs=300;
net.trainParam.goal=1e-5;
[net,tr]=train(net,P,T);
net.iw{1,1}%隐层权值
net.b{1}%隐层阈值
net.lw{2,1}%输出层权值
net.b{2}%输出层阈值
sim(net,P)%网络输出
举例2
利用三层BP神经网络来完成非线性函数的逼近任务,其中隐层神经元个数为五个。
样本数据:
解:
看到期望输出的范围是(-1.1),所以利用双极性Sigmoid函数作为转移函数。
程序如下:
clear;
clc;
X=-1:0.1:1;
D=[-0.9602 -0.5770 -0.0729 0.3771 0.6405 0.6600 0.4609...
0.1336 -0.2013 -0.4344 -0.5000 -0.3930 -0.1647 -.0988...
0.3072 0.3960 0.3449 0.1816 -0.312 -0.2189 -0.3201];
figure;
plot(X,D,'*'); %绘制原始数据分布图(附录:1-1)
net = newff([-1 1],[5 1],{'tansig','tansig'});
net.trainParam.epochs = 100; %训练的最大次数
net.trainParam.goal = 0.005; %全局最小误差
net = train(net,X,D);
O = sim(net,X);
figure;
plot(X,D,'*',X,O); %绘制训练后得到的结果和误差曲线(附录:1-2、1-3)
V = net.iw{1,1}%输入层到中间层权值
theta1 = net.b{1}%中间层各神经元阈值
W = net.lw{2,1}%中间层到输出层权值
theta2 = net.b{2}%输出层各神经元阈值
所得结果如下:
输入层到中间层的权值:
中间层各神经元的阈值:
中间层到输出层的权值:
输出层各神经元的阈值:
权值直接确定法:
format long
clc;
clear;
xi=-1:0.1:1;xi=xi';
yi=[-0.9602 -0.5770 -0.0729 0.3771 0.6405 0.6600 0.4609...
0.1336 -0.2013 -0.4344 -0.5000 -0.3930 -0.1647 -.0988...
0.3072 0.3960 0.3449 0.1816 -0.312 -0.2189 -0.3201];
numSMP=length(yi); %样本个数
numW=25; %隐层神经元个数
xiM=[];
for jj=0:1:(numW-1)
xiM=[xiM,xi.^jj]; %
end
W=pinv(xiM)*yi'; %隐层最优权值
figure;
plot(xi,yi,'k*',xi,xiM*W,'r:')
举例3
利用三层BP神经网络来完成非线性函数的逼近任务,其中隐层神经元个数为五个。
样本数据:
解:
看到期望输出的范围超出(-1,1),所以输出层神经元利用线性函数作为转移函数。
程序如下:
clear;
clc;
X = [0 1 2 3 4 5 6 7 8 9 10];
D = [0 1 2 3 4 3 2 1 2 3 4];
figure;
plot(X,D,'*'); %绘制原始数据分布图
net = newff([0 10],[5 1],{'tansig','purelin'})
net.trainParam.epochs = 100;
net.trainParam.goal=0.005;
net=train(net,X,D);
O=sim(net,X);
figure;
plot(X,D,'*',X,O); %绘制训练后得到的结果和误差曲线(附录:2-2、2-3)
V = net.iw{1,1}%输入层到中间层权值
theta1 = net.b{1}%中间层各神经元阈值
W = net.lw{2,1}%中间层到输出层权值
theta2 = net.b{2}%输出层各神经元阈值
所得结果如下:
输入层到中间层的权值:
中间层各神经元的阈值:
中间层到输出层的权值:
输出层各神经元的阈值:
• END •
模友们可能已经发现:现在公众号推送文章的顺序,已经不会按时间排列了。这种变化,可能会让各位模友错过我们每天的推送。
所以,如果你还想像往常一样,聚焦数模乐园,就需要将“数模乐园”标为星标公众号,同时在阅读完文章后,别忘了给一个“在看”哦。
星标步骤
(1)点击页面最上方“数模乐园”,进入公众号主页
(2)点击右上角的小点点,在弹出页面点击“设为星标”,就可以啦。
扫码关注我们
2020夏令营QQ交流群
球分享
球点赞
球在看