Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
![]() |
#1 |
高级会员
注册日期: 2019-11-21
帖子: 3,006
声望力: 66 ![]() |
![]()
我正在使用特征值分解实现稀疏数据的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); 回答: 这是我的处理方式: 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执行PCA的相关文章感兴趣。 更多&回答... |
![]() |
![]() |