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
  • 12
    点赞
  • 101
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
### 回答1: Matlab中的核主成分分析(KPCA)可以通过以下代码实现: ```matlab % 假设我们已经有一个包含m个样本和n个特征的数据矩阵X % 1. 计算核矩阵K K = pdist2(X, X, 'euclidean').^2; % 使用欧几里得距离计算样本间的距离,并平方 K = exp(-K / sigma); % 使用高斯核函数将距离转换为相似度 % 2. 中心化核矩阵K N = size(K, 1); one_n = ones(N, N) / N; K_c = K - one_n * K - K * one_n + one_n * K * one_n; % 3. 计算核矩阵K_c的特征值和特征向量 [V, D] = eig(K_c); % 4. 选择前k个最大特征值对应的特征向量 [~, index] = sort(diag(D), 'descend'); V = V(:, index(1:k)); % 5. 将原始数据映射到降维空间 X_kpca = K_c * V; % 最后,X_kpca即为通过KPCA降维得到的结果,其中每行表示一个样本在降维空间的表示 ``` 这段代码首先计算样本间的距离,并将距离转换为相似度,然后对核矩阵进行中心化处理。接下来,代码使用特征值分解(eigendecomposition)求解核矩阵的特征值和特征向量。然后,选择前k个最大特征值对应的特征向量,并将原始数据通过核矩阵乘法映射到降维空间,得到降维后的结果X_kpca。 ### 回答2: 在MATLAB中,利用Kernel Principal Component Analysis(KPCA)进行数据降维和特征提取非常简单。下面是一个示例代码: ```matlab % 1. 导入数据 X = load('data.mat'); % 2. 使用KPCA降维 [coeff, score, latent] = kpca(X,'linear',3); % 3. 可视化结果 scatter3(score(:,1), score(:,2), score(:,3), 'filled'); xlabel('PC1'); ylabel('PC2'); zlabel('PC3'); title('KPCA'); % 解释各主成分的贡献率 explained_variance = latent ./ sum(latent); disp('贡献率:'); disp(explained_variance); ``` 上述代码中,首先我们导入数据`data.mat`。这个数据是一个包含多个样本的矩阵,每行代表一个样本,每列代表样本的特征。 然后,我们使用`kpca`函数进行降维操作。这个函数将输入数据`X`进行核主成分分析,其中`'linear'`表示使用线性核函数,`3`表示降维到3维。函数返回了降维后的主成分系数矩阵`coeff`、降维后的样本得分矩阵`score`以及各主成分的特征值`latent`。 最后,我们使用`scatter3`函数将降维后的样本在三维空间中可视化。通过查看主成分的贡献率,可以了解各个主成分的重要程度。 希望这个简单的示例代码能够帮到你,具体的应用还需要根据具体情况进行调整。 ### 回答3: KPCA(Kernel Principal Component Analysis)是一种非线性降维算法,可以把高维数据映射到低维空间中。 在MATLAB中,我们可以使用`kpca`函数实现KPCA算法。该函数的调用方式为: ``` [U, V, lam] = kpca(X, kernel, d) ``` 其中,`X`是输入的数据矩阵,每一行代表一个样本; `kernel`是核函数的类型,可以是线性核函数('linear')、多项式核函数('poly')或高斯核函数('gauss'); `d`是降维后的维度。 输出结果包括: `U`是投影后的样本矩阵,每一行代表一个样本的投影; `V`是核矩阵的特征向量; `lam`是核矩阵的特征值。 使用KPCA算法的一般步骤如下: 1. 计算核矩阵,根据选择的核函数类型和样本数据,使用kernelmatrix函数计算出核矩阵。 2. 计算中心化核矩阵,根据核矩阵,使用centerkm函数将核矩阵进行中心化处理。 3. 计算投影矩阵,根据中心化核矩阵,使用kpca算法计算出投影矩阵。 4. 对样本进行降维,根据投影矩阵,使用kpcaproj函数将原始样本数据降维到低维空间。 需要注意的是,KPCA算法对于高维数据的处理速度较慢,对于大规模数据集可能会很慢。因此,在使用KPCA算法时,可以考虑使用PCA算法进行预处理,将原始数据降维到一个相对较低的维度后再使用KPCA算法进行非线性降维,以提高运算效率。 在实际使用时,可以根据具体的需求和数据情况来选择合适的参数和核函数类型,从而得到较好的降维效果。
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值