基于PCA的故障诊断(附MATLAB代码)

基于PCA的故障诊断

这个代码是我们课程设计用到的,更新了T2贡献率的求法,希望能帮到大家!代码如果运行有问题的可以在评论区留言。

clc
clear
X_train = load('F:\matlab\COD\train\d00.dat'); %载入训练数据
X_test =load('F:\matlab\COD\test\d2_te.dat'); %载入测试数据

X_train = double(X_train');%注意此处有个转置,是因为TE数据集的d00数据和其他数据行列颠倒了。只要保证和样本数据维度一致即可。
X_test = double(X_test);
X_mean = mean(X_train);  %求均值                           
X_std = std(X_train);    %求标准差   
[X_row,X_col] = size(X_train);                                                    
X_train=(X_train-repmat(X_mean,X_row,1))./repmat(X_std,X_row,1);%标准化处理

SXtrain = cov(X_train);%求协方差矩阵
[T,lm] = eig(SXtrain);%求特征值及特征向量                                                               
D = flipud(diag(lm));%将特征值从大到小排列,                            
num = 1;                                         
while sum(D(1:num))/sum(D) < 0.9   %若累计贡献率小于90%则增加主元个数
num = num +1;
end                                                 
P = T(:,X_col-num+1:X_col); %取对应的特征向量                           
                     
TU=num*(X_row-1)*(X_row+1)*finv(0.99,num,X_row - num)/(X_row*(X_row - num));%求置信度为99%时的T2统计控制限  

for i = 1:3
    th(i) = sum((D(num+1:X_col)).^i);
end
h0 = 1 - 2*th(1)*th(3)/(3*th(2)^2);
ca = norminv(0.99,0,1);
QU = th(1)*(h0*ca*sqrt(2*th(2))/th(1) + 1 + th(2)*h0*(h0 - 1)/th(1)^2)^(1/h0); %置信度为99%的Q spe统计控制限                          
QU=QU+5;
TU=TU+5;
%模型测试
n = size(X_test,1);
X_test=(X_test-repmat(X_mean,n,1))./repmat(X_std,n,1);%标准化处理
%求T2统计量,Q统计量
[r,y] = size(P*P');
I = eye(r,y); 
T2 = zeros(n,1);
Q = zeros(n,1);
for i = 1:n
T2(i)=X_test(i,:)*P*inv(lm(52-num+1:52,52-num+1:52))*P'*X_test(i,:)';                                           
    Q(i) = X_test(i,:)*(I - P*P')*X_test(i,:)';                                                                                    
end


%检测结果分析

%T2故障检测准确率
  k1=0;
for i=160:960
   if T2(i)>TU
       k1=k1+1;
   end
end
FDRT=k1/(960-160);
%T2误报率
k1=0;
for i=1:159
   if T2(i)>TU
       k1=k1+1;
   end
end
FART=k1/159;
%Q故障检测准确率
k1=0;
for i=160:960
   if Q(i)>QU
       k1=k1+1;
   end
end
FDRQ=k1/(960-160);
%Q故障检测率
k1=0;
for i=1:159
   if Q(i)>QU
       k1=k1+1;
   end
end
FARQ=k1/159;

%绘图
for i=1:n
    if T2(i,1)>TU
        break
    end
end

figure('Name','PCA');
subplot(4,1,1);
    plot(1:i,T2(1:i),'k');
    hold on;
    plot(i:n,T2(i:n),'k');
   title(['检测准确率为',num2str(FDRT)]);
    xlabel('采样数');
    ylabel('T2');
    hold on;
    line([0,n],[TU,TU],'LineStyle','--','Color','g');
   for i=1:n
    if Q(i,1)>QU
        break
    end
   end 

subplot(4,1,2);
    plot(1:i,Q(1:i),'k');
    hold on;
     plot(i:n,Q(i:n),'k');
    title(['检测准确率为',num2str(FDRQ)]);
    xlabel('采样数');
    ylabel('SPE');
    hold on;
    line([0,n],[QU,QU],'LineStyle','--','Color','g');
    
%贡献图,贡献最大的变量,即最有可能发生故障的变量会被标红

%T2贡献图
S = X_test(500,:)*P(:,1:num);%这里测试的是第500个时刻
r = [ ];
for i = 1:num
    if S(i)^2/lm(i) > TU/num
        r = cat(2,r,i);
    end
end

%2.计算每个变量相对于上述失控得分的贡献
cont = zeros(length(r),52);
for i = length(r)
    for j = 1:52
        cont(i,j) = abs(S(i)/D(i)*P(j,i)*X_test(500,j));
    end
end
[mxT_bor,mxT]=max(cont(31,:));
contT=zeros(1,52);
contT(1,mxT)=cont(31,mxT);%T2贡献
%4.计算每个变量对Q(SPE)的贡献
e = X_test(500,:)*(I - P*P');%选择某个样本判断哪个变量出现问题
contq = e.^2;
[mxq_bor,mxq]=max(contq);
contqq=zeros(1,52);
contqq(1,mxq)=contq(1,mxq);%Q贡献
%5. 绘制贡献图
subplot(4,1,3);
    bar(contq,'g');
     hold on;
   bar(contqq,'r');
    xlabel(['发生故障变量:',num2str(mxq)]);
    ylabel('SPE贡献率 %');
    subplot(4,1,4);
    bar(cont(31,:),'g');
     hold on;
    bar(contT,'r');
    xlabel(['发生故障变量:',num2str(mxT)]);
    ylabel('T2贡献率 %');
    

把大家的问题整理一下:
Q1:数据集在哪下载?
A:我主页资源里就有,免费下载。
Q2:T2和Q统计量计算公式?
A:这个可以百度搜一下公式,我这就不讲解了。
Q3:代码里的160、960数字表示啥意思?
A:可以搜一下TE数据集的介绍,我记得有人发过这个,TE数据集里前160个时刻都是正常的,160-960都是有故障的数据。
Q4:控制限为什么+5?
A:这个只是为了提高最后的效果,毕竟控制限越高,容错率越高。
Q6:路径错误?无法读取文件
A:请检查一下你的路径有没有问题。

你可能感兴趣的:(matlab,pca降维)