Baz*_*man 3 matlab svd eigenvector pca
我试图理解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);
Run Code Online (Sandbox Code Playgroud)
是.根据文档svd
,输出的对角元素S
按递减顺序排列.有对输出没有这样的保证D
的eig
,虽然.
特征向量和奇异向量没有定义的符号.如果a
是特征向量,那么-a
.
我经常想知道同样的事情.TMW的懒惰?优化,因为排序是一个额外的步骤,并不是每个人都需要排序?
princomp
在计算主要组件之前使输入数据居中.这是有意义的,因为通常PCA是相对于协方差矩阵计算的,并且x' * x
如果x
是无均值的,则特征向量仅与协方差矩阵的特征向量相同.
我将通过变换到协方差矩阵(居中数据)的特征向量的基础来计算PCA,但是将该变换应用于原始(未中心)数据.这允许使用尽可能少的主要组件捕获最大差异,但仍然从所有这些组件中恢复原始数据:
[V, D] = eig(cov(x));
score = x * V;
test = score * V';
Run Code Online (Sandbox Code Playgroud)
test
与x
数值误差相同.
为了轻松选择具有最大差异的组件,让我们自己解决缺乏排序的问题:
[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.