巨大稀疏数据集上的主成分分析(PCA)

时间:2012-11-16 23:32:19

标签: matlab machine-learning pca sparse-matrix

我有大约1000个维度50000的向量x_i,但它们非常稀疏;每个只有大约50-100个非零元素。我想在这个数据集(在MATLAB中)上做PCA,以减少不必要的数据极限维度。

不幸的是,由于需要从所有示例中减去均值,我不知道在没有中间完整矩阵的情况下如何做到这一点。当然,1000x50000矩阵太大而无法放入内存(当我尝试时,它实际上因某些原因而崩溃了我的整台计算机)。当我尝试使用它时,内置princomp的Matlab会崩溃我的计算机。

所以我的问题是:有没有办法对这些数据进行PCA而不需要大量的非稀疏矩阵作为中间步骤?

6 个答案:

答案 0 :(得分:6)

您不需要形成完整的数据矩阵来减去平均值,也不需要计算协方差矩阵。只需迭代计算1000x1000协方差矩阵(循环数据向量)。一旦形成了协方差矩阵,就可以隐式通过居中协方差矩阵减去均值。请参阅this paper on kernel PCA末尾的部分,了解如何使内核矩阵居中。只考虑核矩阵与协方差矩阵基本相同。

答案 1 :(得分:1)

要计算所述数据集的PCA,算法只需要在1000x1000协方差矩阵上运行。对于大多数PCA实现,这应该不是什么大问题,我想。 如果您使用的是Windows 7计算机,则可以尝试使用64位PCA实现。我不确定Matlab是否支持64位PCA,但像VisuMap这样的应用程序可以轻松处理这些情况。

答案 2 :(得分:1)

以下策略有效:

[~,~,PC] = svds(X,k);
mu = mean(X);
S = sparse(size(X,1),k);
for i=1:size(X,1)
    S(i,:) = (X(i,:)-mu)*PC;
end

X的右奇异向量是cov(X,1)的特征向量,因此是X的主要成分。通过实例计算主成分得分而不是一次计算所有得分,可以避免从稀疏转换为完全的内存溢出。请确保k<<p,你应该没事。

答案 3 :(得分:0)

您无需使用princompThis answer将解释您如何使用eig执行此操作。将eig替换为eigs

答案 4 :(得分:0)

首先,您不需要协方差矩阵来减去均值。

然后计算个人电脑,请参阅此question的答案。

答案 5 :(得分:0)

对于顶级PC,请参阅iterative PCA; 这累积了50k密度的总和。 50k稀疏,应该工作。
对于第二个,在运行中减去第一个,即使用(X - U1 d1 Vt1) 没有实例化。
Randomized PCA在Python中学习scikit-learn,Matlab dunno。)