SVD和PCA如何处理大数据?


29

我有大量数据(大约8GB)。我想使用机器学习对其进行分析。因此,我认为我应该先使用SVD再使用PCA来降低数据维数以提高效率。但是,MATLAB和Octave无法加载如此大的数据集。

我可以使用哪些工具对大量数据执行SVD?


嗨,欢迎来到DS!也许您可以详细说明一下数据集。您有几行和几列?这可能会影响可能的解决方案。
S. Kolassa-恢复莫妮卡2014年

23711341行和8列。我可以尝试删除1-2列。它们似乎与我的问题无关。
David S.

您应该在此处在列之前对行进行采样。您是否有原因不能随机采样行以减小数据大小?我假设这里的行与用户有关或某物有关
cwharland

对不起,如果我没有明确表示自己。我的目标是做PCA。我认为样本数据上的SVD不能帮我做PCA,对吗?
David S.

PCA通常是通过在协方差矩阵上计算SVD来实现的。计算协方差矩阵是一个令人尴尬的并行任务,因此它应随记录数量轻松扩展。
Anony-Mousse 2014年

Answers:


41

首先,降维,当你有使用许多covariated尺寸,并希望通过旋转数据点到新的正交基础上,以减少问题的大小只与方差最大的轴。有了8个变量(列),您的空间已经是低维的,进一步减少变量的数量不太可能解决内存大小的技术问题,但可能会严重影响数据集的质量。在您的具体情况下,看一下在线学习会更有希望方法。粗略地说,这些方法不是一次处理整个数据集,而是一次只使用其中的一小部分(通常称为“迷你批处理”),并逐步建立模型。(我个人喜欢将“在线”一词解释为对Internet上一些无限长的数据源(例如Twitter提要)的引用,在这里您无法立即加载整个数据集。

但是,如果您真的想将像PCA这样的降维技术应用于不适合内存的数据集,该怎么办?通常,数据集表示为大小为n x m的数据矩阵X,其中n是观察数(行),m是变量数(列)。通常,内存问题仅来自这两个数字之一。

观察值过多(n >> m)

如果观测值太多,但是变量的数量从小到中等,则可以逐步构建协方差矩阵。实际上,典型的PCA包括构造大小为m x m的协方差矩阵,并对它进行奇异值分解。当m = 1000个float64类型的变量时,协方差矩阵的大小为1000 * 1000 * 8〜8Mb,很容易装入内存,可以与SVD一起使用。因此,您只需要构建协方差矩阵,而无需将整个数据集加载到内存相当容易处理的任务中

或者,您可以从数据集中选择一个小的代表性样本,并近似估算协方差矩阵。该矩阵将具有与普通矩阵相同的所有属性,但精度略有下降。

变量太多(n << m)

另一方面,有时,当您有太多变量时,协方差矩阵本身将不适合内存。例如,如果您使用640x480图像,则每个观测值都有640 * 480 = 307200变量,这将产生703Gb协方差矩阵!绝对不是您想要保留在计算机内存中,甚至不希望保留在群集内存中的内容。因此,我们需要减少维数而根本不建立协方差矩阵。

我最喜欢的方法是随机投影。简而言之,如果您的数据集X的大小为n x m,则可以将其乘以某个大小为m x k的稀疏随机矩阵R(其中k << m),并获得大小为n x k小的新矩阵X'具有与原始属性几乎相同的属性。为什么行得通?好吧,您应该知道PCA旨在找到一组正交轴(主分量)并将数据投影到第一个k其中。事实证明,稀疏随机矢量几乎是正交的,因此也可以用作新的基础。

而且,当然,您不必将整个数据集X乘以R-您可以将每个观察值x分别转换为新的基数,也可以按小批转换。

还有一种类似的算法,称为Random SVD。我没有任何实际经验,但是您可以在此处找到带有说明的示例代码。


最重要的是,这是减少大型数据集的维数的简短检查清单:

  1. 如果您没有那么多的维度(变量),只需使用在线学习算法。
  2. 如果有很多观察结果,但是变量数量适中(协方差矩阵适合内存),请逐步构造矩阵并使用常规SVD。
  3. 如果变量数量太大,请使用增量算法。

3
总体而言,我喜欢您的回答,但开头的句子不太正确。PCA不适用于方差低的许多尺寸;相反,它适用于具有相关方差的许多维度。对于给定的数据集,方差可能在所有维度上很高,但是只要存在高协方差,PCA仍可以显着降低维度。
bogatron 2014年

1
@bogatron:很好,谢谢。实际上,我指的是某些方面的高/低方差,可能不是原始的。例如,在此图片中,这些尺寸是由2个箭头(而不是原始的x / y轴)定义的。PCA试图找到这些新轴,并按照沿每个轴的方差值对它们进行排序。无论如何,正如您所指出的那样,这是一个不好的措辞,所以我试图重新提出自己的想法。希望现在更清楚了。
ffriend

这对我来说很有意义。+1。
bogatron 2014年

7

不要打扰

编程的第一条规则-也适用于数据科学:使所有问题都在一个小的测试问题上进行。

因此,请随机抽取100,000行数据。尝试不同的算法等。使所有事情都令人满意之后,您可以尝试更大(和更大)的数据集-并查看随着添加更多数据而导致的测试错误如何减少。

此外,您不希望仅将svd应用于8列:在具有很多列的情况下可以应用svd。


1
+1表示您不希望将svd仅应用于8列:当有很多列时,请应用svd。
S. Kolassa-恢复莫妮卡2014年

6

PCA通常是通过在协方差矩阵上计算SVD来实现的。

计算协方差矩阵是一个令人尴尬的并行任务,因此它与记录数成线性比例关系,并且在多个计算机上分布很简单!

只需对数据进行一次传递即可计算均值。然后第二遍计算协方差矩阵。这可以通过map-reduce轻松实现-本质上与再次计算均值相同。协方差中的求和项对于并行化是微不足道的!在对许多相似大小的值求和时,您可能只需要注意数字。

当您拥有大量变量时,事情会变得不同。但是在8 GB的系统上,您应该能够使用BLAS库在内存中最大20.000维上运行PCA。但是随后您可能会遇到PCA不再那么可靠的问题,因为它具有太多的自由度。换句话说:它很容易过拟合。我已经看到建议至少有10 * d * d条记录(或者是d ^ 3)。因此,对于10000个维度,您应该至少有十亿条记录(10000个维度……非常多!),以使结果在统计上可靠。


1

尽管您可能会找到一些可以在一台机器上完成操作的工具,但是您正在进入考虑使用Spark等“大数据”工具的范围,尤其是当您认为数据集可能会增长时。Spark有一个名为MLlib的组件,该组件支持PCA和SVD。该文档包含示例


1

我们使用PySpark将SVD实施为更大的数据集。我们还比较了不同软件包之间的一致性。这是链接。


0

如果您懒惰地评估文件,则我建议使用python,这样您的内存占用将很小,而numpy / scipy则使您可以使用Octave / Matlab的所有工具。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.