基于PCA的故障诊断方法(matlab)

1. PCA原理分析

PCA的原理主要是将原始数据进行降维。其具体工作原理参照:CodingLabs - PCA的数学原理

2. 数据预处理

 训练数据集(只有正样本)为X_{n*m}维数据,即有n个采样值,每个采样值有m个特征。

\begin{pmatrix} x_{11} &x_{12} & \cdots & x_{1m}\\ x_{21}& x_{22} &\cdots &x_{2m} \\ \vdots&\vdots &\ddots &\vdots \\ x_{n1}&x_{n2} &\cdots &x_{nm} \end{pmatrix}

2.1 数据归一化

将数据X针对每个特征归一化为均值为0,均方根为1的数据。

x_{i,j}^*=\frac{x_{i,j}-\bar{x_i}}{\sqrt{s_{i}}}

其中:

\bar {x_i}=\frac{1}{n}\sum_{j=1}^n{x_{ji}},i=1,2,...,n

s_{i}=\frac{1}{n-1}\sum_{j=1}^n{(x_{ji}-\bar {x_i})^2}, i=1,2,...,n

3. PCA降维

3.1 首先求取协方差矩阵

协方差矩阵的公式为:

R=\frac{1}{n-1}X^TX

计算出来的协方差矩阵为特征m*m维矩阵。

3.2 求取特征值和特征向量

求取协方差矩阵R的特征值和特征向量,并将特征值按照从大到小的顺序排列

\lambda_1\geq\lambda_2\geq\lambda_3\cdots\geq\lambda_m

将特征向量按照特征值重新排列后得到:

P_{mm}=[p_1,p_2,\cdots,p_m]

3.3 选择合适的k个特征进行PCA降维

可以选择特征值累计大于85%的前k个特征进行PCA降维

\frac{\sum_{i=1}^k{\lambda_i}}{\sum_{i=1}^m{\lambda_i}}\geq 0.85

令前k个从大到小的特征值构成对角矩阵S_{kk},k个对应的特征向量组成将为矩阵P_{mk}。即:

S_{kk}=diag(\lambda_1,\lambda_2,\cdots,\lambda_k)

P_{mk}=[p_1,p_2,\cdots,p_k]

PCA降维后,样本数目仍为n个采样,但是特征数目变为k,降维公式为:

\tilde{X}_{nk}=X_{nm}*P_{mk}

将X进行重构后得到的X‘的矩阵的计算公式为:

X'=\tilde{X}_{nk}P_{mk}^T=X_{nm}P_{mk}P_{mk}^T

4. 求取统计量限值

4.1 T^2统计量

4.1.1 T^2统计量的计算公式:

T_{\alpha}=\frac{k(n^2-1)}{n(n-k)}F_{\alpha}(k,n-k)

其中1-\alpha是置信度,F_{\alpha}(k,n-k)是服从第一自由度为k,第二自由度为n-k的F分布,通常\alpha取0.01。

另外强调一点是:n是训练数据集的采样数,k为PCA后选择的特征的数量。

 4.1.2  计算测试数据的T^2统计量

计算测试数据每个采样值的T^2值。假设测试样本中的一个采样值x_{new}为1*m的一个采样值,该采样值同样经过训练样本的均值和方差进行归一化(注意此处均值和方差使用训练样本的均值和方差,而不是选择训练数据的样本和方差),其T^2计算公式为:

T^2=x_{new(1m)}*P_{mk}*S_{kk}^{-1}*P_{mk}^T*x_{new(1m)}^T

另外T^2的计算公式也可以简化为:

T^2=||S_{kk}^{-1/2}*P_{mk}^T*x_{new(1m)}^T||_2^2

其中S_{kk}^{-1/2}表示对角矩阵中的每个元素取-1/2指数,||\cdot ||_2^2表示2范数的平方。

4.1.3 故障判定

如系统正常运行,则样本的T^2值应该满足TT^2<T_{\alpha},否则则认为出现故障。

4.2 SPE统计量(也称Q统计量)

4.2.1 SPE控制量限值的计算

Q_{\alpha}=\theta_1[\frac{c_{\alpha}h_0\sqrt{2\theta_2}}{\theta_1}+1+\frac{\theta_2h_0(h_0-1)}{\theta_1^2}]^{1/h_0}

其中:

\theta_r=\sum_{j=k+1}^m{\lambda_j^r)}, r=1,2,3

h_0=1-\frac{2\theta_1\theta_3}{3\theta_2^2}

c_{\alpha}是标准正态分布的置信极限。

4.2.2 计算测试数据的SPE值

测试数据选择和计算T^2相同的采样值x_{new(1m)},同样做相同的归一化处理。

Q=x_{new(1m)}*(I_{mm}-P_{mk}P_{mk}^T)x_{new(1m)}^T

4.3.3 判断是否发生故障

 如果系统正常运行,则样本的SPE值应满足Q<Q_{\alpha},否则,可认定发生故障。

5. matlab实现

