我试图理解Matlab中的主成分分析,
似乎至少有3种不同的功能可以做到这一点。
我对以下代码提出了一些问题:
我是否正确使用一个特征向量(对应于最大特征值的那个)创建近似x
值?我想是这样的?
为什么PC
和V
两者都是(x'x)的加载方式不同?列顺序是相反的,因为eig没有先排序具有最大值的特征值,但为什么它们相互为负?
为什么eig
值没有与第一列中最大特征值对应的特征向量排序?
使用下面的代码,我在使用x
和svd
时返回输入矩阵eig
,但是princomp的结果似乎完全不同了?我需要做些什么来使princomp与其他两个函数匹配?
代码:
x=[1 2;3 4;5 6;7 8 ]
econFlag=0;
[U,sigma,V] = svd(x,econFlag);%[U,sigma,coeff] = svd(z,econFlag);
U1=U(:,1);
V1=V(:,1);
sigma_partial=sigma(1,1);
score1=U*sigma;
test1=score1*V';
score_partial=U1*sigma_partial;
test1_partial=score_partial*V1';
[PC, D] = eig(x'*x)
score2=x*PC;
test2=score2*PC';
PC1=PC(:,2);
score2_partial=x*PC1;
test2_partial=score2_partial*PC1';
[o1 o2 o3]=princomp(x);
答案 0 :(得分:5)
是。根据{{3}}的文档,输出S
的对角元素按递减顺序排列。尽管D
的输出eig
没有这样的保证。
特征向量和奇异向量没有定义符号。如果a
是特征向量,那么-a
。
我经常想知道同样的事情。 TMW的懒惰?优化,因为排序是一个额外的步骤,并不是每个人都需要排序?
princomp
在计算主要组件之前使输入数据居中。这是有道理的,因为通常PCA是相对于协方差矩阵计算的,x' * x
的特征向量只有在x
无均值时才与协方差矩阵的特征向量相同。
我会通过变换到协方差矩阵(居中数据)的特征向量的基础来计算PCA,但是将此变换应用于原始(未中心)数据。这允许使用尽可能少的主要组件捕获最大差异,但仍然可以从所有主要组件中恢复原始数据:
[V, D] = eig(cov(x));
score = x * V;
test = score * V';
test
与x
相同,最多为数字错误。
为了轻松选择差异最大的组件,让我们自己解决缺乏排序的问题:
[V, D] = eig(cov(x));
[D, ind] = sort(diag(D), 'descend');
V = V(:, ind);
score = x * V;
test = score * V';
仅使用最强主成分重建信号:
test_partial = score(:, 1) * V(:, 1)';
回应Amro的评论:当然也可以先从输入数据中删除均值,然后转换这些“居中”的数据。在这种情况下,为了完美地重建原始数据,有必要再次添加装置。计算上述PCA的方法是由Neil H. Timm描述的方法, Applied Multivariate Analysis ,Springer 2002,第446页:
给定具有平均μ的观测向量Y和满秩p的协方差矩阵Sigma,PCA的目标是创建称为主成分(PC)或主要变量的一组新变量。主成分是矢量Y的变量的线性组合,它们是不相关的,这样第j个分量的方差是最大的。
Timm后来将“标准化组件”定义为从中心数据计算出来的那些,然后除以特征值的平方根(即方差),即“标准化主成分”具有均值0和方差1。