【问题标题】:Principal Component Analysis in MATLABMATLAB 中的主成分分析
【发布时间】:2011-05-23 01:46:09
【问题描述】:

我正在使用稀疏数据的特征值分解来实现 PCA。我知道 matlab 已经实现了 PCA,但它可以帮助我在编写代码时理解所有技术细节。 我一直在遵循here 的指导,但与内置函数 princomp 相比,我得到了不同的结果。

谁能看看它并指出正确的方向。

代码如下:

function [mu, Ev, Val ] = pca(data)

% mu - mean image
% Ev - matrix whose columns are the eigenvectors corresponding to the eigen
% values Val 
% Val - eigenvalues

if nargin ~= 1
 error ('usage: [mu,E,Values] = pca_q1(data)');
end

mu = mean(data)';

nimages = size(data,2);

for i = 1:nimages
 data(:,i) = data(:,i)-mu(i);
end

L = data'*data;
[Ev, Vals]  = eig(L);    
[Ev,Vals] = sort(Ev,Vals);

% computing eigenvector of the real covariance matrix
Ev = data * Ev;

Val = diag(Vals);
Vals = Vals / (nimages - 1);

% normalize Ev to unit length
proper = 0;
for i = 1:nimages
 Ev(:,i) = Ev(:,1)/norm(Ev(:,i));
 if Vals(i) < 0.00001
  Ev(:,i) = zeros(size(Ev,1),1);
 else
  proper = proper+1;
 end;
end;

Ev = Ev(:,1:nimages);

【问题讨论】:

    标签: matlab machine-learning computer-vision octave pca


    【解决方案1】:

    我会这样做:

    function [V newX D] = myPCA(X)
        X = bsxfun(@minus, X, mean(X,1));           %# zero-center
        C = (X'*X)./(size(X,1)-1);                  %'# cov(X)
    
        [V D] = eig(C);
        [D order] = sort(diag(D), 'descend');       %# sort cols high to low
        V = V(:,order);
    
        newX = X*V(:,1:end);
    end
    

    还有一个与统计工具箱中的 PRINCOMP 函数进行比较的示例:

    load fisheriris
    
    [V newX D] = myPCA(meas);
    [PC newData Var] = princomp(meas);
    

    您可能还对这篇有关执行PCA by SVD 的相关帖子感兴趣。

    【讨论】:

    • 我想问一下,princomp是不是默认将COEFF的数据按latent排序(参考:mathworks.com/help/stats/princomp.html)?你的函数和princomp有什么区别@
    • 我想使用coefflatent,其中coefflatents排序。我可以使用内置函数princomp 或您的myPCA 吗??
    • @AhsanAli:显然如上例所示,两个函数产生相同的输出(达到一定精度); COEFF(主成分)的列按成分方差LATENT 的降序排列。还要检查上面提到的关于使用 SVD 而不是 EIG 执行 PCA 的最后一个链接。请注意,princomp 在最近的版本中被替换为 pca 函数(实际上检查源代码以查看对 princomp 的调用正在内部路由到pca)。
    • 好的,b/w pca & princomp 和你的函数 myPCA & PCA by SVD 有什么区别?我无法区分黑白它们?我的问题是,我想计算nn[500x3] 的矩阵,其中coefflatents 排序。
    • @AhsanAli:PCA 毕竟是将数据转换到新坐标系的正交变换(这样数据在新方向上按降序排列具有最大方差)。主成分(COEFF 矩阵的列)是描述这个新系统方向的向量。现在,如果(I,J,K) 是向量空间的基组,那么(a*I,b*J,c*K) 也是,具有相应改变的数据坐标(SCORE 矩阵)。所以特征向量不是唯一的(可以独立缩放/乘以一个常数),只要它们跨越相同的子空间。
    猜你喜欢
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 2015-07-03
    • 2015-12-09
    • 2012-07-05
    • 1970-01-01
    相关资源
    最近更新 更多