BP神经网络的基本应用
建模流程
【代码】BP神经网络建模代码(完整代码)
作者 : 老饼 日期 : 2022-10-28 23:31:03 更新 : 2022-11-02 10:19:58
本站原创文章,转载请说明来自《老饼讲解-BP神经网络》bp.bbbdata.com



本文展示一个完整的BP神经网络建模例子,用于理解和学习整体建模流程

本文是《BP神经网络建模流程(完整步骤)》的实现代码


   代码简介   


本文展现一个按照标准建模流程来实现BP神经网络的DEMO,
包含归一化、训练与测试数据分割、BP网络设置与训练、
训练结果与测试结果展示、模型的使用、提取数学公式、打印表达式等
在实际建模中,复制该代码进行修改即可,代码较为全面,可依需要进行删减



   01. 代码思路   


本例从  中采取100个样本,
利用生成的100个样本建立BP神经网络,然后与原函数进行比较
步骤包括
                                                    
👉 数据 (0)  数据生成                                       
 👉 建模 (1)  数据归一化                                     
(2)  训练测试数据分割            
(3)  网络设置                         
(4)  网络训练                         
(5)  展示训练结果                  
(6)  测试数据的预测结果        
👉 应用 (7)  模型的使用                                   
(8)  提取模型的表达式           
(9)  模型表达式的反归一化    
 👉 附加 (10) 模型表达式的打印                         



     02. 具体代码   


clear all;close all ;
%------------------原始数据-----------------------------------
x1 = linspace(-3,3,100);     % 在[-3,3]之间线性生成100个数据
x2 = linspace(-2,1.5,100);   % 在[-2,1.5]之间线性生成100个数据
y = 10*sin(x1)+0.2*x2.*x2;   % 生成y

inputData  = [x1;x2];        % 将x1,x2作为输入数据
outputData = y;              % 将y作为输出数据

%--------------数据预处理:归一化-------------------------------
%由于有归一化,必须先将归一化信息抓取出来
iMax = max(inputData,[],2);
iMin = min(inputData,[],2);
oMax = max(outputData,[],2);
oMin = min(outputData,[],2);

normInputData=2*(inputData -repmat(iMin,1,size(inputData,2)))./repmat(iMax-iMin,1,size(inputData,2)) -1;
normOutPutData=2*(outputData -repmat(oMin,1,size(outputData,2)))./repmat(oMax-oMin,1,size(outputData,2)) -1;

%---------------数据预处理:预留检验数据----------------------------------
randIndex  = randperm(100);
trainIndex = sort(randIndex(1:80));                 % 随机选出80个数据作为训练数据(这里先选出数据的序号)
testIndex  = sort(randIndex(81:100));               % 将剩下的20个数据作为检验数据(这里先选出数据的序号)

inputData_train  = normInputData(:,trainIndex);     % 根据序号选出80个用于训练的输入
inputData_test   = normInputData(:,testIndex);      % 根据序号选出20个用于检验的输入
outputData_train = normOutPutData(:,trainIndex);    % 根据序号选出80个用于训练的输出
outputData_test  = normOutPutData(:,testIndex);     % 根据序号选出20个用于检验的输出

%----------------网络训练 -----------------------------------------------
%使用用输入输出数据(inputData_train、outputData_train)建立网络,
% 隐节点个数设为3.其中输入层到隐层、隐层到输出层的节点分别为tansig和purelin,使用trainlm方法训练。
net = newff(inputData_train,outputData_train,3,{'tansig','purelin'},'trainlm');

%设置一些常用参数
net.trainparam.goal        = 0.00001;    % 训练目标:均方误差低于0.0001
net.trainparam.show        = 400;        % 每训练400次展示一次结果
net.trainparam.epochs      = 15000;      % 最大训练次数:15000.
net.divideParam.trainRatio = 0.85;       % 用于训练的数据比例
net.divideParam.valRatio   = 0.15 ;      % 用于验证过拟合的数据比例
net.divideParam.testRatio  = 0;          % 注意要关掉测试数据占比

[net,tr] = train(net,inputData_train,outputData_train);  % 调用matlab神经网络工具箱自带的train函数训练网络

%----------训练数据的拟合效果-----------------------------
figure;
%训练数据的拟合效果
simout_train = sim(net,inputData_train);
subplot(2,1,1);
title('训练数据的拟合效果')
hold on
t=1:length(simout_train);
plot(t,outputData_train,t,simout_train,'r')%画图,对比原来的y和网络预测的y

%检验数据的拟合效果
simout_test = sim(net,inputData_test);
subplot(2,1,2);
title('未训练数据的拟合效果')
hold on

t=1:length(simout_test);
plot(t,outputData_test,t,simout_test,'r')%画图,对比原来的y和网络预测的y

%-----------------------真正使用时的流程--------------------
X        = [-2.9;-1.9];                         % 要预测的X
normX    = 2*(X -iMin)./(iMax-iMin) -1;         % 对X归一化
normSimY = sim(net,normX);                      % 用网络预测
simy     = (normSimY+1).*(oMax-oMin)./2 + oMin; % 对结果反归一

%----------------------提取表达式(对应归一化数据)------------------------------------
%提取权重
w12 = net.iw{1,1};                          % 第1层(输入层)到第2层(隐层)的权值
b2 = net.b{1};                              % 第2层(隐层)的神经元阈值

w23 = net.lw{2,1};                          % 第2层(输入层)到第3层(输出层)的权值
b3 = net.b{2};                              % 第3层(输出层)的神经元阈值

%对应的数学表达式:
sim_y_norm = w23 *tansig( w12 *inputData + repmat(b2,1,size(inputData,2))) + repmat(b3,1,size(inputData,2));

%----------------------提取表达式(对应原始数据)------------------------------------
%权重反归一化
W12 = w12 * 2 ./repmat(iMax' -iMin',size(w12,1),1);
B2  = -w12* (2*iMin ./(iMax - iMin) + 1) + b2;

W23 = w23 .*repmat((oMax -oMin),1,size(w23,2))/2;
B3  = (oMax -oMin) .*b3 /2 + (oMax -oMin)/2 + oMin;

%最终的数学表达式:
sim_y = W23 *tansig( W12 *inputData + repmat(B2,1,size(inputData,2))) + repmat(B3,1,size(inputData,2));

%验证数学表达式与工具箱预测结果一致
net_sim_y   = sim(net,normInputData);
net_sim_y   = (net_sim_y+1).*(oMax-oMin)./2 + oMin;  % 对结果反归一
formula_err = max(max(abs(net_sim_y - sim_y)));



     03. 代码运行结果   


代码运行结果如下



     04. 打印模型表达式   


将《打印BP表达式Demo》的代码保存为printBpModel.m文件,
再执行
fcell = printBpModel(W12,B2,W23,B3);
即可打印出训练好的BP神经网络的数学表达式,
显示如下:

   





 End 












联系老饼