效果
用训练好的模糊神经网络对机械故障进行诊断,根据网络的预测值得到机械的技术状态。预测值小于 1.5 时为正常状态,预测值在 1.5~2.5 之间时为曲轴轴承轻微异响,预测值在 2.5~3.5 之间时为曲轴轴承严重异响预测值在 3.5~4.5 之间时为连杆轴承轻微异响,预测值大于 4.5 时为连杆轴承严重异响。
y是真实标签,yt是预测标签
模糊神经网络代码
clear all;
%下载数据
load data_fnn;
%网络结构
I=9; %输入节点
M=18; %隐含节点
O=1; %输出节点
maxgen=10000; %迭代次数
xite=0.07; %网络学习率
a0=0.3;
b0=0.6;
Ek=1e-15; %误差
%初始化模糊神经网络参数
p0=a0*ones(M,1);p0_1=p0;
p1=a0*ones(M,1);p1_1=p1;
p2=a0*ones(M,1);p2_1=p2;
p3=a0*ones(M,1);p3_1=p3;
p4=a0*ones(M,1);p4_1=p4;
p5=a0*ones(M,1);p5_1=p5;
p6=a0*ones(M,1);p6_1=p6;
p7=a0*ones(M,1);p7_1=p7;
p8=a0*ones(M,1);p8_1=p8;
p9=a0*ones(M,1);p9_1=p9;
%初始化模糊隶属度参数
c=0.8+b0*rands(M,I);c_1=c;
b=0.8+b0*rands(M,I);b_1=b;
%训练数据归一化
[inputn,inputps]=mapminmax(input_train);
[outputn,outputps]=mapminmax(output_train);
%----------------------------------------用训练样本训练模糊神经网络--------------------------------------------
[n,m]=size(input_train);
EE=100;
p=1;
while p<=maxgen && EE>=Ek
for k=1:m %m 样本个数
%提取训练样本
x=inputn(:,k);
%输入参数模糊化
for i=1:I
for j=1:M
u(i,j)=exp(-(x(i)-c(j,i))^2/b(j,i));
end
end
%模糊隶属度计算
for i=1:M
w(i)=u(1,i)*u(2,i)*u(3,i)*u(4,i)*u(5,i)*u(6,i)*u(7,i)*u(8,i)*u(9,i);
end
addw=sum(w);
%输出计算
for i=1:M
yi(i)=p0_1(i)+p1_1(i)*x(1)+p2_1(i)*x(2)+p3_1(i)*x(3)+p4_1(i)*x(4)+p5_1(i)*x(5)+p6_1(i)*x(6)+p7_1(i)*x(7)+p8_1(i)*x(8)+p9_1(i)*x(9);
end
addyw=0;
addyw=yi*w';
yn(k)=addyw/addw;
e(k)=outputn(k)-yn(k);
%系数p修正值计算
d_p=zeros(M,1);
for i=1:M
d_p(i)=xite*e(k)*w(i)/addw;
end
%系数b修正值计算
d_b=0*b;
for i=1:M
for j=1:I
d_b(i,j)=xite*e(k)*(yi(i)*addw-addyw)*(x(j)-c(i,j))^2*w(i)/(b(i,j)^2*addw^2);
end
end
%c的修正值计算
d_c=0*c;
for i=1:M
for j=1:I
d_c(i,j)=xite*e(k)*(yi(i)*addw-addyw)*2*(x(j)-c(i,j))*w(i)/(b(i,j)*addw^2);
end
end
%系数修正
p0_1=p0_1+d_p;
p1_1=p1_1+d_p*x(1);
p2_1=p2_1+d_p*x(2);
p3_1=p3_1+d_p*x(3);
p4_1=p4_1+d_p*x(4);
p5_1=p5_1+d_p*x(5);
p6_1=p6_1+d_p*x(6);
p7_1=p7_1+d_p*x(7);
p8_1=p8_1+d_p*x(8);
p9_1=p9_1+d_p*x(9);
%隶属度参数修正
b=b+d_b;
c=c+d_c;
end
for k=1:m %m 样本个数
%提取训练样本
x=inputn(:,k);
%输入参数模糊化
for i=1:I
for j=1:M
u(i,j)=exp(-(x(i)-c(j,i))^2/b(j,i));
end
end
%模糊隶属度计算
for i=1:M
w(i)=u(1,i)*u(2,i)*u(3,i)*u(4,i)*u(5,i)*u(6,i)*u(7,i)*u(8,i)*u(9,i);
end
addw=sum(w);
%输出计算
for i=1:M
yi(i)=p0_1(i)+p1_1(i)*x(1)+p2_1(i)*x(2)+p3_1(i)*x(3)+p4_1(i)*x(4)+p5_1(i)*x(5)+p6_1(i)*x(6)+p7_1(i)*x(7)+p8_1(i)*x(8)+p9_1(i)*x(9);
end
addyw=0;
addyw=yi*w';
yn(k)=addyw/addw;
end
EE=(1/2)*sumsqr(outputn-yn)
E(p)=EE;
p=p+1;
end
EE,p
y=mapminmax('reverse',yn,outputps)
epoch=1:size(E,2);
figure
plot(epoch,E,'-r');
title('误差变化曲线');xlabel('步数');ylabel('误差');
%----------------------------------------------测试样本网络预测-----------------------------------------
%输入数据归一化
inputn_test=mapminmax('apply',input_test,inputps);
[n,m]=size(input_test);
%网络预测
for k=1:1:m
x=inputn_test(:,k);
%输入参数模糊化
for i=1:I
for j=1:M
u(i,j)=exp(-(x(i)-c(j,i))^2/b(j,i));
end
end
%模糊隶属度计算
for i=1:M
w(i)=u(1,i)*u(2,i)*u(3,i)*u(4,i)*u(5,i)*u(6,i)*u(7,i)*u(8,i)*u(9,i);
end
addw=sum(w);
%输出计算
for i=1:M
yi(i)=p0_1(i)+p1_1(i)*x(1)+p2_1(i)*x(2)+p3_1(i)*x(3)+p4_1(i)*x(4)+p5_1(i)*x(5)+p6_1(i)*x(6)+p7_1(i)*x(7)+p8_1(i)*x(8)+p9_1(i)*x(9);
end
addyw=0;
addyw=yi*w';
%网络预测值
ytn(k)=addyw/addw;
end
%预测值反归一化
yt=mapminmax('reverse',ytn,outputps)
#代码:https://mbd.pub/o/bread/mbd-ZJyTmZZw