PCA作为最为基础的降维方法,已得到广泛应用,这里使用MATLAB代码实现对TE过程数据的降维处理,旨在用较少的主元成分解释尽可能多是原数据信息,并通过计算T2/SPE统计量来进行故障检测。
数据
链接:https://pan.baidu.com/s/1yHgZRqy6yyk9wsm6igqUSw
提取码:odsz
主程序
clear all;
close all;
clc;
%%%%%%%%%%%%%%%%%样本数据导入%%%%%%%%%%%%%%%%%%%%
X_Y_train = matfile('datatexy.mat');
X_train = X_Y_train.X;
load('d01_te.mat')
X_test = d01_te(:,[1:22,42:45,47:49,51:52]);
%%%%%%%%%%%%%%%%%样本数据标准化%%%%%%%%%%%%%%%%%%%%
X_train_zscore = zscore(X_train);
X_mean = mean(X_train);X_std = std(X_train);
[X_train_zscore_row,X_train_zscore_col] = size(X_train_zscore);
X_test=(X_test-repmat(X_mean,X_train_zscore_row,1))./repmat(X_std,X_train_zscore_row,1);
%X_test_zscore = zscore(X_test);
%%%%%%%%%%%%%%%%%训练集数据size%%%%%%%%%%%%%%%%%%%%
[X_train_zscore_row,X_train_zscore_col] = size(X_train_zscore);
%%%%%%%%%%%%%%%%%测试集数据size%%%%%%%%%%%%%%%%%%%%
[X_test_zscore_row,X_test_zscore_col] = size(X_test);
%%%%%%%%%%%%%%%%%测试集数据协方差矩阵%%%%%%%%%%%%%%%%%%%%
X_train_zscore_cov = cov(X_train_zscore);
%%%%%%%%%%%%%%%%%测试集数据协方差矩阵特征值与特征向量%%%%%%%%%%%%%%%%%%%%
[V,D] = eig(X_train_zscore_cov);
%%%%%%%%%%%%%%%%%测试集数据协方差矩阵特征从大到小排序%%%%%%%%%%%%%%%%%%%%
lamda = wrev(diag(D));
lamda_1 = reshape(lamda,1,[]);
%%%%%%%%%%%%%%%%%PCA K值选取(0.85)%%%%%%%%%%%%%%%%%%%%
lamda_k = 0;
k = 1;
for i = 1:X_train_zscore_col
lamda_k = lamda_k + lamda(i);
if lamda_k/sum(lamda)<0.85
k = k+1;
end
end
%%%%%%%%%%%%%%%%%PCA 特征值选取(从大到小 K个 )%%%%%%%%%%%%%%%%%%%%
lamda_1 = lamda_1(1:k);
%%%%%%%%%%%%%%%%%协方差矩阵————>对角矩阵特征值从大到小%%%%%%%%%%%%%%%%%%%%
D_lamda = rot90(D,2);
%%%%%%%%%%%%%%%%%对角矩阵 K个选取后%%%%%%%%%%%%%%%%%%%%
D_k = D_lamda(:,1:k);
D_k = D_k(1:k,:);
%%%%%%%%%%%%%%%%%特征向量 K个选取后%%%%%%%%%%%%%%%%%%%%
V_k = fliplr(V);
P = V_k(:,1:k);
%%%%%%%%%%%%%%%%%训练集经过PCA处理后的数据%%%%%%%%%%%%%%%%%%%%
X_train_zscore_k = X_train_zscore*P;
%%%%%%%%%%%%%%%%%T2控制限%%%%%%%%%%%%%%%%%%%%
T2UCL1 = (k*(X_train_zscore_row^2-1)*finv(0.95,k,X_train_zscore_row-k))/(X_train_zscore_row*(X_train_zscore_row-k));
%%%%%%%%%%%%%%%%%SPE控制限%%%%%%%%%%%%%%%%%%%%
for i = 1:3
th(i) = sum(lamda(k+1:31).^i);
end
h0 = 1-(2*th(1)*th(3))/(3*th(2).^2);
ca=norminv(0.99,0,1);
QU = th(1)*(ca*h0*sqrt(2*th(2))/th(1)+1+th(2)*h0*(h0-1)/(th(1).^2)).^(1/h0);
%%%%%%%%%%%%%%%%%测试集经过PCA处理后数据%%%%%%%%%%%%%%%%%%%%
X_test_zscore_k = X_test * P;
%%%%%%%%%%%%%%%%%测试集T2统计量%%%%%%%%%%%%%%%%%%%%
T2 = sum(((X_test_zscore_k.^2) ./ lamda_1),2);
%%%%%%%%%%%%%%%%%测试集SPE统计量%%%%%%%%%%%%%%%%%%%%
I = eye(X_test_zscore_col,X_test_zscore_col);
SPE =diag(X_test*(I - P*P')*X_test');
%%%%%%%%%%%%%%%%%T2/SPE统计图%%%%%%%%%%%%%%%%%%%%
figure
subplot(2,1,1);
plot(T2);
title('主元分析统计量变化图');
xlabel('采样数');
ylabel('T^2');
hold on;
line([0,X_test_zscore_row],[T2UCL1,T2UCL1],'LineStyle','--','Color','r');
subplot(2,1,2);
plot(SPE)
xlabel('采样数');
ylabel('SPE');
hold on;
line([0,X_test_zscore_row],[QU,QU],'LineStyle','--','Color','r');
仿真结果
结果分析
原数据为960*31为矩阵,降维处理后,用14个主元个数来解释了原始数据85%的信息,并通过降维后的数据计算T2/SPE统计量分别与各自的控制限比较。由主元分析统计量变化图可知,在150数据点左右T2/SPE统计量超出限制,代表发生故障。