我有大约1000个维度50000的向量x_i,但它们非常稀疏;每个只有大约50-100个非零元素。我想在这个数据集(在MATLAB中)上做PCA,以减少不必要的数据极限维度。
不幸的是,由于需要从所有示例中减去均值,我不知道在没有中间完整矩阵的情况下如何做到这一点。当然,1000x50000矩阵太大而无法放入内存(当我尝试时,它实际上因某些原因而崩溃了我的整台计算机)。当我尝试使用它时,内置princomp
的Matlab会崩溃我的计算机。
所以我的问题是:有没有办法对这些数据进行PCA而不需要大量的非稀疏矩阵作为中间步骤?
答案 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)
您无需使用princomp
。 This 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。)