声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 5689|回复: 16

[编程技巧] 将KPCA应用于过程监控中出现的问题

[复制链接]
发表于 2006-11-13 15:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

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

使用道具 举报

发表于 2006-11-13 16:38 | 显示全部楼层

回复

你把你的代码先传上来看看吧.这样别人才可以帮你找找不成功的原因.
 楼主| 发表于 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=[0.1*randn(100,1),0.1*randn(100,1),0.1*randn(100,1)];
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;

%奇异值分解核矩阵
[U,S] = 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');
发表于 2006-11-13 22:55 | 显示全部楼层

回复

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

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

[ 本帖最后由 eight 于 2007-1-19 19:15 编辑 ]
 楼主| 发表于 2006-11-14 09:15 | 显示全部楼层
这是我截取的一段,limitT2可以不要,看看我的程序写的有什么问题吗?原理上的,或程序上的。谢谢!
发表于 2006-11-14 10:57 | 显示全部楼层

回复

程序上好象没有什么问题,plot(time,modelT2,'r'),也可画出图来.
原理上这要花时间看看了.
另:你可以参考一些人脸识别及PCA方面的程序及论文,也许对你有帮助.
 楼主| 发表于 2006-11-14 15:37 | 显示全部楼层
但是输出的曲线不对啊


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

[ 本帖最后由 ChaChing 于 2009-11-9 09:36 编辑 ]
发表于 2006-11-14 15:49 | 显示全部楼层

回复

我上传一个程序包吧,你自己看看.
 楼主| 发表于 2006-11-15 10:00 | 显示全部楼层
thanks!传一个你自己的实例吧。

[ 本帖最后由 ChaChing 于 2009-11-9 09:21 编辑 ]
发表于 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,就和我的差不多,凭什么放大了十倍啊!!呵呵,苦笑中!!
发表于 2012-1-4 16:00 | 显示全部楼层
楼主也很厉害呀,看得我很陶醉呀
发表于 2012-11-27 12:47 | 显示全部楼层
发表于 2012-11-27 14:43 | 显示全部楼层
dyhkxydfbb 发表于 2012-11-27 12:47
请问您的KPCA问题解决了吗?谢谢

6年前的问题了,呵呵!估计都未必能够找到楼主了
发表于 2012-11-28 22:11 | 显示全部楼层
happy 发表于 2012-11-27 14:43
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;
[coeff, score, latent, T2] = 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 = [m(1:30,:);m(60:95,:);m(131:153,:)];
% 相应的训练集的标签也要分离出来
train_wine_labels = [wine_labels(1:30);wine_labels(60:95);wine_labels(131:153)];
% 将第一类的31-59,第二类的96-130,第三类的154-178做为测试集
test_wine = [m(31:59,:);m(96:130,:);m(154:178,:)];
% 相应的测试集的标签也要分离出来
test_wine_labels = [wine_labels(31:59);wine_labels(96:130);wine_labels(154:178)];


然后后面再用BP或者SVM对测试数据进行识别,您看这个提取主元的方法对吗?
发表于 2012-11-29 11:05 | 显示全部楼层
dyhkxydfbb 发表于 2012-11-28 22:11
教授您好,请问我这样写KPCA的代码是对的吗? 使用的是RBF核函数

%% 清空环境变量

基本思路应该是对的,具体细节还需要你自己去验证
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-6-17 02:37 , Processed in 0.060299 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表