主成分使用Matlab中的不同函数计算

Baz*_*man 3 matlab svd eigenvector pca

我试图理解Matlab中的主成分分析,

似乎至少有3种不同的功能可以做到这一点.

我在下面的代码中有一些问题:

  1. x是否正确使用一个特征向量(对应于最大特征值的特征向量)创建近似值?我认同??

  2. 为什么PCV哪些都是(x'x)表示不同的载荷?列顺序是相反的,因为eig不会首先排序具有最大值的特征值,但为什么它们彼此为负?

  3. 为什么这些eig值不是与特征向量一致的,与第一列中最大的特征值相对应?

  4. 使用下面的代码,我回到输入矩阵x使用时svdeig,但是从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);
Run Code Online (Sandbox Code Playgroud)

A. *_*nda 5

  1. 是.根据文档svd,输出的对角元素S按递减顺序排列.有对输出没有这样的保证Deig,虽然.

  2. 特征向量和奇异向量没有定义的符号.如果a是特征向量,那么-a.

  3. 我经常想知道同样的事情.TMW的懒惰?优化,因为排序是一个额外的步骤,并不是每个人都需要排序?

  4. princomp在计算主要组件之前使输入数据居中.这是有意义的,因为通常PCA是相对于协方差矩阵计算的,并且x' * x如果x是无均值的,则特征向量仅与协方差矩阵的特征向量相同.


我将通过变换到协方差矩阵(居中数据)的特征向量的基础来计算PCA,但是将该变换应用于原始(未中心)数据.这允许使用尽可能少的主要组件捕获最大差异,但仍然从所有这些组件中恢复原始数据:

[V, D] = eig(cov(x));

score = x * V;
test = score * V';
Run Code Online (Sandbox Code Playgroud)

testx数值误差相同.

为了轻松选择具有最大差异的组件,让我们自己解决缺乏排序的问题:

[V, D] = eig(cov(x));
[D, ind] = sort(diag(D), 'descend');
V = V(:, ind);

score = x * V;
test = score * V';
Run Code Online (Sandbox Code Playgroud)

仅使用最强主成分重建信号:

test_partial = score(:, 1) * V(:, 1)';
Run Code Online (Sandbox Code Playgroud)

回应Amro的评论:当然也可以先从输入数据中删除均值,然后转换这些"居中"的数据.在这种情况下,为了完美地重建原始数据,有必要再次添加装置.上面给出的计算PCA的方法是由Neil H. Timm,Applied Multivariate Analysis,Springer 2002,第446页描述的方法:

给定具有平均μ的观测向量Y和满秩p的协方差矩阵Sigma,PCA的目标是创建称为主成分(PC)或主要变量的一组新变量.主成分是矢量Y的变量的线性组合,它们是不相关的,使得第j个分量的方差是最大的.

Timm后来将"标准化组件"定义为从中心数据计算出来的那些,然后除以特征值的平方根(即方差),即"标准化主成分"具有均值0和方差1.

  • @Bazman:是的.与`eig`不同,[`svd`](http://www.mathworks.com/help/matlab/ref/svd.html)在文档中明确指出奇异值按递减顺序返回. (2认同)