用于高维数据的最快PCA算法


11

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

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


是的,您是对的,我应该更精确。它花费了半个多小时,然后我决定终止该过程。我必须至少这样做十次,这样才能在不到10分钟的时间内完成工作,这太好了
醇厚的2012年

您的矩阵稀疏程度如何?
Arnold Neumaier 2012年

矩阵中的零百分比超过80%
圆润

还要检查kernal-PCA。
meawoppl 2012年

Answers:


11

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

表示矩阵其中为样本数和维数。 Ñ 中号ARN×MNM

如果您想要所有组件,那么经典的方法是计算协方差矩阵(时间复杂度为),然后对其应用SVD (附加)。在内存方面,对于您的特定将采用(协方差矩阵+奇异向量和形成正交基的值)或 GB的双精度。 ø Ñ 中号2ø 中号3Ô 2 中号21.5 CRM×MO(NM2)O(M3)O(2M2)1.5A

如果在此之前对每个维进行归一化并采用左奇异矢量,则可以将SVD直接应用于矩阵但是,实际上,我希望矩阵 SVD 会花费更长的时间。AAA

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


2

我猜您只需要几个(或几百个)显性奇异值/向量对。然后最好使用迭代方法,该方法将更快并且消耗更少的内存。

在Matlab中,请参阅

帮助svds


是的,如果我只需要前一百个组件,似乎迭代方法会更快。
醇厚的2012年

就svds而言,我试图将矩阵设置为稀疏格式并修改princomp函数以将svds而不是svd放入,令我惊讶的是,它在2000 * 4000矩阵上花费了更长的时间(180 s而不是15s )。奇异的...
醇厚的2012年

1
无需切换为稀疏格式。另外,您需要减少要计算的奇异向量的数量。为了计算完整的svd,svds不适合。
阿诺德·诺伊迈耶

2
对于主导模式,还应注意的是较新的随机svd方法,如stanford.edu/group/mmds/slides2010/Martinsson.pdf
Nick Alger


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.