【发布时间】:2014-08-24 04:36:28
【问题描述】:
我的问题是:如果有一个我们想要在其上进行 PCA 的矩阵,其中特征的数量大大超过了试验的数量,为什么 prcomp 的行为不符合预期(或者我错过了什么)?
以下是问题摘要,full code is here、compressed 7MB data source is here(未压缩为 55MB)、target image is here。
我的确切情况是我有一个矩阵 p x n 矩阵 X(p = 特征,n = 试验),其中试验是拍摄的面部照片,特征是照片中的像素(所以 32256 x 148矩阵)。我想要做的是找到该矩阵的主成分得分向量。由于求协方差矩阵 XX^T 代价太大,一个简单的解决方法是求 X^TX 的特征向量 (v_i) 并通过 X (Xv_i) more info 变换它们。
XTX <- t(X) %*% X # missing the 1 / n - 1 for cov matrix b/c we normalize later anyway
eigen <- eigen(XTX)
eigenvectors.XTX.col <- eigen$vectors
principal.component.scores <- apply(eigenvectors.XTX.col, 2, function(c) {
normalize.vector(X %*% matrix(c, ncol = 1))
})
在我的例子中,主成分分数是特征脸,可以用来成功重建目标脸,如下所示:http://cl.ly/image/260w0N0u0Z3y(参考我的full code for how)
将 X 传递给 prcomp 应该做一些等效的事情,但结果与上述本土方式不同:
pca <- prcomp(X)
pca$x # right size, but wrong pc scores
使用pca$x重建人脸的结果不是完全废话,而是更糟糕:http://cl.ly/image/2p19360u2P43
我还检查了在 t(x) 上使用 prcomp 会产生不同的旋转矩阵,因此 prcomp 正在做一些花哨的事情,但在幕后却有些神秘。我从here 知道prcomp 正在使用SVD 来计算主成分加载向量而不是特征分解,但这不应该导致任何错误(或者我认为......)。
使用内置prcomp方法的正确方法是什么,一定有方法吧?
【问题讨论】:
-
由于“数学”,该方法无法解决您的问题。您应该至少拥有与变量一样多的观测值,但最好是前者更多。
-
感谢@RomanLuštrik 的评论! This source 证实了您对
princomp方法所说的话,但正如我在下面的答案中惊讶地发现的那样,并非您需要比变量更多的观察结果(这在基因组学等某些学科中是不可能的,或者即使在这里有面部识别)。相反,这里的问题是prcomp中的一些令人讨厌的默认值以及缺乏规范化。抱歉我的问题中的蹩脚问题!
标签: r pca svd eigenvector