hexiaobin 发表于 2006-11-13 15:33

将KPCA应用于过程监控中出现的问题

最近想用KPCA用于过程监控,但自己写了matlab程序,运行不成功,希望大家帮忙,给我看看你们成功的例子吧。谢谢!

xjzuo 发表于 2006-11-13 16:38

回复

你把你的代码先传上来看看吧.这样别人才可以帮你找找不成功的原因.

hexiaobin 发表于 2006-11-13 20:55

这是我的程序,帮忙看看吧,谢谢!

%KPCA用于过程监控
clear all;
close all;
t=0;%采样周期
Variances=0.040;%高斯核参数
k=0;%主元数
h=0;%特征空间维数
Vsum=0;

%获取实验数据
for i=1:1:100
    t=t+0.01;
    x(i,1)=t;
    x(i,2)=t^2-3*t;
    x(i,3)=-t^3+3*t^2;
end
randn('seed',0);
e=;
xe=x+e;

%归一化实验数据
modelXe_normalization=zscore(xe);
Vmean=mean(xe(1:100,:));
Vstd=std(xe(1:100,:));

%计算核矩阵(使用高斯核)
for m=1:1:100
    for n=m:1:100
      mediaVector=modelXe_normalization(m,:)-modelXe_normalization(n,:);
      KernelMatrix(m,n)=exp(-norm(mediaVector)^2/(2*Variances^2));
      KernelMatrix(n,m)=KernelMatrix(m,n);
    end
end

%中心化核矩阵
ell=size(KernelMatrix,1);
In=ones(ell,ell)./ell;
centralKernelMatrix=KernelMatrix-KernelMatrix*In-In*KernelMatrix+In*KernelMatrix*In;

%奇异值分解核矩阵
= svd(centralKernelMatrix);
while(h<=ell)&&(Vsum<99)    %凭经验计算特征空间维数
    h=h+1;
    Vsum=Vsum+S(h,h)/sum(diag(S)) * 100;
end

%通过交叉检验决定主元数,确定主元模型
k=23;
V=U(:,1:k);
L=S(1:k,1:k);
inverseL=diag(1./diag(L));
sqrtL=diag(sqrt(diag(L)));
invesqrtL=diag(1./diag(sqrtL));
KernelMatrixFeature=invesqrtL*V'*centralKernelMatrix;
allKernelMatrixFeature=diag(1./(sqrt(diag(S))))*U'*centralKernelMatrix;
for i=1:1:100
    time(i)=i;
    modelT2(i)=KernelMatrixFeature(:,i)'*inverseL*KernelMatrixFeature(:,i)*10;
end

%模型数据曲线输出
plot(time,limitT2,'b',time,modelT2,'r');
xlabel('time(s)');ylabel('T2');

xjzuo 发表于 2006-11-13 22:55

回复

效果的确不好.
(另:程序中limitT2未定义?)

建议你可以先看看Happy教授的帖子:
http://forum.vibunion.com/forum/viewthread.php?tid=25303

[ 本帖最后由 eight 于 2007-1-19 19:15 编辑 ]

hexiaobin 发表于 2006-11-14 09:15

这是我截取的一段,limitT2可以不要,看看我的程序写的有什么问题吗?原理上的,或程序上的。谢谢!

xjzuo 发表于 2006-11-14 10:57

回复

程序上好象没有什么问题,plot(time,modelT2,'r'),也可画出图来.
原理上这要花时间看看了.
另:你可以参考一些人脸识别及PCA方面的程序及论文,也许对你有帮助.

hexiaobin 发表于 2006-11-14 15:37

但是输出的曲线不对啊


你有这方面的例子吗,传一个可以吗?

[ 本帖最后由 ChaChing 于 2009-11-9 09:36 编辑 ]

xjzuo 发表于 2006-11-14 15:49

回复

我上传一个程序包吧,你自己看看.

hexiaobin 发表于 2006-11-15 10:00

