我想对大约40000个样本组成的数据集执行PCA,每个样本显示大约10000个特征。
始终使用Matlab princomp函数要花费半小时以上的时间,此时我终止了该过程。我想找到一个运行时间少于10分钟的实现/算法。最快的算法是什么?i7双核/ 4GB Ram需要多长时间?
我想对大约40000个样本组成的数据集执行PCA,每个样本显示大约10000个特征。
始终使用Matlab princomp函数要花费半小时以上的时间,此时我终止了该过程。我想找到一个运行时间少于10分钟的实现/算法。最快的算法是什么?i7双核/ 4GB Ram需要多长时间?
Answers:
首先,您应该指定是要所有组件还是最重要的组件?
表示矩阵其中为样本数和维数。 Ñ 中号
如果您想要所有组件,那么经典的方法是计算协方差矩阵(时间复杂度为),然后对其应用SVD (附加)。在内存方面,对于您的特定将采用(协方差矩阵+奇异向量和形成正交基的值)或 GB的双精度。 ø (Ñ 中号2)ø (中号3)Ô (2 中号2)≈ 1.5 甲
如果在此之前对每个维进行归一化并采用左奇异矢量,则可以将SVD直接应用于矩阵但是,实际上,我希望矩阵 SVD 会花费更长的时间。A
如果只需要一部分(也许是最重要的)组件,则可能需要应用迭代PCA。据我所知,所有这些算法都与Lanczos进程密切相关,因此您依赖于的频谱,实际上,要获得的矢量很难达到SVD的精度,并且随着奇异矢量的数量而降低。
我猜您只需要几个(或几百个)显性奇异值/向量对。然后最好使用迭代方法,该方法将更快并且消耗更少的内存。
在Matlab中,请参阅
帮助svds
您可以尝试快速PCA算法,该算法基于迭代计算一些特征向量的方法。参见A.Sharma和KK Paliwal,“使用定点分析进行快速主成分分析”,“模式识别字母”,第28卷,第1151-1155页,2007年。