我想对由大约 40 000 个样本组成的数据集执行 PCA,每个样本显示大约 10 000 个特征。
使用 Matlab princomp 函数始终需要半个多小时,此时我终止了该进程。我想找到一个运行时间不到 10 分钟的实现/算法。最快的算法是什么?i7 双核 / 4GB Ram 需要多长时间?
我想对由大约 40 000 个样本组成的数据集执行 PCA,每个样本显示大约 10 000 个特征。
使用 Matlab princomp 函数始终需要半个多小时,此时我终止了该进程。我想找到一个运行时间不到 10 分钟的实现/算法。最快的算法是什么?i7 双核 / 4GB Ram 需要多长时间?
首先,您应该指定是想要所有组件还是最重要的组件?
表示你的矩阵和是样本数和维度。
如果您想要所有组件,经典的方法是计算协方差矩阵(其时间复杂度为) 然后对其应用 SVD (附加)。就内存而言,这需要(协方差矩阵 + 奇异向量和形成正交基的值)或GB为您的特定双精度.
您可以将 SVD 直接应用于矩阵如果您在此之前对每个维度进行归一化并采用左奇异向量。但是,实际上我希望矩阵的 SVD需要更长的时间。
如果您只需要一小部分(也许是最重要的)组件,您可能需要应用迭代 PCA。据我所知,所有这些算法都与 Lanczos 过程密切相关,因此您依赖于实际上,对于获得的向量,SVD 的精度很难达到,并且会随着奇异向量的数量而降低。
我猜你只需要几个(或几百个)主要奇异值/向量对。那么最好使用迭代的方法,这样会快很多,消耗的内存也少很多。
在 Matlab 中,请参见
帮助svds
您可以在 Cross Validated 上查看我的答案。我不想在这里复制它。基本上,您可以使用快速、随机的 SVD 来计算 PCA 基础和系数。
您可以尝试基于迭代计算几个特征向量的快速 PCA 算法。参见A.Sharma 和 KK Paliwal,使用定点分析进行快速主成分分析,模式识别快报,28,1151-1155,2007。