thanks!传一个你自己的实例吧。

[ 本帖最后由 ChaChing 于 2009-11-9 09:21 编辑 ]

penghx 发表于 2008-10-22 16:48

同样的毛病!

for i=1:1:100
    time(i)=i;
    modelT2(i)=KernelMatrixFeature(:,i)'*inverseL*KernelMatrixFeature(:,i)*10;
    %最后为什么*10,没有理由啊
end
我自己也写了程序,T2的计算结果很小,不知缘故!而你的程序如果没有*10,就和我的差不多,凭什么放大了十倍啊!!呵呵,苦笑中!!

hustlikaifu 发表于 2012-1-4 16:00

楼主也很厉害呀,看得我很陶醉呀

dyhkxydfbb 发表于 2012-11-27 12:47

hustlikaifu 发表于 2012-1-4 16:00 static/image/common/back.gif
楼主也很厉害呀,看得我很陶醉呀

请问您的KPCA问题解决了吗?谢谢

happy 发表于 2012-11-27 14:43

dyhkxydfbb 发表于 2012-11-27 12:47 static/image/common/back.gif
请问您的KPCA问题解决了吗?谢谢

6年前的问题了,呵呵!估计都未必能够找到楼主了

dyhkxydfbb 发表于 2012-11-28 22:11

happy 发表于 2012-11-27 14:43 static/image/common/back.gif
6年前的问题了,呵呵!估计都未必能够找到楼主了

教授您好,请问我这样写KPCA的代码是对的吗? 使用的是RBF核函数

%% 清空环境变量
close all;
clear;
clc;
format compact;
%% 数据提取

% 载入测试数据wine,其中包含的数据为classnumber = 3,wine:178*13的矩阵,wine_labes:178*1的列向量
load chapter12_wine.mat;

winetrainstd=zscore(wine);%%标准化数据

X=winetrainstd;

rbf_var=1000;%%rbf参数
n=size(X,1); %n是行数,m是列数
l=ones(n,n)/n;%用于核矩阵的标准化
for i=1:n
    for j=1:n
      K(i,j)=exp(-norm(X(i,:)-X(j,:))^2/rbf_var);
      K(j,i)=K(i,j);
    end
end
kl=K-l*K-K*l+l*K*l;
= princomp(kl); %LATENT is the eigenvalues of the covariance matrix of X, COEFF is the loadings, SCORE is the principal component scores, TSQUARED is the Hotelling's T-squared statistic for each observation in X.
percent = 0.9; %input('确定方差贡献率限(0~1):')       %the predetermined contribution rate, usually 85%
k=0;
for i=1:size(latent,1)      %根据方差贡献率确定主元个数k(与第i个负荷向量相关联的方差等于对应的特征值); %% choose first k principal components
    alpha(i)=sum(latent(1:i))/sum(latent);
    if alpha(i)>=percent
      k=i;
      break;
    end
end
disp('--KPCA主元个数k--')
k
disp('--KPCA主元方差贡献率--')
alpha(k)

%%%%提取主元
m=score(:,1:3);

% 选定训练集和测试集
% 将第一类的1-30,第二类的60-95,第三类的131-153做为训练集
train_wine = ;
% 相应的训练集的标签也要分离出来
train_wine_labels = ;
% 将第一类的31-59,第二类的96-130,第三类的154-178做为测试集
test_wine = ;
% 相应的测试集的标签也要分离出来
test_wine_labels = ;


然后后面再用BP或者SVM对测试数据进行识别,您看这个提取主元的方法对吗?

happy 发表于 2012-11-29 11:05

dyhkxydfbb 发表于 2012-11-28 22:11 static/image/common/back.gif
教授您好,请问我这样写KPCA的代码是对的吗? 使用的是RBF核函数

%% 清空环境变量


基本思路应该是对的,具体细节还需要你自己去验证
页: [1] 2
查看完整版本: 将KPCA应用于过程监控中出现的问题