Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 其它 > 资料存档
资料存档 资料存档
回复
 
主题工具 显示模式
旧 2019-12-10, 20:48   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 MATLAB中的主成分分析

我正在使用特征值分解实现稀疏数据的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的相关文章感兴趣。



更多&回答...
poster 当前离线   回复时引用此帖
回复

主题工具
显示模式

发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛禁用 表情符号
论坛启用 [IMG] 代码
论坛启用 HTML 代码



所有时间均为北京时间。现在的时间是 05:13


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.