【问题标题】:Principal Component Analysis (PCA) on huge sparse dataset大型稀疏数据集上的主成分分析 (PCA)
【发布时间】:2012-11-05 17:32:18
【问题描述】:

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

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

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

【问题讨论】:

  • 1000x50000x8 = 381MB。由于 MATLAB 需要矩阵的连续内存,这不足为奇。
  • 您的计算机是崩溃还是只是 MATLAB?只是好奇
  • 我的整台电脑,必须按前面的重置按钮。真的很奇怪……
  • 您可以使用 windbg 找出究竟是什么导致计算机崩溃。去谷歌上查询。 :)

标签: matlab machine-learning pca sparse-matrix


【解决方案1】:

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

【讨论】:

  • 其实,如果你在MATLAB中用'sparse matrix'类型来表示数据矩阵,你不需要迭代计算协方差矩阵。只要确保您没有事先减去均值,而是将得到的协方差矩阵居中。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    以下策略有效:

    [~,~,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,你应该没问题。

    【讨论】:

      【解决方案4】:

      您不需要使用princompThis answer 将解释您如何使用 eig 进行操作。将eig 替换为eigs

      【讨论】:

      • 不幸的是,这个答案对我没有帮助......我知道如何找到数据集的主要组成部分,只是庞大的规模让我感到困惑。我不能做像X = bsxfun(@minus, meas, mean(meas)); 这样的事情,因为它会将我的稀疏矩阵变成一个太大而无法放入内存的完整矩阵。
      • 对不起,我应该说:在我的数据集上调用 cov(X) 有同样的问题。
      【解决方案5】:

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

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

      【讨论】:

      • 我知道,并不是协方差矩阵会破坏事物,而是我所知道的任何方法(包括涉及协方差矩阵计算的流行方法,或者只是减去均值并进行 SVD,等...)涉及一个太大而无法放入内存的非稀疏矩阵。不确定您在链接的问题中引用了什么...我正在寻找在 Matlab 中执行此操作的方法或通用数学答案。
      【解决方案6】:

      顶级PC见iterative PCA; 这累积了 50k 的总和。 50k 稀疏,应该可以工作。
      对于第二个,即时减去第一个,即使用 (X - U1 d1 Vt1) 无需实例化它。
      Randomized PCA 在 Python scikit-learn 中做到这一点,Matlab 不知道。)

      【讨论】:

        猜你喜欢
        • 2017-04-09
        • 2022-01-11
        • 1970-01-01
        • 2015-07-29
        • 2015-03-01
        • 1970-01-01
        • 2012-10-24
        • 2013-03-31
        • 2012-11-10
        相关资源
        最近更新 更多