神经网络训练(建模过程的有关细节略去)
案例数据存放地点:
A=xlsread('d:\ganglengque.xlsx'); X=A(:,1:end-1)';Y=A(:,end)';
编写一个负梯度训练子程序
function [W1,W2,B1,B2,eb,s2]=BPnn(X,Y,n1,n,lr,sig) [X]=mapminmax(X); % 对输入数据进行归一化处理 [Y,s2]=mapminmax(Y); % 对输出数据进行归一化处理 W1=rand(n1,13); % 随机初始化输入到隐藏层的权重矩阵 B1=rand(n1,1); % 随机初始化隐藏层的偏置向量 W2=rand(1,n1); % 随机初始化隐藏层到输出层的权重矩阵 B2=rand(1,1); % 随机初始化输出层的偏置向量 E=ones(size(Y)); % 创建一个与输出数据大小相同的向量 eb=[]; % 用于保存每轮训练的误差 for i=1:n % 进行 n 轮训练 I1=X; % 输入数据 O1=I1; % 输入层的输出等于输入数据 I2=W1*O1+B1*E; % 隐含层的输入 O2=logsig(I2); % 隐含层的输出 I3=W2*O2+B2*E; % 输出层的输入 O3=I3; % 输出层的输出 err=Y-O3; % 计算实际输出与目标输出的误差 hrr=sum(err.^2)^0.5; % 计算均方根误差,也就是网络的性能指标 eb=[eb,hrr]; % 将每轮训练的性能指标添加到误差向量中 if hrr<sig % 如果性能指标小于给定阈值 sig,则停止训练 Xt=datetime; disp(Xt); % 输出停止训练的时间 break; end dW2=err*O2'; % 输出层到隐含层权重的梯度 dB2=err*E'; % 输出层偏置的梯度 dW1=((W2'*err).*(O2.*(1-O2)))*X'; % 隐含层到输入层权重的梯度 dB1=((W2'*err).*(O2.*(1-O2)))*E'; % 隐含层偏置的梯度 W1=W1+lr*dW1; % 更新输入到隐藏层的权重矩阵 B1=B1+lr*dB1; % 更新隐藏层的偏置向量 W2=W2+lr*dW2; % 更新隐藏层到输出层的权重矩阵 B2=B2+lr*dB2; % 更新输出层的偏置向量 end plot(1:length(Y),Y,'--',1:length(Y),O3,'*-'); % 绘制实际输出和网络输出的曲线 legend('样本输出','网络输出');
输入变量
样本输入X;样本输出Y;隐含层神经元n1;训练次数n;学习效率lr;误差容许sig;
输出变量
按要求训练得到的权系数W1,W2,B1,B2;各次训练残差痕迹向量eb;输出样本归一化信息s2.
【基于案例的网络训练效果与参数的关系】
1、其余要素不变,训练次数与误差的关系
将训练后的网络输出与样本输出(都归一化)绘制散点图,可以看出拟合好坏(即误差直观体现)
A=xlsread('d:\ganglengque.xlsx'); X=A(:,1:end-1)';Y=A(:,end)'; n1=12;lr=0.035;sig=0.003; [W1,W2,B1,B2,eb,s2]=BPnn(X,Y,n1,20,lr,sig); [W1,W2,B1,B2,eb,s2]=BPnn(X,Y,n1,60,lr,sig); [W1,W2,B1,B2,eb,s2]=BPnn(X,Y,n1,180,lr,sig); [W1,W2,B1,B2,eb,s2]=BPnn(X,Y,n1,500,lr,sig); [W1,W2,B1,B2,eb,s2]=BPnn(X,Y,n1,1000,lr,sig); [W1,W2,B1,B2,eb,s2]=BPnn(X,Y,n1,2000,lr,sig);
2、隐含层神经元数量与误差关系
其它要素不变,都训练500次,隐含层神经元n1分别取4,6,8,10,12,16,观察拟合效果曲线
A=xlsread('d:\ganglengque.xlsx'); X=A(:,1:end-1)';Y=A(:,end)'; n=1000,lr=0.035;sig=0.003; [W1,W2,B1,B2,eb,s2]=BPnn(X,Y,4,n,lr,sig); [W1,W2,B1,B2,eb,s2]=BPnn(X,Y,6,n,lr,sig); [W1,W2,B1,B2,eb,s2]=BPnn(X,Y,8,n,lr,sig); [W1,W2,B1,B2,eb,s2]=BPnn(X,Y,10,n,lr,sig); [W1,W2,B1,B2,eb,s2]=BPnn(X,Y,12,n,lr,sig); [W1,W2,B1,B2,eb,s2]=BPnn(X,Y,16,n,lr,sig);
3、学习效率与误差关系
它输入因素不变,训练次数n=500,隐含层神经元n1=12,让学习效率lr分别取0.1,0.05,0.02,0.01,0.005,0.001,观察拟合曲线的效果
4、利用训练好的网络进行预测
对n1=12,n=4000,lr=0.035,案例1提供的训练样本,输出训练好的权系数。如图所示,训练效果很好。
A=xlsread('d:\ganglengque.xlsx'); X=A(:,1:end-1)';Y=A(:,end)'; n=4000;n1=12;sig=0.003;lr=0.035; [W1,W2,B1,B2,eb,s2]=BPnn(X,Y,n1,n,lr,sig);
训练完成的权系数W1,W2,B1,B2保存在表2中,用不同颜色区分。
W1= |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
B1= |
1 |
0.05 |
-0.84 |
0.97 |
0.96 |
0.18 |
0.20 |
0.85 |
0.00 |
0.80 |
1.30 |
-0.37 |
0.23 |
0.76 |
0.28 |
2 |
-0.65 |
1.74 |
0.41 |
-0.37 |
-0.41 |
0.60 |
0.65 |
0.38 |
0.48 |
1.63 |
1.55 |
1.83 |
0.35 |
0.46 |
3 |
0.57 |
0.86 |
0.79 |
0.45 |
1.55 |
0.17 |
0.67 |
0.78 |
0.24 |
0.27 |
0.90 |
1.07 |
0.66 |
-0.17 |
4 |
0.30 |
0.00 |
0.32 |
1.05 |
0.22 |
0.25 |
0.74 |
0.75 |
0.77 |
0.63 |
0.52 |
0.24 |
-0.09 |
0.45 |
5 |
0.23 |
0.08 |
0.76 |
0.85 |
-0.69 |
1.48 |
0.26 |
0.55 |
0.48 |
1.80 |
-0.03 |
0.00 |
-0.67 |
0.40 |
6 |
1.79 |
-0.87 |
-1.57 |
0.92 |
0.50 |
2.29 |
0.36 |
0.33 |
0.79 |
0.94 |
0.02 |
0.93 |
-0.35 |
0.07 |
7 |
0.30 |
0.35 |
0.71 |
1.04 |
0.45 |
0.11 |
0.80 |
0.89 |
0.89 |
0.60 |
0.26 |
0.40 |
0.59 |
0.14 |
8 |
3.15 |
0.16 |
-0.38 |
1.66 |
-0.33 |
-0.60 |
1.83 |
0.62 |
-0.48 |
-0.38 |
1.57 |
0.10 |
1.67 |
-0.52 |
9 |
-0.33 |
-0.22 |
0.64 |
0.87 |
1.70 |
-0.21 |
0.24 |
0.83 |
0.18 |
0.39 |
0.47 |
-0.15 |
-0.55 |
0.03 |
10 |
0.52 |
0.70 |
0.12 |
0.61 |
0.82 |
0.74 |
0.94 |
1.12 |
1.01 |
0.32 |
0.31 |
0.38 |
0.48 |
0.55 |
11 |
0.90 |
0.70 |
0.71 |
0.85 |
1.00 |
0.66 |
0.29 |
0.50 |
1.07 |
0.79 |
0.34 |
0.54 |
0.32 |
0.11 |
12 |
1.12 |
0.28 |
2.61 |
1.13 |
0.00 |
-0.72 |
1.32 |
0.69 |
1.08 |
-0.18 |
2.17 |
1.17 |
-0.25 |
0.63 |
W2= |
0.82 |
-1.11 |
0.80 |
-0.03 |
0.95 |
1.88 |
-0.15 |
-1.62 |
-1.12 |
-0.06 |
-0.05 |
1.38 |
B2= 0.16 |
5、避免过度拟合,需要对样本输出做干扰处理
对网络输入(已经归一化后的数据),在添加一个噪声向量,即Y=Y+noise,一般noise为均值为0的正态分布 ,即noise=normrnd(0,1,size(Y); Y=Y+r*noise;
r为噪声强度,一般r非常小。
取r=0.01,加入BP神经网络拟合中,代码如下
function [W1,W2,B1,B2,eb,s2]=BPnnn(X,Y,n1,n,lr,sig) [X]=mapminmax(X); [Y,s2]=mapminmax(Y); noise=normrnd(0,1,size(Y)); Y=Y+0.2*noise; W1=rand(n1,13);B1=rand(n1,1); W2=rand(1,n1);B2=rand(1,1); E=ones(size(Y)); eb=[]; for i=1:n I1=X; O1=I1; I2=W1*O1+B1*E; O2=logsig(I2); I3=W2*O2+B2*E; O3=I3; err=Y-O3; hrr=sum(err.^2)^0.5; eb=[eb,hrr]; if hrr<sig Xt=datetime; disp(Xt); break; end dW2=err*O2'; dB2=err*E'; dW1=((W2'*err).*(O2.*(1-O2)))*X'; dB1=((W2'*err).*(O2.*(1-O2)))*E'; W1=W1+lr*dW1; B1=B1+lr*dB1; W2=W2+lr*dW2; B2=B2+lr*dB2; end plot(1:length(Y),Y,'--',1:length(Y),O3,'*-'); legend('Ñù±¾Êä³ö','ÍøÂçÊä³ö')
在隐含层神经元n1=12,学习效率lr=0.035,训练次数n=4000情况下,容差sig=0.003情况下,将有噪声(强度系数0.8)和无噪声两种情况的残差结果进行对比,见下图。可以看出,有噪声收敛速度慢于无噪声。
A=xlsread('d:\ganglengque.xlsx'); X=A(:,1:end-1)';Y=A(:,end)'; n1=12;lr=0.035;sig=0.003;n=4000; [W1,W2,B1,B2,eb1,s1]=BPnn(X,Y,n1,n,lr,sig); [W11,W21,B11,B21,eb2,s2]=BPnnn(X,Y,n1,n,lr,sig); subplot(2,1,1); bar(eb1); subplot(2,1,2); bar(eb2);