Matlab中使用不同函数计算的主成分
Posted
技术标签:
【中文标题】Matlab中使用不同函数计算的主成分【英文标题】:Principal Components calculated using different functions in Matlab 【发布时间】:2014-02-10 03:02:52 【问题描述】:我正在尝试理解 Matlab 中的主成分分析,
似乎至少有 3 个不同的功能可以做到这一点。
我对下面的代码有一些疑问:
我是否仅使用一个特征向量(对应于最大特征值的那个)正确地创建了近似 x
值?我想是的??
为什么 PC
和 V
都意味着 (x'x) 的载荷呈现不同?列顺序颠倒了,因为eig没有把最大的特征值排在最前面,但为什么它们是彼此的负数?
为什么eig
的值没有与第一列最大特征值对应的特征向量排序?
当使用svd
和eig
时,使用下面的代码返回输入矩阵x
,但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);
【问题讨论】:
您的代码缺少(尝试)从princomp
的输出重构x
的部分。
相关:***.com/a/4403027, ***.com/a/3181851
看这个关于特征向量顺序的问题:***.com/q/13704384/97160
【参考方案1】:
是的。根据svd
的文档,输出S
的对角线元素按降序排列。但是,eig
的输出 D
没有这样的保证。
特征向量和奇异向量没有定义符号。如果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的cmets:当然也可以先从输入数据中去掉均值,然后对这些“居中”的数据进行变换。在这种情况下,为了完美重建原始数据,有必要再次添加方法。上面给出的计算 PCA 的方法是 Neil H. Timm,Applied Multivariate Analysis,Springer 2002,第 446 页所描述的方法:
给定一个观测向量 Y,其均值为 mu 和全秩 p 的协方差矩阵 Sigma,PCA 的目标是创建一组称为主成分 (PC) 或主变量的新变量。主成分是向量 Y 的不相关变量的线性组合,使得第 j 个成分的方差最大。
Timm 后来将“标准化成分”定义为从中心数据计算出来的成分,然后除以特征值(即方差)的平方根,即“标准化主成分”具有均值 0 和方差 1。
【讨论】:
当你对特征向量进行排序时,我认为你应该只对列重新排序,如V = V(:,ind)
。同样就像您提到的,x
必须以零为中心,然后再乘以 V
以计算 score
您说的第一件事是对的,感谢您指出! - 但我不同意第二个。如果主成分应该提供最大方差分解,那么eig
的参数需要从中心数据中计算出来。但正如我所写,我认为最好在非中心数据上计算“分数”,或者实际上是主成分,因为只有这样才能完美恢复原始数据,即只有这样 PCA 才能提供分解。
嗯,是的,如果你想重建原始数据(可能来自截断的特征向量集),你必须在乘法之后加回平均向量。我的意思是得到一个类似于princomp
函数返回的scores
变量
@Amro,无论哪种方式都可以。我更喜欢这种方式,因为它更简单,您不需要对手段进行任何特殊处理。我的方法也是 Neil H. Timm 描述的方法,Applied Multivariate Analysis,Springer 2002,第 446 页。我现在包含参考。
@Bazman:是的。与eig
不同,svd
在文档中明确声明奇异值按降序返回。以上是关于Matlab中使用不同函数计算的主成分的主要内容,如果未能解决你的问题,请参考以下文章
R语言使用psych包的principal函数对指定数据集进行主成分分析PCA进行数据降维(输入数据为相关性矩阵)计算主成分评分系数每个样本(观察)的主成分得分由主成分分数系数构建的公式得到
R语言进行主成分分析(PCA):使用prcomp函数来做主成分分析使用summary函数查看主成分分析的结果计算每个主成分解释方差的每个主成分解释的方差的比例以及多个主成分累积解释的方差比例