最快的高维数据 PCA 算法

计算科学 高维 数据分析
2021-12-17 03:39:48

我想对由大约 40 000 个样本组成的数据集执行 PCA,每个样本显示大约 10 000 个特征。

使用 Matlab princomp 函数始终需要半个多小时,此时我终止了该进程。我想找到一个运行时间不到 10 分钟的实现/算法。最快的算法是什么?i7 双核 / 4GB Ram 需要多长时间?

4个回答

首先,您应该指定是想要所有组件还是最重要的组件?

表示你的矩阵ARN×MN是样本数和M维度。

如果您想要所有组件,经典的方法是计算协方差矩阵CRM×M(其时间复杂度为O(NM2)) 然后对其应用 SVD (附加O(M3))。就内存而言,这需要O(2M2)(协方差矩阵 + 奇异向量和形成正交基的值)或1.5GB为您的特定双精度A.

您可以将 SVD 直接应用于矩阵A如果您在此之前对每个维度进行归一化并采用左奇异向量。但是,实际上我希望矩阵的 SVDA需要更长的时间。

如果您只需要一小部分(也许是最重要的)组件,您可能需要应用迭代 PCA据我所知,所有这些算法都与 Lanczos 过程密切相关,因此您依赖于C实际上,对于获得的向量,SVD 的精度很难达到,并且会随着奇异向量的数量而降低。

我猜你只需要几个(或几百个)主要奇异值/向量对。那么最好使用迭代的方法,这样会快很多,消耗的内存也少很多。

在 Matlab 中,请参见

帮助svds

您可以在 Cross Validated 上查看我的答案我不想在这里复制它。基本上,您可以使用快速、随机的 SVD 来计算 PCA 基础和系数。

您可以尝试基于迭代计算几个特征向量的快速 PCA 算法。参见A.Sharma 和 KK Paliwal,使用定点分析进行快速主成分分析,模式识别快报,28,1151-1155,2007