如何使用Python或R对大数据进行群集而不会出现内存错误?

问题描述 投票:-1回答:1

我正在尝试将一个包含约1,100,000个观测值的数据集聚类,每个观测值具有三个值。

R中的代码非常简单:

df11.dist <-dist(df11cl),其中df11cl是具有三列和1,100,000行的数据帧,并且该数据帧中的所有值均已标准化。

我得到的错误是:Error: cannot allocate vector of size 4439.0 Gb

关于类似问题的建议包括增加RAM或分块数据。我已经有64GB的RAM,我的虚拟内存为171GB,所以我认为增加RAM不是可行的解决方案。而且,据我所知,分层数据分析中的分块数据会产生不同的结果。因此,似乎毫无疑问使用数据样本。

我也发现了this solution,但是答案实际上改变了问题。他们从技术上建议k-均值。如果事先知道簇数,则K均值可以工作。我不知道集群的数量。就是说,我使用不同数量的群集运行k均值,但是现在我不知道如何证明选择一个群集的合理性。有什么测试可以帮助您吗?

您能推荐Rpython中的任何内容吗?

python r bigdata cluster-analysis
1个回答
0
投票

出于琐碎的原因,函数dist 需要二次存储。

因此,如果您有100万(10 ^ 6)点,则二次矩阵需要10 ^ 12项。以双精度,每个条目需要8个字节。具有对称性,您只需要存储一半的条目,仍然是4 * 10 ^ 12 bytea。,即4 TB仅用于存储此矩阵。即使您将其存储在SSD上或将系统升级到4 TB RAM,计算所有这些距离也将花费大量的时间。

还有100万还很小,不是吗?

在大数据上使用dist是不可能的。故事的结尾。

对于更大的数据集,您需要

  • 使用不使用成对距离的方法,例如k均值
  • 使用不需要距离矩阵的DBSCAN这样的方法,并且在某些情况下使用索引可以将工作量减少到O(n log n)
  • subsample您的数据以使其更小

特别是如果您还没有可行的解决方案,那么最后一件事是个好主意。努力解决不可行的方法的可伸缩性没有用。

© www.soinside.com 2019 - 2024. All rights reserved.