【问题标题】:How to cluster big data using Python or R without memory error?如何使用 Python 或 R 对大数据进行聚类而不会出现内存错误?
【发布时间】:2020-02-22 07:45:00
【问题描述】:

我正在尝试对包含大约 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-means。如果事先知道集群的数量,K-means 就可以工作。我不知道集群的数量。也就是说,我使用不同数量的集群运行 k-means,但现在我不知道如何证明选择一个到另一个是合理的。有什么可以帮助的测试吗?

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

【问题讨论】:

  • 请添加您的完整错误回溯和与问题相关的代码。

标签: python r bigdata cluster-analysis


【解决方案1】:

由于琐碎的原因,函数dist 需要二次记忆。

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

而 100 万仍然很小,不是吗?

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

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

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

如果您还没有可行的解决方案,那么最后一件事是一个好主意。为不起作用的方法的可扩展性而苦苦挣扎是没有用的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-14
    • 1970-01-01
    • 2020-02-12
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 2011-12-08
    • 2021-05-23
    相关资源
    最近更新 更多