clc;clear;
%% 1.导入数据
%产生训练数据
num_sample=100;
a=10*randn(num_sample,1);
x1=a+randn(num_sample,1);
x2=1*sin(a)+randn(num_sample,1);
x3=5*cos(5*a)+randn(num_sample,1);
x4=0.8*x2+0.1*x3+randn(num_sample,1);
xx_train=[x1,x2,x3,x4];

% 产生测试数据
a=10*randn(num_sample,1);
x1=a+randn(num_sample,1);
x2=1*sin(a)+randn(num_sample,1);
x3=5*cos(5*a)+randn(num_sample,1);
x4=0.8*x2+0.1*x3+randn(num_sample,1);
xx_test=[x1,x2,x3,x4];
xx_test(51:100,2)=xx_test(51:100,2)+15*ones(50,1);

%% 2.数据处理
Xtrain=xx_train;
Xtest=xx_test;
X_mean=mean(Xtrain);
X_std=std(Xtrain);
[X_row, X_col]=size(Xtrain);
Xtrain=(Xtrain-repmat(X_mean,X_row,1))./repmat(X_std,X_row,1); %标准化处理

%% 3.PCA降维
SXtrain = cov(Xtrain);%求协方差矩阵
[T,lm]=eig(SXtrain);%求特征值及特征向量,特征值排列顺序为从小到大
D=flipud(diag(lm));%将特征值从大到小排列
% 确定降维后的数量
num=1;
while sum(D(1:num))/sum(D)<0.85
    num = num+1;
end
P = T(:,X_col-num+1:X_col); %取对应的向量
P_=fliplr(P); %特征向量由大到小排列


%% 4.计算T2和Q的限值
%求置信度为99%时的T2统计控制限,T=k*(n^2-1)/n(n-k)*F(k,n-k)
%其中k对应num,n对应X_row
T2UCL1=num*(X_row-1)*(X_row+1)*finv(0.99,num,X_row - num)/(X_row*(X_row - num));%求置信度为99%时的T2统计控制限 

%求置信度为99%的Q统计控制限
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统计控制限 

