当前位置:   article > 正文

一个BP的完整代码实现(供参考与收藏)_bp神经网络降噪代码

bp神经网络降噪代码

原文来自 老饼玩转-BP神经网络icon-default.png?t=N7T8http://httsp://www.bbbdata.com/nn


目录

一、代码思路简介

二、主体代码

三、附加代码:表达式打印


本文展示一个完整的BP神经网络训练例子,包含归一化、训练与测试数据分割、BP网络训练、训练结果与测试结果展示,和最后提取模型的数学表达式共6个完整步骤(使用matlab2014b)。
作为一个完整的base Demo供参考和学习。


一、代码思路简介

本例从 \text{y} = 10*\sin(x_1)+0.2*x_2^2  中采取100个样本建立BP神经网络,然后与原函数进行比较。

步骤包括

(1)数据生成
(2)数据归一化
(3)训练测试数据分割
(4)网络训练
(5)展示训练结果
(6)泛化检验-测试数据的测试结果
(7)模型的使用
(8)提取模型的表达式
(9)模型表达式的反归一化
附加:模型表达式的打印。


运行结果如下

训练得到的模型表达式

13.8247*tansig(-0.94451*x1+0.33945*x2+2.1889)+18.6309*tansig(0.38004*x1+0.38706*x2+0.095989)-15.5021*tansig(0.7589*x1-0.06713*x2+2.0389)+1.6125

二、主体代码

  1. clear all;close all ;
  2. %------------------原始数据-----------------------------------
  3. x1 = linspace(-3,3,100); % 在[-33]之间线性生成100个数据
  4. x2 = linspace(-2,1.5,100); % 在[-21.5]之间线性生成100个数据
  5. y = 10*sin(x1)+0.2*x2.*x2; % 生成y
  6. inputData = [x1;x2]; % 将x1,x2作为输入数据
  7. outputData = y; % 将y作为输出数据
  8. %--------------数据预处理:归一化-------------------------------
  9. %由于有归一化,必须先将归一化信息抓取出来
  10. iMax = max(inputData,[],2);
  11. iMin = min(inputData,[],2);
  12. oMax = max(outputData,[],2);
  13. oMin = min(outputData,[],2);
  14. normInputData=2*(inputData -repmat(iMin,1,size(inputData,2)))./repmat(iMax-iMin,1,size(inputData,2)) -1;
  15. normOutPutData=2*(outputData -repmat(oMin,1,size(outputData,2)))./repmat(oMax-oMin,1,size(outputData,2)) -1;
  16. %---------------数据预处理:预留检验数据----------------------------------
  17. randIndex = randperm(100);
  18. trainIndex = sort(randIndex(1:80)); % 随机选出80个数据作为训练数据(这里先选出数据的序号)
  19. testIndex = sort(randIndex(81:100)); % 将剩下的20个数据作为检验数据(这里先选出数据的序号)
  20. inputData_train = normInputData(:,trainIndex); % 根据序号选出80个用于训练的输入
  21. inputData_test = normInputData(:,testIndex); % 根据序号选出20个用于检验的输入
  22. outputData_train = normOutPutData(:,trainIndex); % 根据序号选出80个用于训练的输出
  23. outputData_test = normOutPutData(:,testIndex); % 根据序号选出20个用于检验的输出
  24. %----------------网络训练 -----------------------------------------------
  25. %使用用输入输出数据(inputData_train、outputData_train)建立网络,隐节点个数设为3.其中输入层到隐层、隐层到输出层的节点分别为tansig和purelin,使用trainlm方法训练。
  26. net = newff(inputData_train,outputData_train,3,{'tansig','purelin'},'trainlm');
  27. %设置一些常用参数
  28. net.trainparam.goal = 0.00001; % 训练目标:均方误差低于0.0001
  29. net.trainparam.show = 400; % 每训练400次展示一次结果
  30. net.trainparam.epochs = 15000; % 最大训练次数:15000.
  31. [net,tr] = train(net,inputData_train,outputData_train); % 调用matlab神经网络工具箱自带的train函数训练网络
  32. %----------训练数据的拟合效果-----------------------------
  33. figure;
  34. %训练数据的拟合效果
  35. simout_train = sim(net,inputData_train);
  36. subplot(2,1,1);
  37. title('训练数据的拟合效果')
  38. hold on
  39. t=1:length(simout_train);
  40. plot(t,outputData_train,t,simout_train,'r')%画图,对比原来的y和网络预测的y
  41. %检验数据的拟合效果
  42. simout_test = sim(net,inputData_test);
  43. subplot(2,1,2);
  44. title('未训练数据的拟合效果')
  45. hold on
  46. t=1:length(simout_test);
  47. plot(t,outputData_test,t,simout_test,'r')%画图,对比原来的y和网络预测的y
  48. %-----------------------真正使用时的流程--------------------
  49. X= [-2.9;-1.9]; % 要预测的X
  50. normX=2*(X -iMin)./(iMax-iMin) -1; % 对X归一化
  51. normSimY = sim(net,normX); % 用网络预测
  52. simy = (normSimY+1).*(oMax-oMin)./2 + oMin; % 对结果反归一
  53. %----------------------提取表达式(对应归一化数据)------------------------------------
  54. %提取权重
  55. w12 = net.iw{1,1}; % 第1层(输入层)到第2层(隐层)的权值
  56. b2 = net.b{1}; % 第2层(隐层)的神经元阈值
  57. w23 = net.lw{2,1}; % 第2层(输入层)到第3层(输出层)的权值
  58. b3 = net.b{2}; % 第3层(输出层)的神经元阈值
  59. %对应的数学表达式:
  60. sim_y_norm = w23 *tansig( w12 *inputData + repmat(b2,1,size(inputData,2))) + repmat(b3,1,size(inputData,2));
  61. %----------------------提取表达式(对应原始数据)------------------------------------
  62. %权重反归一化
  63. W12 = w12 * 2 ./repmat(iMax' -iMin',size(w12,1),1);
  64. B2 = -w12* (2*iMin ./(iMax - iMin) + 1) + b2;
  65. W23 = w23 .*repmat((oMax -oMin),1,size(w23,2))/2;
  66. B3 = (oMax -oMin) .*b3 /2 + (oMax -oMin)/2 + oMin;
  67. %最终的数学表达式:
  68. sim_y = W23 *tansig( W12 *inputData + repmat(B2,1,size(inputData,2))) + repmat(B3,1,size(inputData,2));
  69. %数学表达式与工具箱预测结果的比较
  70. net_sim_y = sim(net,normInputData);
  71. net_sim_y=(net_sim_y+1).*(oMax-oMin)./2 + oMin; % 对结果反归一
  72. formula_err=max(max(abs(net_sim_y - sim_y)));

