首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对大数据进行SVD和PCA?

如何对大数据进行SVD和PCA?
EN

Data Science用户
提问于 2014-09-25 08:40:59
回答 6查看 32.6K关注 0票数 36

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

有什么工具可以用这么多的数据来做SVD呢?

EN

回答 6

Data Science用户

回答已采纳

发布于 2014-09-26 11:39:07

首先,当数据点旋转成新的正交基,并且只取方差最大的轴时,当你有多个协变量维数,并且希望通过旋转数据点来减小问题大小时,就会使用降维方法。对于8个变量(列),您的空间已经是低维的,进一步减少变量的数量不太可能解决内存大小的技术问题,但可能会对数据集的质量产生很大影响。在您的具体案例中,看一看在线学习方法更有希望。粗略地说,这些方法不是处理整个数据集,而是一次只使用一小部分(通常称为“小批”),并逐步构建模型。(我个人喜欢将"online“一词解释为对来自互联网的某些无限长的数据源的引用,比如Twitter提要,在这里您无法同时加载整个数据集)。

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

太多的观测(n >> m)

当您有太多的观察,但变量的数目是从小到中等,您可以逐步构建协方差矩阵。实际上,典型的主成分分析包括构造一个大小为m×m的协方差矩阵,并对其进行奇异值分解。对于m=1000型float64变量,协方差矩阵的大小为1000×1000×8~8~ 8Mb,易于存储,可与float64相结合。因此,您只需要构建协方差矩阵,而不需要将整个数据集加载到内存中- 相当容易处理的任务

或者,您可以从数据集中选择一个小的有代表性的样本,并近似于协方差矩阵。这个矩阵将有所有相同的性质与正常,只是有点不准确。

太多变量(n << m)

另一方面,有时,当你有太多的变量,协方差矩阵本身将不适合内存。例如,如果您处理640x480图像,每个观察都有640*480=307200变量,这将导致703 in协方差矩阵!这绝对不是你想要保存在你的计算机的内存中,甚至在你的集群内存中。因此,我们需要减少维数,而不需要建立协方差矩阵。

我最喜欢的方法是随机投影。总之,如果你有数据集X的大小为n×m,你可以把它乘以一些大小为m的稀疏随机矩阵R(带有k << m),并得到一个小得多的n×k的新矩阵X‘,其性质与原始矩阵大致相同。为什么会起作用?你应该知道PCA的目标是找出一组正交轴(主成分),并将你的数据投射到它们的第一个k上。结果表明,稀疏随机向量几乎是正交的,因此也可以作为一个新的基。

当然,你不需要把整个数据集x乘以R-你可以把每一个观察x分别地或者小批量地转换成新的基础。

也有一些类似的算法叫做随机SVD。我对它没有任何真正的经验,但是您可以找到带有说明这里的示例代码。

作为底线,这里有一个大数据集降维的简短检查列表:

  1. 如果你没有那么多的维度(变量),只需使用在线学习算法。
  2. 如果有许多观测值,但变量数目适中(协方差矩阵适合记忆),则逐步构造矩阵,并使用正常的SVD。
  3. 如果变量数过高,则使用增量算法。
票数 46
EN

Data Science用户

发布于 2014-09-25 17:33:09

别费神。

编程的第一条规则--这也适用于数据科学:让所有东西都能处理一个小的测试问题。

因此,对你的数据进行随机抽样,比如100,000行。尝试不同的算法等等,一旦您使所有工作都满意,您可以尝试更大(更大)的数据集-看看测试错误如何减少,因为您添加了更多的数据。

此外,您不希望只对8列应用svd :当您有很多列时应用它。

票数 7
EN

Data Science用户

发布于 2014-09-29 00:28:26

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

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

只需对数据进行一次检查,就可以计算平均值。然后第二次通过计算协方差矩阵。这可以通过map轻松地完成--本质上,这与再次计算方法相同。和项,如协方差,是微不足道的并行化!你可能只需要注意的数字,当总结了许多类似的数值。

当你有大量的变量时,情况就不同了。但是在一个8GB的系统上,您应该能够在内存中的20.000维上使用BLAS库运行PCA。但是你可能会遇到这样的问题: PCA不再那么可靠了,因为它有太多的自由度。换句话说,它很容易适应。我看到了至少有10*d*d记录(或者是d^3)的建议。所以对于10000维,你至少应该有10亿条记录( 10000维.太多了!)结果在统计上是可靠的。

票数 7
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/1159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档