登录论坛

查看完整版本 : MATLAB中的主成分分析


poster
2019-12-10, 20:48
我正在使用特征值分解实现稀疏数据的PCA。我知道matlab实现了PCA,但是当我编写代码时,它可以帮助我了解所有技术。我一直从这里 (http://books.google.com/books?id=bXzAlkODwa8C&lpg=PA647&dq=eigenvalue%20decomposition&pg=PA647#v=onepage&q&f=false)开始遵循指南,但是与内置函数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);

回答:

这是我的处理方式:

function [V newX D] = myPCA(X) X = bsxfun(@minus, X, mean(X,1)); %# zero-center C = (X'*X)./(size(X,1)-1); %'# cov(X) [VD] = 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); 您可能也对这篇有关通过SVD (https://stackoverflow.com/questions/3181593/matlab-is-running-out-of-memory-but-it-should-not-be/3181851#3181851)执行PCA的 (https://stackoverflow.com/questions/3181593/matlab-is-running-out-of-memory-but-it-should-not-be/3181851#3181851)相关文章感兴趣。



更多&回答... (https://stackoverflow.com/questions/4402110)