3.2模型建立
基于BP神经网络的非线性函数拟合算法流程可以分为BP神经网络构建、BP神经网络训练和BP神经网络预测三步。
BP神经网络模块构建中确定神经网路的结构以及学习方式,根据拟合函数的形式,采用神经网络的格式为:输入层有两个节点,输出层有一个节点,隐含层有五个节点,隐含层传递函数是‘tansig’函数,输出层传递函数是‘purlin’函数。
BP神经网络构建根据拟合非线性函数特点确定BP神经网络结构,由于该非线性函数有两个输入参数,一个输出参数,所以BP神经网络结构即输入层有2个结点,中间层有5个结点,输出层有1个结点。
BP神经网络训练用非线性函数输入输出数据训练神经网络,使训练后的网络能够预测非线性函数输出。从非线性函数中随机得到2000组输入输出数据,从中随机选择1900组作为训练数据,用于网络训练,100组作为测试数据,用于测试网络的拟合性能。神经网络预测用训练好的网络预测函数输出,并对预测结果进行分析。
BP网络来拟合一个函数,说明BP网络在函数拟合中的作用。 训练好的数据对网络性能进行预测,从而判断网络拟合函数效果。
3.3 MatLab实现
3.3.1BP神经网络工具箱函数
Matlab软件中包含Matlab神经网络工具箱。它是以人工神经网络理论为基础,用Matlab语言构造出了该理论所涉及的公式运算、矩阵操作和方程求解等大部分子程序以用于神经网络的设计和训练。用户只需根据自己的需要调用相关的子程序,即可以完成包括网络结构设计、权值初始化、网络训练及结果输出等在内的一系列工作,免除编写复杂庞大程序的困扰。目前,Matlab神经网络工具包包括的网络有感知器、线性网络、BP神经网络、径向基网络、自组织网络和回归网络等。BP神经网络主要用到newff、sim和train3个神经网络函数,各函数解释如下。
(1)newff:BP神经网络参数设置函数
函数功能:构建一个BP神经网络。
函数形式:net = newff(P,T,S,TF,BTF,BLF,PF,IPF,OPF,DDF) P:输入数据矩阵。
T:输出数据矩阵。
S:隐含层结点数。
TF:结点传递函数,包括硬限幅传递函数hardlim,对称硬限幅传递函数hardlims,线性传递函数pureline,正切S型传递函数tansig,对数S型传递函数logsig。
BTF:训练函数,包括梯度下降BP算法训练函数traingd,动量反传的梯度下降BP算法训练函数traingdm,动态自适应学习率的梯度下降BP算法训练函数traingda,动量反传和动态自适应学习率的梯度下降BP算法训练函数traingdx,Levenberg_Marquardt的BP算法训练函数trainlm。
BLF:网络学习函数,包括BP学习规格learngd,带动量项的BP学习规则learngdm。
PF:性能分析函数,包括均值绝对误差性能分析函数mae,均方差性能分析函数mse。
IPF:输入处理函数。
OPF:输出处理函数。
DDF:验证数据划分函数。
一般在使用过程中设置前面6个参数,后面4个参数采用系统默认参数。
(2)train:BP神经网络训练函数
函数功能:用训练数据训练BP神经网络。
函数形式:[net,tr] = train(NET,X,T,Pi,Ai) NET:待训练网络。 X:输入数据。 T:输出数据。
Pi:初始化输入层条件。 Ai:初始化输出层条件。 net:训练好的网络。 tr:训练过程记录。
一般在使用过程中设置前面3个参数,后面2个参数采用系统默认参数。
(3)sim:BP神经网络预测函数、
函数功能:用训练好的BP神经网络预测函数输出。 函数形式:y = sim(net,x) net:训练好的网络。 x:输入数据。 y:网络预测数据。
3.3.2实验结果
实际输出数据和神经网络的预测输出之间的结果对比图
优势分析:
神经网络预测模块既用训练好的数据对网络性能进行预测,从而判断网络拟合函数效果。
参考文献:
[1] 李晓慧.《基于MATLAB的BP神经网络的应用》[J]. 科技信息, 2010,(26) [2] 郝中华.《B P神经网络的非线性思想》. 洛阳师范学院学报2008.3(4) [3] 张玲,张钹.《人工神经网络理及应用》. 浙江:浙江科技大学出版社,1997.5:20-62
[4] 蒋宗礼.《人工神经网络导论》. 高等教育出版社,2001.5:15-90
[5] 闻新、周露、王丹力、熊晓英.《MATLAB神经网络应用设计.科学出版社》,2001.5:10-50
[6] 葛哲学、孙志强编著 .《神经网络与matlab2007实现》. 北京:电子工业出版社,2007.9:1-5
附录:
程序代码:
%% 清空环境变量 clc clear
%% 训练数据预测数据提取及归一化 %导入输入输出数据
load data input output
%从1到2000间随机排序 k=rand(1,2000); [m,n]=sort(k);
%随机选择1900组训练数据和100组预测数据 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网络训练
%初始化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);
%% BP网络预测 %预测数据归一化
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) %预测误差
error=BPoutput-output_test;
figure(2)
plot(error,'-*')
title('BP网络预测误差','fontsize',12) ylabel('误差','fontsize',12) xlabel('样本','fontsize',12)
figure(3)
plot((output_test-BPoutput)./BPoutput,'-*'); title('神经网络预测误差百分比')
errorsum=sum(abs(error))