当前位置:   article > 正文

pso优化bp网络机械故障诊断(MATLAB代码)_基于pso优化bp神经网络的柴油发动机故障诊断研究

基于pso优化bp神经网络的柴油发动机故障诊断研究

在混合算法中,需要优化的对象(粒子)是 BP 神经网络的权值和值。首先应把要优化的神经网络的全部权值和闽值构成一个实数数组,并赋予它们 [0,1之间的随机数。然后,按照选定的网络结构,用前向算法计算出对应于每组输入样本的神经网络输出。这里BP网络的激活函数都选为sigmoid 函数然后用改进PSO算法搜索出最优位置,使如下的均方误差指标(适应度函数值)达到最小:

式中,n为样本个数;c 为网络神经元的输出个数;tkp为第p个样本的第个理想输出值;Y.p为第p个样本的第  个实际输出值。
这样适应度函数值达到最小时搜索到的便是 BP 网络的最佳权值和闻值。下面是混合算法的实现步骤:
(1)确定适应度权值w、最大允许迭代步数 t、搜索范围[-Xmax,Xmax]、最大速度,并根据网络规模确定粒子数。 

通过改进的粒子群算法对网络权值进行训练,改善了使用多层感知器的BP算中存在的网络学习收敛速度慢,以及容易陷入局部极小等问题,提高了网络收敛速度,可以有效地用于设备故障诊断,对设备故障进行特征识别和诊断分析。 

文件夹如下

数据集介绍

data5.m

训练集特征

训练集的标签 

测试集的特征 

 主程序(main.m文件)

  1. %% 该代码为基于PSO和BP网络的预测
  2. %% 初始化
  3. clc
  4. clear
  5. warning off
  6. %读取数据
  7. load data5 input output test
  8. %节点个数
  9. inputnum=9;
  10. hiddennum=13;
  11. outputnum=5;
  12. %训练数据和预测数据
  13. input_train=input';
  14. input_test=test';
  15. output_train=output';
  16. output_test=output';
  17. inputn=input_train;
  18. outputn=output_train;
  19. %构建网络
  20. dx=[0,1;0,1;0,1;0,1;0,1;0,1;0,1;0,1;0,1];
  21. net=newff(dx,[hiddennum,outputnum],{'tansig' 'logsig'},'trainlm');
  22. % 参数初始化
  23. %粒子群算法中的两个参数
  24. c1 = 1.49445;
  25. c2 = 1.49445;
  26. maxgen=100; % 进化次数
  27. sizepop=20; %种群规模
  28. Vmax=1;
  29. Vmin=-1;
  30. popmax=5;
  31. popmin=-5;
  32. for i=1:sizepop
  33. pop(i,:)=5*rands(1,200);
  34. V(i,:)=rands(1,200);
  35. fitness(i)=fun(pop(i,:),inputnum,hiddennum,outputnum,net,inputn,outputn);
  36. end
  37. % 个体极值和群体极值
  38. [bestfitness bestindex]=min(fitness);
  39. zbest=pop(bestindex,:); %全局最佳
  40. gbest=pop; %个体最佳
  41. fitnessgbest=fitness; %个体最佳适应度
  42. fitnesszbest=bestfitness; %全局最佳适应度
  43. %% 迭代寻优
  44. for i=1:maxgen
  45. for j=1:sizepop
  46. %速度更新
  47. V(j,:) = V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));
  48. V(j,find(V(j,:)>Vmax))=Vmax;
  49. V(j,find(V(j,:)<Vmin))=Vmin;
  50. %种群更新
  51. pop(j,:)=pop(j,:)+0.2*V(j,:);
  52. pop(j,find(pop(j,:)>popmax))=popmax;
  53. pop(j,find(pop(j,:)<popmin))=popmin;
  54. %自适应变异
  55. pos=unidrnd(21);
  56. if rand>0.95
  57. pop(j,pos)=5*rands(1,1);
  58. end
  59. %适应度值
  60. fitness(j)=fun(pop(j,:),inputnum,hiddennum,outputnum,net,inputn,outputn);
  61. end
  62. for j=1:sizepop
  63. %个体最优更新
  64. if fitness(j) < fitnessgbest(j)
  65. gbest(j,:) = pop(j,:);
  66. fitnessgbest(j) = fitness(j);
  67. end
  68. %群体最优更新
  69. if fitness(j) < fitnesszbest
  70. zbest = pop(j,:);
  71. fitnesszbest = fitness(j);
  72. end
  73. end
  74. yy(i)=fitnesszbest;
  75. end
  76. %% 结果分析
  77. plot(yy)
  78. title(['适应度曲线 ' '终止代数=' num2str(maxgen)]);
  79. xlabel('进化代数');ylabel('适应度');
  80. x=zbest;
  81. %% 把最优初始阀值权值赋予网络预测
  82. % %用pso优化的BP网络进行值预测
  83. w1=x(1:inputnum*hiddennum);
  84. B1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);
  85. w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
  86. B2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);
  87. net.iw{1,1}=reshape(w1,hiddennum,inputnum);
  88. net.lw{2,1}=reshape(w2,outputnum,hiddennum);
  89. net.b{1}=reshape(B1,hiddennum,1);
  90. net.b{2}=reshape(B2,outputnum,1);
  91. %% BP网络训练
  92. %网络进化参数
  93. net.trainParam.epochs=1000;
  94. net.trainParam.lr=0.001;
  95. net.trainParam.goal=1e-6;
  96. net.trainParam.showwindow = 0;
  97. %网络训练
  98. [net,per2]=train(net,inputn,outputn);
  99. %% BP网络预测
  100. an=sim(net,input_test)

效果图

测试集的预测标签

完整代码可以关注

  1. function error = fun(x,inputnum,hiddennum,outputnum,net,inputn,outputn)
  2. % 该函数用来计算适应度
  3. %x input 个体
  4. %inputnum input 输入层节点数
  5. %outputnum input 隐含层节点数
  6. %net input 网络
  7. %inputn input 训练输入数据
  8. %outputn input 训练输出数据
  9. %error output 个体适应度
  10. %提取
  11. w1=x(1:inputnum*hiddennum);
  12. B1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);
  13. w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
  14. B2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);
  15. %网络权值赋值
  16. net.iw{1,1}=reshape(w1,hiddennum,inputnum);
  17. net.lw{2,1}=reshape(w2,outputnum,hiddennum);
  18. net.b{1}=reshape(B1,hiddennum,1);
  19. net.b{2}=reshape(B2,outputnum,1);
  20. %可以关注https://mbd.pub/o/bread/ZJyTmZZt

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

闽ICP备14008679号