MATLAB神经网络(二):BP非线性建模

在工程应用中经常会遇到一些复杂的非线性系统,这些系统状态方程复杂,难以用数学方法准确建模。在这种情况下,可以建立BP神经网络表达这些非线性系统。该方法把未知系统看成是一个黑箱,首先用系统输入输出数据训练BP神经网络,使网络能够表达该未知函数,然后就可以用训练好的BP神经网络预测同输出。本章拟合的非线性函数为

[公式]

基于BP神经网络的非线性函数拟合算法流程可以分为BP神经网络构建、训练和预测三步。

由于该非线性函数有两个输入参数,一个输出参数,所以BP神经网络结构为2-5-1,即输入层有2个节点,隐含层有5个节点,输出层有1个节点。从非线性函数中随机得到2000组输入输出数据,从中随机选择1900组作为训练数据,用于网络训练,100组作为测试数据,用于测试网络的拟合性能。

MATLAB中包含神经网络工具箱。目前包括网络有感知器、线性网络、BP神经网络、径向基网络、自组织网络和回归网络等。主要用到newff,sim和train3个函数。

  1. newff:神经网络参数设置函数
    net=newff(P,T,S,TF,BTF,PF,IPF,OPF,DDF)
    P:输入数据矩阵。 T:输出数据矩阵。 S:隐含层节点数。 TF:节点传递函数
    BTF:训练函数,包括梯度下降BP算法训练函数traingd, 动量反传的梯度下降BP算法traingdm,动态自适应学习率的梯度下降BP算法训练函数traingda, 动量反传和动态自适应学习率的梯度下降BP算法训练函数traingdx, Levenberg_Marquardt的BP算法训练函数trainlm。
    BLF:网络学习函数
    PF:性能分析函数,包括均值绝对误差mae,均方差mse。
    IPF:输入处理函数,OPF:输出处理函数,DDF:验证数据划分函数
  2. train:BP神经网络训练函数
    [net,tr]=train(NET, X,T,Pi, Ai)
    NET:待训练网络。X:输入数据矩阵。T:输出数据矩阵。
    Pi:初始化输入层条件。Ai:初始化输出层条件。
    net:训练好的网络。tr:训练过程记录

3. sim:BP神经网络预测函数
y=sim(net,x)
x:输入数据。y:网络预测数据。

数据归一化

load data input output
k=rand(1,2000);
[m,n]=sort(k);
input_train=input(n(1:1900),:)';
output_train=output(n(1:1900),:)';
input_test=input(n(1901:2000),:)';
output_test=output(n(1901:2000),:);
[inputn,inputps]=mapminmax(input_train);
[outputn,outputps]=mapminmax(output_train);
%BP神经网络构建
net=newff(inputn,outputn,5);
%网络参数配置(迭代次数,学习率,目标)
net.trainParam.epochs=100;
net.trainParam.lr=0.1;
net.trainParam.goal=0.00004;

%神经网络训练
net=train(net,inputn,outputn);

%预测输入数据归一化
inputn_test=mapminmax('apply',input_test,inputps);
%神经网络预测输出
an=sim(net,inputn_test);
%输出反归一化
BPoutput=mapminmax('reverse',an,outputps);

%网络预测结果图形
figure(1)
plot(BPoutput,':og')
hold on
plot(output_test,'-*')
legend('预测输出','期望输出')
title('BP网络预测输出','fontsize',12)
ylabel('函数输出','fontsize',12)
xlabel('样本','fontsize',12)

%网络预测误差图形
figure(2)
plot(error,'-*')
title('BP预测误差','fontsize',12)
ylabel('误差',fontsize,12)
ylabel('样本',fontsize,12)

节点转移函数

MATLAB神经网络工具箱中newff函数提供了几种节点转移函数,主要包括:
1) logsig函数

[公式]
2)tansig函数
[公式]
3)purelin函数

[公式]
隐含层和输出层函数的选择对BP神经网络预测精度有较大影响。一般隐含层节点转移函数用logsig或tansig,输出层节点转移函数用tansig或purelin。