本站原创文章,转载请说明来自《老饼讲解-BP神经网络》www.bbbdata.com
当我们在matlab训练好网络后,可以使用神经网络工具箱的sim(net,x)函数进行预测输出
但往往想提取出它的数学表达式,该怎么提取呢?本文讲解如何提取训练好的神经网络模型的数学表达式
通过本文,可以了解如何在训练好BP神经网络后,将它的数学表达式提取出来,并使用它对新样本进行预测
本节讲解如何提取matlab的BP神经网络模型的数学表达式
如何提取-BP神经网络数学表达式
下面以《 一个简单的BP神经网络例子》中的模型为例,讲解如何提取BP神经网络数学表达式
例子中的BP神经网络结构如下:
1:节点个数设置: 输入层、隐层、输出层的节点个数分别为[2 ,3,1]
2:传递函数设置:隐层( tansig函数)。输出层(purelin函数)
数学表达式如下:
在matlab中训练好BP神经网络后,要提取wb,可输入如下代码:
代码运行结果输出如下:
将得到 w 和 b 的值, 填入式(1)即得:
如何使用-BP神经网络数学表达式
由于神经网络工具箱自动对数据进行归一化后,再进行模型训练
因此,上面提取的模型表达式是针对归一化后的数据的
在使用提取出的BP神经网络数学表达式时,需要对输入进行归一化、对输出进行反归一化
如图所示,先将需要预测的输入进行归一化,再通过模型得到预测结果 ,最后将结果反归一化
其中,输入归一化、输出反归一化的公式如下:
输入归一化公式 :
输出反归一化公式:
本节展示一个完整的提取BP神经网络模型表达式的代码示例
matlab提取BP神经网络数学表达式-DEMO代码
下面是一个由建模,到数学表达式提取,到模型应用的完整BP神经网络Demo代码
% 本代码展示一个提取神经网络表达式的DEMO(笔者测试代码的版本:matlab2018a)
% 转载请说明来自 《老饼讲解神经网络》 www.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)))
运行结果如下:
如图所示,就可以使用提取的权重、阈值代入BP神经网络的数学表达式
使用提取的数学表达式计算的结果,与用工具箱的sim函数的预测结果是一致的
好了,以上就是如何提取BP神经网络的数学表达式的全部内容了~
End