BP神经网络的基本应用
公式提取
提取模型的数学表达式
作者 : 老饼 日期 : 2022-06-09 05:22:36 更新 : 2022-09-27 10:42:22
本站原创文章,转载请说明来自《老饼讲解-BP神经网络》bp.bbbdata.com



当我们在matlab训练好网络后,可以使用神经网络工具箱的sim(net,x)函数进行预测输出。

但往往想提取出它的数学表达式,该怎么提取呢?

本文讲解如何提取训练好的神经网络模型的数学表达式。



  一. 模型与数学表达式  


下面以《 一个简单的BP神经网络例子》中的模型为例,讲解如何提取神经网络表达式  ( matlab版本为2014b )。


例子中模型的网络结构如下:


1:节点个数设置: 输入层、隐层、输出层的节点个数分别为[2 ,3,1]。
2:传递函数设置:隐层( tansig函数)。输出层(purelin函数)。


模型的数学表达式如下:






 二. 提取网络相关参数 


  提取权重和阈值  


要在matlab中提取wb,可输入如下代码:
w21  =  net.iw{1,1}        % 第1层(输入层)到第2层(隐层)的权值
b2   =  net.b{1}           % 第2层(隐层)的阈值
 
w32  =  net.lw{2,1}        % 第2层(输入层)到第3层(输出层)的权值
b3   =  net.b{2}           % 第3层(输出层)的阈值
命令窗口输出如下:




将得到 w 和 b 的值, 填入式(1)即得:

  



   提取数据归一化范围   


由于工具箱自动对数据进行归一化后,再进行训练,因此,上面的模型是针对归一化后的数据的,我们在使用时,也需要对输入进行归一化,并对输出进行反归一化。
因此,我们需要把归一化相关的输入输出范围提取出来,

输入输出范围提取方法如下:


% ------获取数据归一化时的输入输出范围,用于反归一-----
matlabMode = nnMATLAB;
matlabHints = matlabMode.hints;
matlabHints = nnMATLAB.netHints(net,matlabHints);
iMin  = matlabHints.inp.procSet{1,1}.xmin;
iMax  = matlabHints.inp.procSet{1,1}.xmax;
oMin  = matlabHints.out.procSet{1,1}.xmin;
oMax  = matlabHints.out.procSet{1,1}.xmax;



   使 用 流 程   


流程使用如下:



    将需要预测的输入进行归一化     --->    通过模型得到预测结果    ---->    将结果反归一化   

其中,
● 输入归一化公式为:  

  

● 输出的反归一函数如下:

  




  三 . Demo代码  


下面展示一个由建模,到参数提取,到模型应用的Demo代码。

matlab2014b亲测已跑通:



%本代码展示一个提取神经网络表达式的DEMO
%转载请说明来自 《老饼讲解神经网络》 bp.bbbdata.com
% --------------生成训练数据------------------
x1 = [-3,-2.7,-2.4,-2.1,-1.8,-1.5,-1.2,-0.9,-0.6,-0.3,0,0.3,0.6,0.9,1.2,1.5,1.8];% x1:x1 = -3:0.3:2;
x2 = [-2,-1.8,-1.6,-1.4,-1.2,-1,-0.8,-0.6,-0.4,-0.2,-2.2204,0.2,0.4,0.6,0.8,1,1.2]; % x2:x2 = -2:0.2:1.2;
y  = [0.6589,0.2206,-0.1635,-0.4712,-0.6858,-0.7975,-0.8040,...
          -0.7113,-0.5326,-0.2875 ,0,0.3035,0.5966,0.8553,1.0600,1.1975,1.2618];    % y: y = sin(x1)+0.2*x2.*x2;

inputData  = [x1;x2];      % 将x1,x2作为输入数据
outputData = y;            % 将y作为输出数据
setdemorandstream(88888);%指定随机种子,这样每次训练出来的网络都一样。

%---------训练网络------------------
net = newff(inputData,outputData,3,{'tansig','purelin'},'trainlm');

%设置一些常用参数
net.trainparam.goal = 0.0001;               % 训练目标:均方误差低于0.0001
net.trainparam.show = 400;                  % 每训练400次展示一次结果
net.trainparam.epochs = 15000;              % 最大训练次数:15000.
[net,tr] = train(net,inputData,outputData); % 调用matlab神经网络工具箱自带的train函数训练网络

% ------------网络预测-------------------
simout = sim(net,inputData);                % 调用matlab神经网络工具箱自带的sim函数得到网络的预测值

% ------获取权重和阈值---------------
disp('-----权重和阈值-----')
w21  =  net.iw{1,1}        % 第1层(输入层)到第2层(隐层)的权值
b2   =  net.b{1}           % 第2层(隐层)的阈值
 
w32  =  net.lw{2,1}        % 第2层(输入层)到第3层(输出层)的权值
b3   =  net.b{2}           % 第3层(输出层)的阈值

% ------获取数据归一化时的输入输出范围,用于反归一-----
matlabMode = nnMATLAB;
matlabHints = matlabMode.hints;
matlabHints = nnMATLAB.netHints(net,matlabHints);
iMin  = matlabHints.inp.procSet{1,1}.xmin;
iMax  = matlabHints.inp.procSet{1,1}.xmax;
oMin  = matlabHints.out.procSet{1,1}.xmin;
oMax  = matlabHints.out.procSet{1,1}.xmax;

% --------用数学表达式进行预测------------
%数据归一化
normInputData=2*(inputData -repmat(iMin,1,size(inputData,2)))./repmat(iMax-iMin,1,size(inputData,2)) -1;
%用表达式预测
norm_py = w32 *tansig( w21 *normInputData + repmat(b2,1,size(normInputData,2))) + repmat(b3,1,size(normInputData,2));
%预测结果反归一化
py = (norm_py+1).*(repmat(oMax-oMin,1,size(norm_py,2)))/2 + repmat(oMin,1,size(norm_py,2));
%比较预测结果与工具箱预测的是否一致
max_e = max(max(abs(py - simout)))





 End 









联系小饼