KPCAコード
32756 ワード
KPCAアルゴリズムのTE過程での故障診断の応用 KPCAアルゴリズム紹介 KPCAコード データ前処理 核行列を計算する .中心化コア行列 共分散行列の固有値分解 により、主元の個数 が決定される.は、特徴ベクトルを特徴値の大きさ順に並べ替える .単位化特徴ベクトル 試験データを再構築する 制御限の設定 故障データの検出 描画 .検出率を求める .
KPCAアルゴリズムの紹介
データ前処理
KPCAアルゴリズムの紹介
KPCA , 。 : , PCA , 。
:
1.
2.
3.
4.
5.
6. SPE T2
7.
8.
9.
10.
11.
12. SPE T2
KPCA TE , :
KPCAコードデータ前処理
patterns=zscore(train);
%%
m=mean(train);
s=std(train);
n=size(test,1);%
test_patterns=(test-repmat(m,n,1))./repmat(s,n,1);
train_num=size(patterns,1);% ( )
test_num=size(test_patterns,1);% ( )
cov_size = train_num;
cov_size2 = test_num;
核行列の計算for i=1:cov_size
for j=i:cov_size
K(i,j) = exp(-norm(patterns(i,:)-patterns(j,:))^2/rbf_var);
K(j,i) = K(i,j);
end
end
unit = ones(cov_size, cov_size)/cov_size;
中心化核行列K_n = K - unit*K - K*unit + unit*K*unit;
共分散行列の固有値分解[evectors,evaltures] = eig(K_n);
[x,index]=sort(real(diag(evaltures)));
evals=flipud(x);%
index=flipud(index);
evaltures=real(diag(evaltures));
主要素の個数を確定しますumpc=1;
while sum(evals(1:numpc))/sum(evals)<0.85
numpc=numpc+1;
end
a=numpc;
特徴ベクトルを特徴値の大きさ順に並べ替えます.evectors=evectors(:,index);
単位化特徴ベクトルfor i=1:cov_size,
evecs(:,i) = evectors(:,i)/sqrt(evals(i));
end
index=numpc;
train_kpca=K_n * evecs(:,1:index(1)); %%
scoresp=K_n*evecs; %%%
試験データの再構築unit_test = ones(test_num,cov_size)/cov_size;
K_test = zeros(test_num,cov_size);
for i=1:test_num
for j=1:cov_size
K_test(i,j) = exp(-norm(test_patterns(i,:)-patterns(j,:))^2/rbf_var);
end
end
K_test_n = K_test - unit_test*K - K_test*unit + unit_test*K*unit;%
test_kpca = K_test_n * evecs(:,1:index(1));%%
scoresp2=K_test_n*evecs; %%%
制御限の設定for i=1:cov_size
T12(i)=(K_n(i,:)*evecs(:,1:a)*inv(diag(evals(1:index(1)))/train_num)*evecs(:,1:a)'*K_n(i,:)');%
end
Q1=(sum(scoresp.^2, 2)-sum(train_kpca.^2, 2))';
T2cfdLimit = ksdensity(T12,0.99,'function','icdf');%icdf:inverse cdf
SPEcfdLimit = ksdensity(Q1,0.99,'function','icdf');
故障データの検出for i=1:cov_size2
T22(i)=(K_test_n(i,:)*evecs(:,1:a)*inv(diag(evals(1:index(1)))/train_num)*evecs(:,1:a)'*K_test_n(i,:)');%
Q2=(sum(scoresp2.^2, 2)-sum(test_kpca.^2, 2))';
図形描画figure;
subplot(2,1,1);
plot(1:cov_size,T12,'blue');
xlabel(' ( )');
ylabel('T2');
hold on;
line([0,cov_size],[T2cfdLimit,T2cfdLimit],'LineStyle','- -','color','red');
legend(' ',' ');
subplot(2,1,2);
plot(1:cov_size,Q1,'blue');
xlabel(' ( )');
ylabel('Q');
hold on;
line([0,cov_size],[SPEcfdLimit,SPEcfdLimit],'lineStyle','- -','Color','red');
legend(' ',' ');
figure;
subplot(2,1,1);
plot(1:cov_size2,T22,'blue');
xlabel(' ( )');
ylabel('T2');
hold on;
line([0,cov_size2],[T2cfdLimit,T2cfdLimit],'LineStyle','- -','color','red');
legend(' ',' ');
検出率を求めるcout_T=0;
cout_SPE=0;
cout_T1=0;
cout_SPE1=0;
for i=1:cov_size2
if i<=160 && T22(i)>T2cfdLimit
cout_T1=cout_T1+1;
end
if i<=160 && Q2(i)>SPEcfdLimit
cout_SPE1=cout_SPE1+1;
end
if i>160 && T22(i)>T2cfdLimit
cout_T=cout_T+1;
end
if i>160 && Q2(i)>SPEcfdLimit
cout_SPE=cout_SPE+1;
end
end
cout_T_F=cout_T1/160*100
cout_T=cout_T/(cov_size2-160)*100
cout_SPE_F=cout_SPE1/160*100
cout_SPE=cout_SPE/(cov_size2-160)*100