www.gusucode.com > 基于PCA的故障信号检测源码程序 > 基于PCA的故障信号检测源码程序/pca/db5_PCA1.m
close;clc;clear all; %-------------------------------------------------------------------------- % 载入数据 d1=xlsread('zc.xls'); d2=xlsread('gz.xls'); %-------------------------------------------------------------------------- % 数据的标准化 stantData=d1(:,:); %引入标准数据 c=d2; %引入待检测数据 c1=ones(960,1); Xmean=mean(stantData);%标准数据的均值 Xstd=std(stantData); %标准数据的方差 X=(c-c1*Xmean)./(c1*Xstd); %用待检测数据减去标准数据的均值并除以方差后,得到标准化的待检测数据 %X=zscore(c); %标准化 %在此之所以用标准数据,是为了知道检测数据的偏离程度,因而减去标准数据的均值和方差 %为什么在此用标准数据的均值和方差 [P, T, LATENT, TSQUARED] = princomp(X); % LATENT是X的特征值;T=T得分向量;P=P负荷矩阵;(即T=XP) %-------------------------------------------------------------------------- %确定主元素个数k percent = input('确定方差贡献率限(0~1):'); % alpha0 是预设的贡献率,通常为85% k=0; for i=1:size(LATENT,1); %应用size函数返回LATENT的行维数(语法r=size(A,n)返回n指定的A的方向的维数:n=1为行方向的维数;n=2为列方向的维数) alpha(i)=sum(LATENT(1:i))/sum(LATENT); %求解贡献率 if alpha(i)>=percent ; %判断是否大于给定贡献率 k=i; %把主元个数提供给K break; end; end; %-------------------------------------------------------------------------- %存储新的变量 Xp=zeros(size(X)); for j=1:k; Xp=Xp+T(:,j)*P(:,j)'; %Xp是新的变量 end %-------------------------------------------------------------------------- beta = input('确定统计阈值置信水平(0~1):');%0.9 --0.99 theta=zeros(4,1); for i=1:3 ; for j=k+1:size(X,2) ; %j=k+1:52 theta(i)=theta(i)+LATENT(j)^(i); end end h0=1-2*theta(1)*theta(3)/[3*(theta(2)^2)];%h0=1-2*theta(1)*theta(3)/3/(theta(2)^2); SPEbeta=theta(1)*(norminv(beta)*(2*theta(2)*h0^2)^0.5/theta(1)+1+theta(2)*h0*(h0-1)/(theta(1)^2))^(1/h0);%求取SPE的阈值 T2knbeta=finv(beta,k,(size(X,1)-k))*k*(size(X,1)^2-1)/(size(X,1)*(size(X,1)-k)); %利用F分布来求T2统计的阈值 %-------------------------------------------------------------------------- %求取T2的公式 T2=zeros(960,1); for i=1:960; T2(i)=X(i,:)*P(:,1:k)*inv(diag(LATENT(1:k)))*P(:,1:k)'*X(i,:)'; % 书上的公式 end %-------------------------------------------------------------------------- % 求取Q的公式 Q=zeros(960,1); for i=1:960; Q(i)=X(i,1:k)*(eye(k)-P(1:k,1:k)*P(1:k,1:k)')'*(eye(k)-P(1:k,1:k)*P(1:k,1:k)')*X(i,1:k)'; % 书上的公式 end %-------------------------------------------------------------------------- figure(1); plot(T2(1:960)); hold on; TS=T2knbeta*ones(960,1); %产生全1矩阵{size(X,1) x 1}维,目的是画一条直线 plot(TS,'r--'); xlabel('采样次数'); ylabel('T2统计图'); hold off; print -djpeg 144T2; %保存t2统计图像 k SPEbeta T2knbeta %-------------------------------------------------------------------------- figure(2); plot(Q(1:960)); hold on; SPES=SPEbeta*ones(960,1);%产生全1矩阵{size(X,1) x 1}维,目的是画一条直线 plot(SPES,'r--'); xlabel('采样次数'); ylabel('SPE统计图'); hold off; print -djpeg 144SPE; %保存SPE统计图像