主成分分析Matlab源码分析

  • 格式:doc
  • 大小:34.00 KB
  • 文档页数:3

主成分分析源程序代码分析
function[pc, score, latent, tsquare] = princomp(x);
% PRINCOMP Principal Component Analysis (centered and scaled data).
% [PC, SCORE, LATENT, TSQUARE] = PRINCOMP(X) takes a data matri x X and
% returns the principal components in PC, the so-called Z-scores in SCORE S,
% the eigenvalues of the covariance matrix of X in LATENT, and Hotelling 's
% T-squared statistic for each data point in TSQUARE.
% Reference: J. Edward Jackson, A User's Guide to Principal Components % John Wiley & Sons, Inc. 1991 pp. 1-25.
% B. Jones 3-17-94
% Copyright 1993-2002 The MathWorks, Inc.
% $Revision: 2.9 $ $Date: 2002/01/17 21:31:45 $
[m,n] = size(x); % 得到矩阵的规模,m行,n列
r = min(m-1,n); % max possible rank of x
% 该矩阵最大的秩不能超过列数,
% 也不能超过行数减1
avg = mean(x); % 求每一列的均值,付给一个n维行向量
centerx = (x - avg(ones(m,1),:));
% x的每个元素减去该列的均值,
% 使样本点集合重心与坐标原点重合
[U,latent,pc] = svd(centerx./sqrt(m-1),0);
% “经济型”的奇异值分解
score = centerx*pc; % 得分矩阵即为原始矩阵乘主成分矩阵
if nargout < 3, return; end
latent = diag(latent).^2; % 将奇异值矩阵转化为一个向量
if (r<N)
latent = [latent(1:r); zeros(n-r,1)];
score(:,r+1:end) = 0;
end
if nargout < 4, return; end
tmp = sqrt(diag(1./latent(1:r)))*score(:,1:r)';
tsquare = sum(tmp.*tmp)';
主成分分析[Matlab版]
function main()
%*************主成份分析************
%读入文件数据
X=load('data.txt');
%==========方法1:求标准化后的协差矩阵,再求特征根和特征向量=================
%标准化处理
[p,n]=size(X);
for j=1:n
mju(j)=mean(X(:,j));
sigma(j)=sqrt(cov(X(:,j)));
end
for i=1:p
for j=1:n
Y(i,j)=(X(i,j)-mju(j))/sigma(j);
end
end
sigmaY=cov(Y);
%求X标准化的协差矩阵的特征根和特征向量
[T,lambda]=eig(sigmaY);
disp('特征根(由小到大):');
disp(lambda);
disp('特征向量:');
disp(T);
%方差贡献率;累计方差贡献率
Xsum=sum(sum(lambda,2),1);
for i=1:n
fai(i)=lambda(i,i)/Xsum;
end
for i=1:n
psai(i)= sum(sum(lambda(1:i,1:i),2),1)/Xsum;
end
disp('方差贡献率:');
disp(fai);
disp('累计方差贡献率:');
disp(psai);
%综合评价....略
%+============方法2:求X的相关系数矩阵,再求特征根和特征向量================
%X的标准化的协方差矩阵就是X的相关系数矩阵
R=corrcoef(X);
%求X相关系数矩阵的特征根和特征向量
[TR,lambdaR]=eig(R);
disp('特征根(由小到大):');
disp(lambdaR);
disp('特征向量:');
disp(TR);。