%% 5.模型测试
n = size(Xtest,1);
Xtest=(Xtest-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);
lm_=fliplr(flipud(lm));
%T2的计算公式Xtest.T*P_*inv(S)*P_*Xtest
for i = 1:n
    T2(i)=Xtest(i,:)*P_*inv(lm_(1:num,1:num))*P_'*Xtest(i,:)';    
    Q(i) = Xtest(i,:)*(I - P*P')*Xtest(i,:)';                                                                                    
end

%% 6.绘制T2和SPE图
figure('Name','PCA');
subplot(2,1,1);
plot(1:i,T2(1:i),'k');
hold on;
plot(i:n,T2(i:n),'k');
title('统计量变化图');
xlabel('采样数');
ylabel('T2');
hold on;
line([0,n],[T2UCL1,T2UCL1],'LineStyle','--','Color','r');

subplot(2,1,2);
plot(1:i,Q(1:i),'k');
hold on;
plot(i:n,Q(i:n),'k');
title('统计量变化图');
xlabel('采样数');
ylabel('SPE');
hold on;
line([0,n],[QU,QU],'LineStyle','--','Color','r');

%% 7.绘制贡献图
%7.1.确定造成失控状态的得分
S = Xtest(51,:)*P(:,1:num);
r = [ ];
for i = 1:num
    if S(i)^2/lm_(i) > T2UCL1/num
        r = cat(2,r,i);
    end
end
%7.2.计算每个变量相对于上述失控得分的贡献
cont = zeros(length(r),X_col);
for i = length(r)
    for j = 1:X_col
        cont(i,j) = abs(S(i)/D(i)*P(j,i)*Xtest(51,j));
    end
end
%7.3.计算每个变量的总贡献
CONTJ = zeros(X_col,1);
for j = 1:X_col
    CONTJ(j) = sum(cont(:,j));
end
%7.4.计算每个变量对Q的贡献
e = Xtest(51,:)*(I - P*P');%选取第60个样本来检测哪个变量出现问题。
contq = e.^2;
%5. 绘制贡献图
figure
subplot(2,1,1);
bar(contq,'g');
xlabel('变量号');
ylabel('SPE贡献率 %');
hold on;
subplot(2,1,2);
bar(CONTJ,'r');
xlabel('变量号');
ylabel('T^2贡献率 %');

 训练数据为自己创建的x1,x2,x3和x4,其中x4是和x2,x3相关的变量。测试数据和训练数据完全一致,只不过在第50个数据后在x2上添加了故障。

得到的结果如下:

从上图可以明显看出测试数据在第50个数据开始,T2和SPE值都超限,证明发生故障。 

 通过贡献图分析,可以看出变量2为故障发生点,与实际情况相符。对于故障发生点还有更精细的方法。此处不做深究。

参考:基于PCA的线性监督分类的故障诊断方法-T2与SPE统计量的计算_And_ZJ的博客-CSDN博客_spe统计量

  • 28
    点赞
  • 232
    收藏
    觉得还不错? 一键收藏
  • 24
    评论
### 回答1: PCA(Principal Component Analysis,主成分分析)是一种常用的多变量数据降维技术,通过线性映射将原始数据转换为一组新的互相无关的变量,称为主成分。基于PCA故障诊断是一种利用PCA对系统的工作状态进行分析,以检测和诊断可能存在的故障。 在Python中,可以使用scikit-learn库来实现基于PCA故障诊断。下面是一个简单的实现过程: 1. 导入所需的库:首先需要导入scikit-learn库和其他常用的数据处理和可视化库,如numpy、pandas和matplotlib。 2. 数据准备:将故障数据集加载到Python环境中,并进行必要的数据预处理,如特征标准化和数据清洗。 3. PCA模型训练:使用scikit-learn库中的PCA类来训练PCA模型。设置主成分的数量,并调整其他参数。 4. 模型拟合:使用训练好的PCA模型对故障数据集进行拟合,得到降维后的数据。 5. 故障诊断:通过对降维后的数据进行可视化和分析,检测和诊断可能存在的故障。可以使用散点图、热力图等方式来展示数据。 6. 结果评估:根据故障诊断结果,对系统进行评估,并采取相应的措施来修复和预防故障。 需要注意的是,基于PCA故障诊断需要根据具体的数据集和问题进行调整和优化。在实际应用中,还可以结合其他方法和技术,如聚类分析、异常检测等,来提高诊断的准确性和可靠性。 综上所述,使用Python实现基于PCA故障诊断,可以通过加载数据、训练PCA模型、拟合数据、可视化分析等步骤来完成。这种方法可以帮助工程师快速准确地诊断系统故障,提高故障相关问题的处理效率。 ### 回答2: 基于PCA故障诊断是一种常见的机器学习方法,可以用于分析检测系统或设备的异常情况。以下是基于PCA故障诊断的Python实现的步骤: 1. 导入所需的库和数据:使用Python中的numpy、pandas、sklearn等库导入所需的工具和数据集。 2. 数据预处理:对数据集进行预处理,包括数据清洗、缺失值处理以及数据标准化等操作。这可以通过使用pandas和sklearn库中的函数来完成。 3. 主成分分析(PCA)模型:使用sklearn库中的PCA模型创建一个PCA对象,并设定所需的主成分数量。 4. 训练模型:使用fit方法将数据集降维到所需的主成分数量。这将通过计算数据集的协方差矩阵和特征值分解来实现。 5. 故障诊断:将新的输入数据集合转换为之前训练模型所得到的主成分空间。使用transform方法将数据集转换为主成分特征向量。 6. 阈值设定和故障检测:根据故障情况,设定一个合适的阈值。将新的主成分向量与训练集的主成分向量进行比较,若存在明显偏差,则判断为故障。 7. 故障定位和诊断:分析故障数据点的主成分贡献程度,可以根据其主成分在原数据空间中的重建特征向量来确定故障的位置和原因。 8. 结果可视化:使用Matplotlib等库将诊断结果进行可视化展示,以便更好地理解和解释故障情况。 以上是基于PCA故障诊断的Python实现的大致步骤。根据具体情况,可能需要针对数据集的特点进行一些适当的调整和优化。 ### 回答3: 基于主成分分析(PCA)的故障诊断是一种常用的数据分析方法,可以在多个变量之间找到主要关系,并通过分析主要组成部分来确定故障原因。下面是基于PCA进行故障诊断的python实现步骤: 1. 数据预处理:首先,加载所需的python库,例如numpy和pandas,并导入相关的数据集。对数据进行预处理,包括数据清洗、缺失值处理和数据转换等。确保数据准备完备。 2. 特征标准化:使用标准化方法对数据进行预处理,将不同范围和单位的特征转化为统一的尺度。常用的标准化方法包括均值归一化和方差归一化。 3. PCA模型训练:使用sklearn库中的PCA类来训练PCA模型。设置主成分个数和其他参数,并使用fit_transform()函数来拟合和转换数据。 4. 主成分分析:获得主成分贡献率和特征向量。可以使用explained_variance_ratio_属性获取主成分的贡献率,使用components_属性获取主成分的特征向量。 5. 故障诊断:根据主成分贡献率,可以通过累积贡献率来确定主要的故障因素。当累积贡献率达到一定程度时,可以认为该主成分对故障的解释度较高。同时,根据主成分的特征向量,可以判断主要的故障变量。 6. 结果展示:可以通过绘制散点图或热力图来展示不同故障组的数据分布,以及主成分贡献率和特征向量的重要性。此外,还可以使用聚类算法对故障组进行分类,并与PCA结果进行比较。 通过以上步骤,我们可以实现基于PCA故障诊断方法。这种方法可以帮助我们在大规模数据集中快速准确地识别故障,并为故障处理和维护提供指导。
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值