问题在标题中。
我正在使用大约10K-100K x 1K-10K的密集矩阵,并且需要PCA来减少维数。我通常想要捕获约95%的方差。在我的数据中,我通常会得到大约1/3的组件 - 数据不仅仅是密集的,冗余级别只是适中的。
带有prcomp
的PCA在较高维度和/或较大N时非常缓慢。但我没有看到明显的前进方式,因为prcomp
的{{3}}非常简单 - 它基本上只是在调用svd
时进行内务管理。并且可能svd
已经过大量优化。
我已经尝试过这个包irlba
,但由于某种原因它比prcomp
慢 - 可能与我的数据集有关。
只是为了好玩,这是一个简单的例子:
library(MASS)
N <- 10
p <- 2
out <- c()
haventHitControlCYet <- TRUE
i <- 0
while(haventHitControlCYet == TRUE) {
i <- i+1
N <- N*2
p <- p*2
C <- matrix(rnorm(p^2), p)
covmat <- crossprod(C)
X <- mvrnorm(N, rep(0, p), covmat)
PT <- proc.time()
pca <- prcomp(X, center = T, scale. = T)
out[i] <- (proc.time() - PT)[3]
plot(out, type = "b")
}
当数据大小加倍时,计算时间 - 超过双倍。
提出这个问题是因为谷歌搜索打开了特定种类数据(基因组学等)的包,我正在寻找一种通用的方法来加速计算密度矩阵的PCA,其中N> p。
感到惊讶的是,这方面还没有一个主题,因为它似乎是一个常见的问题。除非当然已经达到了速度的理论上的严格限制,已经达到了。(?)