我想了解 Matlab 中的主成分分析,

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

我对下面的代码有一些疑问:

  • 我是否正确地仅使用一个特征向量(对应于最大特征值的那个)来创建近似的 x 值?我认同??
  • 为什么 PCV 都意味着 (x'x) 的加载不同?列顺序是相反的,因为 eig 不会首先对具有最大值的特征值进行排序,但为什么它们彼此互为负数?
  • 为什么 eig 值没有与第一列中最大特征值对应的特征向量排序?
  • 使用下面的代码,我在使用 xsvd 时回到输入矩阵 eig ,但是 princomp 的结果似乎完全不同?那么我必须做什么才能使 princomp 匹配其他两个函数?

  • 代码:
    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);
    

    最佳答案

  • 是的。根据 svd 的文档,输出 S 的对角线元素按降序排列。但是,D 的输出 eig 没有这样的保证。
  • 特征向量和奇异向量没有定义的符号。如果 a 是特征向量,那么 -a 也是。
  • 我也经常这么想。 TMW 的懒惰?优化,因为排序将是一个额外的步骤,并不是每个人都需要对它们进行排序?
  • princomp 在计算主成分之前将输入数据居中。这是有道理的,因为通常 PCA 是相对于协方差矩阵计算的,如果 x' * x 是无均值,那么 x 的特征向量仅与协方差矩阵的特征向量相同。


  • 我将通过转换到协方差矩阵(居中数据)的特征向量的基础来计算 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 页描述的方法:



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

    关于matlab - 在 Matlab 中使用不同函数计算的主成分,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21242542/

    10-11 16:01