我有大量数据(大约8GB)。我想使用机器学习对其进行分析。因此,我认为我应该先使用SVD再使用PCA来降低数据维数以提高效率。但是,MATLAB和Octave无法加载如此大的数据集。
我可以使用哪些工具对大量数据执行SVD?
我有大量数据(大约8GB)。我想使用机器学习对其进行分析。因此,我认为我应该先使用SVD再使用PCA来降低数据维数以提高效率。但是,MATLAB和Octave无法加载如此大的数据集。
我可以使用哪些工具对大量数据执行SVD?
Answers:
首先,降维,当你有使用许多covariated尺寸,并希望通过旋转数据点到新的正交基础上,以减少问题的大小只与方差最大的轴。有了8个变量(列),您的空间已经是低维的,进一步减少变量的数量不太可能解决内存大小的技术问题,但可能会严重影响数据集的质量。在您的具体情况下,看一下在线学习会更有希望方法。粗略地说,这些方法不是一次处理整个数据集,而是一次只使用其中的一小部分(通常称为“迷你批处理”),并逐步建立模型。(我个人喜欢将“在线”一词解释为对Internet上一些无限长的数据源(例如Twitter提要)的引用,在这里您无法立即加载整个数据集。
但是,如果您真的想将像PCA这样的降维技术应用于不适合内存的数据集,该怎么办?通常,数据集表示为大小为n x m的数据矩阵X,其中n是观察数(行),m是变量数(列)。通常,内存问题仅来自这两个数字之一。
如果观测值太多,但是变量的数量从小到中等,则可以逐步构建协方差矩阵。实际上,典型的PCA包括构造大小为m x m的协方差矩阵,并对它进行奇异值分解。当m = 1000个float64类型的变量时,协方差矩阵的大小为1000 * 1000 * 8〜8Mb,很容易装入内存,可以与SVD一起使用。因此,您只需要构建协方差矩阵,而无需将整个数据集加载到内存相当容易处理的任务中。
或者,您可以从数据集中选择一个小的代表性样本,并近似估算协方差矩阵。该矩阵将具有与普通矩阵相同的所有属性,但精度略有下降。
另一方面,有时,当您有太多变量时,协方差矩阵本身将不适合内存。例如,如果您使用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。我没有任何实际经验,但是您可以在此处找到带有说明的示例代码。
最重要的是,这是减少大型数据集的维数的简短检查清单:
不要打扰
编程的第一条规则-也适用于数据科学:使所有问题都在一个小的测试问题上进行。
因此,请随机抽取100,000行数据。尝试不同的算法等。使所有事情都令人满意之后,您可以尝试更大(和更大)的数据集-并查看随着添加更多数据而导致的测试错误如何减少。
此外,您不希望仅将svd应用于8列:在具有很多列的情况下可以应用svd。
PCA通常是通过在协方差矩阵上计算SVD来实现的。
计算协方差矩阵是一个令人尴尬的并行任务,因此它与记录数成线性比例关系,并且在多个计算机上分布很简单!
只需对数据进行一次传递即可计算均值。然后第二遍计算协方差矩阵。这可以通过map-reduce轻松实现-本质上与再次计算均值相同。协方差中的求和项对于并行化是微不足道的!在对许多相似大小的值求和时,您可能只需要注意数字。
当您拥有大量变量时,事情会变得不同。但是在8 GB的系统上,您应该能够使用BLAS库在内存中最大20.000维上运行PCA。但是随后您可能会遇到PCA不再那么可靠的问题,因为它具有太多的自由度。换句话说:它很容易过拟合。我已经看到建议至少有10 * d * d条记录(或者是d ^ 3)。因此,对于10000个维度,您应该至少有十亿条记录(10000个维度……非常多!),以使结果在统计上可靠。
我们使用PySpark将SVD实施为更大的数据集。我们还比较了不同软件包之间的一致性。这是链接。