MATLAB中的主成分分析

mat*_*eek 9 matlab machine-learning octave computer-vision pca

我正在使用特征值分解为稀疏数据实现PCA.我知道matlab实现了PCA,但它帮助我理解编写代码时的所有技术细节.我一直在遵循这里的指导,但与内置函数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);
Run Code Online (Sandbox Code Playgroud)

Amr*_*mro 14

我是这样做的:

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
Run Code Online (Sandbox Code Playgroud)

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

load fisheriris

[V newX D] = myPCA(meas);
[PC newData Var] = princomp(meas);
Run Code Online (Sandbox Code Playgroud)

您可能也对这篇关于通过SVD执行PCA的相关帖子感兴趣.

  • @AhsanAli:PCA毕竟是一个正交变换,它将数据转换为新的坐标系统(这样数据沿着新方向按递减顺序具有最大方差).主要组件("COEFF"矩阵的列)是描述这个新系统方向的向量.现在,如果`(I,J,K)`是向量空间的基础集,那么`(a*I,b*J,c*K)`,具有相应改变的数据坐标(`SCORE`矩阵) .因此,只要特征向量跨越相同的子空间,它们就不是唯一的(可以独立地缩放/乘以常数). (2认同)