【问题标题】:How to fit a huge distance matrix into a memory?如何将巨大的距离矩阵放入内存中?
【发布时间】:2019-11-06 01:36:27
【问题描述】:

我有一个大小约为 590000 * 590000 的巨大距离矩阵(每个元素的数据类型为 float16)。它是否适合用于聚类算法的内存?如果没有,谁能给出在聚类 DBSCAN 算法中使用它的想法?

【问题讨论】:

  • 你为什么“拥有”这个矩阵,但不知道它的大小以及它是否适合内存?

标签: python-3.x memory-management dbscan


【解决方案1】:

590000 * 590000 * 2 字节 (float16 大小) = 696.2 GB 内存

它不适合标准计算机的内存。此外,float16 被转换为 float32 以执行计算(请参阅Python numpy float16 datatype operations, and float8?),因此它可能使用超过 700GB 的 RAM。

为什么你有一个方阵?你不能使用 condensed matrix 吗?它将使用方阵所需内存的一半。

【讨论】:

    【解决方案2】:

    集群(创建块)以减少 DBSCAN 的问题大小可以例如通过具有重叠区域的区域来完成。

    重叠区域的大小必须适合您的问题。

    为您的问题块和重叠区域找到一个合理的大小。

    然后通过迭代和比较在重叠区域中找到的集群来手动拼接结果。

    您必须检查一个簇中的元素是否也存在于其他块中。

    您可能需要应用一些拼接参数,例如如果一些元素在两个不同的块中的簇中,则它们是同一个簇。

    我刚刚看到this

    问题显然是一个非标准的 DBSCAN 实现 scikit-学习。 DBSCAN 不需要距离矩阵。

    但这可能是几年前的fixed

    您使用的是哪种实现方式?

    【讨论】:

    • 但是如果我这样做,dbscan 中的核心点的概念将会丢失。例如,如果我在块 1 中有一个非核心点。当你考虑整个数据集时,如果它是一个核心点怎么办。
    • 您可以并且可能必须优化这种方法,例如通过进行第二次迭代,将块集中在找到的集群上。您可以动态增长一个块,直到在增加大小时不再添加新点。
    【解决方案3】:

    DBSCAN 只需要每个点的邻居。

    因此,如果您知道适当的参数(我对此表示怀疑),您可以一次读取一行巨大的矩阵,并在您的距离阈值内构建一个邻居列表。假设只有不到 1% 是邻居(在如此庞大的数据上,您可能希望更低),这会将内存需求减少 100 倍。

    但通常你想完全避免计算这样的矩阵

    【讨论】:

      猜你喜欢
      • 2022-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-07
      • 1970-01-01
      • 2016-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多