三、附加代码:表达式打印

加入以下一段,可以打印表达式(仅为参考DEMO,非通用函数)

  1. [hn,xn] = size(W12);%隐节点个数,输入个数
  2. f_str = '';
  3. for i=1:hn
  4. cur_tansig = [num2str(W23(i)),'*tansig('];
  5. if(i>1 && W23(i)>0)
  6. cur_tansig =['+',cur_tansig] ;
  7. endfor j = 1: xn
  8. sign_str = '';
  9. if(j>1 && W12(i,j)>0 )
  10. sign_str='+';
  11. end
  12. cur_tansig = [cur_tansig,sign_str,num2str(W12(i,j)),'*x',num2str(j)];
  13. end
  14. sign_str = '';
  15. if( B2(i)>0 )
  16. sign_str='+';
  17. end
  18. cur_tansig = [cur_tansig,sign_str,num2str(B2(i)),')'];
  19. f_str= [f_str,cur_tansig];
  20. end
  21. sign_str = '';
  22. if( B3>0 )sign_str='+';
  23. end
  24. f_str=[f_str,sign_str,num2str(B3)]

运行结果:

13.8247*tansig(-0.94451*x1+0.33945*x2+2.1889)+18.6309*tansig(0.38004*x1+0.38706*x2+0.095989)-15.5021*tansig(0.7589*x1-0.06713*x2+2.0389)+1.6125

 相关文章

​《BP神经网络梯度推导》

​​​​​​《BP神经网络提取的数学表达式》

《一个BP的完整建模流程》

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/314186
推荐阅读
相关标签
  

闽ICP备14008679号