将KPCA应用于过程监控中出现的问题
最近想用KPCA用于过程监控,但自己写了matlab程序,运行不成功,希望大家帮忙,给我看看你们成功的例子吧。谢谢!回复
你把你的代码先传上来看看吧.这样别人才可以帮你找找不成功的原因.这是我的程序,帮忙看看吧,谢谢!
%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');
回复
效果的确不好.(另:程序中limitT2未定义?)
建议你可以先看看Happy教授的帖子:
http://forum.vibunion.com/forum/viewthread.php?tid=25303
[ 本帖最后由 eight 于 2007-1-19 19:15 编辑 ] 这是我截取的一段,limitT2可以不要,看看我的程序写的有什么问题吗?原理上的,或程序上的。谢谢!
回复
程序上好象没有什么问题,plot(time,modelT2,'r'),也可画出图来.原理上这要花时间看看了.
另:你可以参考一些人脸识别及PCA方面的程序及论文,也许对你有帮助. 但是输出的曲线不对啊
你有这方面的例子吗,传一个可以吗?
[ 本帖最后由 ChaChing 于 2009-11-9 09:36 编辑 ]
回复
我上传一个程序包吧,你自己看看. thanks!传一个你自己的实例吧。[ 本帖最后由 ChaChing 于 2009-11-9 09:21 编辑 ]
同样的毛病!
for i=1:1:100time(i)=i;
modelT2(i)=KernelMatrixFeature(:,i)'*inverseL*KernelMatrixFeature(:,i)*10;
%最后为什么*10,没有理由啊
end
我自己也写了程序,T2的计算结果很小,不知缘故!而你的程序如果没有*10,就和我的差不多,凭什么放大了十倍啊!!呵呵,苦笑中!! 楼主也很厉害呀,看得我很陶醉呀 hustlikaifu 发表于 2012-1-4 16:00 static/image/common/back.gif
楼主也很厉害呀,看得我很陶醉呀
请问您的KPCA问题解决了吗?谢谢 dyhkxydfbb 发表于 2012-11-27 12:47 static/image/common/back.gif
请问您的KPCA问题解决了吗?谢谢
6年前的问题了,呵呵!估计都未必能够找到楼主了 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对测试数据进行识别,您看这个提取主元的方法对吗? dyhkxydfbb 发表于 2012-11-28 22:11 static/image/common/back.gif
教授您好,请问我这样写KPCA的代码是对的吗? 使用的是RBF核函数
%% 清空环境变量
基本思路应该是对的,具体细节还需要你自己去验证
页:
[1]
2