主成分使用Matlab中的不同函数计算

时间:2014-01-20 19:31:28

标签: matlab pca svd eigenvector

我试图理解Matlab中的主成分分析,

似乎至少有3种不同的功能可以做到这一点。

我对以下代码提出了一些问题:

  1. 我是否正确使用一个特征向量(对应于最大特征值的那个)创建近似x值?我想是这样的?

  2. 为什么PCV两者都是(x'x)的加载方式不同?列顺序是相反的,因为eig没有先排序具有最大值的特征值,但为什么它们相互为负?

  3. 为什么eig值没有与第一列中最大特征值对应的特征向量排序?

  4. 使用下面的代码,我在使用xsvd时返回输入矩阵eig,但是princomp的结果似乎完全不同了?我需要做些什么来使princomp与其他两个函数匹配?

  5. 代码:

    x=[1 2;3 4;5 6;7 8 ]
    
    econFlag=0;
    
    [U,sigma,V] = svd(x,econFlag);%[U,sigma,coeff] = svd(z,econFlag);
    
    U1=U(:,1);
    V1=V(:,1);
    sigma_partial=sigma(1,1);
    
    score1=U*sigma;
    test1=score1*V';
    
    score_partial=U1*sigma_partial;
    test1_partial=score_partial*V1';
    
    
    
    [PC, D] = eig(x'*x)
    
     score2=x*PC;
    test2=score2*PC';
    
    PC1=PC(:,2);
    score2_partial=x*PC1;
     test2_partial=score2_partial*PC1';
    
    [o1 o2 o3]=princomp(x);
    

1 个答案:

答案 0 :(得分:5)

  1. 是。根据{{​​3}}的文档,输出S的对角元素按递减顺序排列。尽管D的输出eig没有这样的保证。

  2. 特征向量和奇异向量没有定义符号。如果a是特征向量,那么-a

  3. 我经常想知道同样的事情。 TMW的懒惰?优化,因为排序是一个额外的步骤,并不是每个人都需要排序?

  4. princomp在计算主要组件之前使输入数据居中。这是有道理的,因为通常PCA是相对于协方差矩阵计算的,x' * x的特征向量只有在x无均值时才与协方差矩阵的特征向量相同。

    < / LI>

    我会通过变换到协方差矩阵(居中数据)的特征向量的基础来计算PCA,但是将此变换应用于原始(未中心)数据。这允许使用尽可能少的主要组件捕获最大差异,但仍然可以从所有主要组件中恢复原始数据:

    [V, D] = eig(cov(x));
    
    score = x * V;
    test = score * V';
    

    testx相同,最多为数字错误。

    为了轻松选择差异最大的组件,让我们自己解决缺乏排序的问题:

    [V, D] = eig(cov(x));
    [D, ind] = sort(diag(D), 'descend');
    V = V(:, ind);
    
    score = x * V;
    test = score * V';
    

    仅使用最强主成分重建信号:

    test_partial = score(:, 1) * V(:, 1)';
    

    回应Amro的评论:当然也可以先从输入数据中删除均值,然后转换这些“居中”的数据。在这种情况下,为了完美地重建原始数据,有必要再次添加装置。计算上述PCA的方法是由Neil H. Timm描述的方法, Applied Multivariate Analysis ,Springer 2002,第446页:

      

    给定具有平均μ的观测向量Y和满秩p的协方差矩阵Sigma,PCA的目标是创建称为主成分(PC)或主要变量的一组新变量。主成分是矢量Y的变量的线性组合,它们是不相关的,这样第j个分量的方差是最大的。

    Timm后来将“标准化组件”定义为从中心数据计算出来的那些,然后除以特征值的平方根(即方差),即“标准化主成分”具有均值0和方差1。