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;
umpc=1;whilesum(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