MATLAB中的主成分分析
我正在使用稀疏数据的特征值分解实现PCA。我知道matlab已经实现了PCA,但它可以帮助我理解编写代码时的所有技术细节。 我一直遵循来自的指导,但与内置函数princomp相比,我得到了不同的结果 谁能看一下,给我指个方向吗 代码如下:MATLAB中的主成分分析,matlab,machine-learning,computer-vision,octave,pca,Matlab,Machine Learning,Computer Vision,Octave,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
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);
函数[mu,Ev,Val]=pca(数据)
%mu-均值图像
%Ev-矩阵,其列为对应于特征向量的特征向量
%价值观
%Val-特征值
如果nargin~=1
错误('用法:[mu,E,Values]=pca_q1(数据)';
结束
mu=平均值(数据);
nimages=大小(数据,2);
对于i=1:nimages
数据(:,i)=数据(:,i)-mu(i);
结束
L=数据'*数据;
[Ev,VAL]=eig(L);
[Ev,VAL]=排序(Ev,VAL);
%实协方差矩阵特征向量的计算
Ev=数据*Ev;
Val=诊断值(Val);
VAL=VAL/(尼美日-1);
%将Ev标准化为单位长度
适当=0;
对于i=1:nimages
Ev(:,i)=Ev(:,1)/标准值(Ev(:,i));
如果VAL(i)<0.00001
Ev(:,i)=零(大小(Ev,1),1);
其他的
正确=正确+1;
结束;
结束;
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)
[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);
你可能也对这篇关于表演的相关文章感兴趣。我想问一个问题,Is
princomp
默认情况下按潜在对COEFF
的数据进行排序(参考:)?您的函数与princomp
之间有什么区别?我想使用coeff
和潜伏期,其中coeff
按潜伏期进行排序。我可以使用内置函数princomp
或您的myPCA
?@AhsanAli:显然,正如上面的示例所示,两个函数产生相同的输出(达到一定精度);COEFF
(主成分)的列按照成分方差潜在
按降序排序。另外,请检查上面提到的关于使用SVD而不是EIG执行PCA的最后一个链接。。注意,在最近的版本中,它被函数所取代(事实上,检查源代码以查看对princomp
的调用在内部被路由到pca
)。好的,b/wpca
和princomp
以及SVD在函数myPCA
和pca中的区别是什么?我无法区分它们?我的问题是,我想计算n
的pca
矩阵[500x3]
其中coeff
是用最新值排序的@AhsanAli:pca毕竟是一种正交变换,它将数据转换成一个新的坐标系(这样数据沿新方向的方差按降序最大)。主成分(系数矩阵的列)是描述新系统方向的向量。现在,如果(I,J,K)
是向量空间的基集,那么(a*I,b*J,c*K)也是
,具有相应变化的数据坐标(分数
矩阵)。因此特征向量不是唯一的(可以独立缩放/乘以常数),只要它们跨越相同的子空间。