11

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

不幸的是,由于需要从所有示例中减去均值,因此我不知道没有中间完整矩阵的任何方法。当然,1000x50000 矩阵太大而无法放入内存(当我尝试时,它实际上会因某种原因使我的整个计算机崩溃)。princomp当我尝试使用Matlab 的内置程序时,它也会使我的计算机崩溃。

所以我的问题是:有没有一种方法可以在不需要大量非稀疏矩阵作为中间步骤的情况下对这些数据进行 PCA?

4

6 回答 6

6

您不需要形成完整的数据矩阵来减去平均值,或者计算协方差矩阵。只需迭代计算 1000x1000 协方差矩阵(循环遍历数据向量)。形成协方差矩阵后,您可以通过使协方差矩阵居中来隐式减去均值。请参阅本文末尾关于内核 PCA的部分,解释如何使内核矩阵居中。只需考虑内核矩阵与协方差矩阵基本相同。

于 2012-11-19T18:12:58.860 回答
1

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

于 2012-11-20T04:31:07.403 回答
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,你应该没问题。

于 2014-11-21T02:32:45.333 回答
0

你不需要使用princomp. 该答案将解释您如何使用eig. 替换eigeigs

于 2012-11-16T23:44:54.477 回答
0

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

然后要计算 PC,请参阅此问题的答案。

于 2012-11-17T03:13:51.717 回答
0

对于顶级 PC,请参阅迭代 PCA;这累积了 50k 的总和。50k稀疏,应该工作。
对于第二个,即时减去第一个,即使用 (X - U1 d1 Vt1) 而不实例化它。
随机 PCA在 Python scikit-learn 中做到这一点,Matlab 不知道。)

于 2012-11-19T11:12:35.713 回答