如何在没有内存错误的情况下使用 Python 或 R 对大数据进行聚类?
How to cluster big data using Python or R without memory error?
我正在尝试对包含大约 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 使用不同数量的集群,但现在我不知道如何证明选择一个集群到另一个集群是合理的。有什么测试可以帮助吗?
你能推荐 R
或 python
中的任何内容吗?
由于琐碎的原因,函数 dist
需要 二次内存。
因此,如果您有 100 万 (10^6) 个点,则二次矩阵需要 10^12 个条目。使用双精度,每个条目需要 8 个字节。使用对称性,您只需要存储一半的条目,仍然是 4*10^12 bytea。,即4 TB 只是为了存储这个矩阵。即使您将其存储在 SSD 上或将系统升级到 4 TB RAM,计算所有这些距离也会花费大量时间。
而且100万还是很小的吧?
在大数据上使用dist
是不可能的。故事结束。
对于更大的数据集,您需要
- 使用不使用成对距离的方法,例如 k-means
- 使用 DBSCAN 等不需要距离矩阵的方法,在某些情况下索引可以将工作量减少到 O(n log n)
- 子样本你的数据以使其更小
特别是如果您还没有可行的解决方案,那么最后一件事是个好主意。为一种不起作用的方法的可扩展性而苦苦挣扎是没有用的。
我正在尝试对包含大约 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 使用不同数量的集群,但现在我不知道如何证明选择一个集群到另一个集群是合理的。有什么测试可以帮助吗?
你能推荐 R
或 python
中的任何内容吗?
由于琐碎的原因,函数 dist
需要 二次内存。
因此,如果您有 100 万 (10^6) 个点,则二次矩阵需要 10^12 个条目。使用双精度,每个条目需要 8 个字节。使用对称性,您只需要存储一半的条目,仍然是 4*10^12 bytea。,即4 TB 只是为了存储这个矩阵。即使您将其存储在 SSD 上或将系统升级到 4 TB RAM,计算所有这些距离也会花费大量时间。
而且100万还是很小的吧?
在大数据上使用dist
是不可能的。故事结束。
对于更大的数据集,您需要
- 使用不使用成对距离的方法,例如 k-means
- 使用 DBSCAN 等不需要距离矩阵的方法,在某些情况下索引可以将工作量减少到 O(n log n)
- 子样本你的数据以使其更小
特别是如果您还没有可行的解决方案,那么最后一件事是个好主意。为一种不起作用的方法的可扩展性而苦苦挣扎是没有用的。