在 C 中处理非常大的距离矩阵(或 C++,如果有帮助的话)

Posted

技术标签:

【中文标题】在 C 中处理非常大的距离矩阵(或 C++,如果有帮助的话)【英文标题】:Handle very large distance matrix in C (or C++ if it could help) 【发布时间】:2015-08-11 09:08:24 【问题描述】:

我在我的软件中用 C 语言实现这个聚类算法http://www.sciencemag.org/content/344/6191/1492.full (free access version),我需要构建一个距离矩阵,但在某些情况下,数据集的大小(去除冗余后)很大(n > 1 500 000 甚至更大,在更复杂的情况下高达 4 000 000)。我的问题是,即使分配上三角矩阵也是( (1500000*1500000) - 1500000) * 0.5 * sizeof(float) =~ 5.5e12 Bytes。因此,内存分配失败(即使在我们具有 256 GB RAM 的计算节点上)并且在这种情况下写入磁盘不是一种选择。

除了减少要聚类的数据集的大小(我将查看)之外,是否有人知道我可以使用一种技术来近似和存储这些信息量?

注意就像我在标题中所说的,我使用的是 C,我也可以使用 C++。另外,如果有人要使用另一种聚类算法(其中聚类的数量由算法本身确定),请向我提出建议。

提前感谢您的宝贵时间,

【问题讨论】:

是稀疏矩阵吗?如果是这样,则可能有机会……否则,请使用另一种不依赖存储值的算法。 您的链接需要登录。 @davidhigh 冗余删除(如果按预期工作)不应让上三角矩阵中的任何 0 值。截至目前,我有大约 0.25% 的值为 0。所以,不,它并不稀疏。 链接几乎没有相关性。算法实现和细节是available for free,他们只是把OP引用的距离矩阵作为输入。 @WeatherVane 是的,很抱歉该论文的链接不是开放访问,但 Xīcò 提供了一个更好的链接。这篇论文与解决我的问题无关。 【参考方案1】:

你可能不得不退后一步,重新考虑你的算法。

首先,也许您不需要所有数据点对之间的距离矩阵。也许您可以将相似的数据点组合到数据箱中,然后创建箱之间的距离矩阵。

也就是说,首先计算点之间的成对距离,但只保留相对较小的距离和指向“另一个”点的指针。一种非常稀疏的较短距离矩阵。这很容易并行执行。

然后创建包含点组的数据箱,这些点组之间的距离很小。例如,如果您以这样一种方式对“短”距离进行阈值处理,即平均可以容纳 50 个数据点,您将获得 1500000/50=30000 个箱。

然后再次检查您的数据并计算箱之间的距离。这将产生 30000^2 距离,这是一个大约 4GB 的矩阵。此外,您还有 30000 个 50^2 距离的垃圾箱,这又是 300MB。这个数据量是很容易管理的。

如果将数据点之间的距离替换为相应 bin 之间的距离对于您的应用程序来说是足够的精度,则可以正常工作。这完全取决于您处理的数据类型和应用程序的精度要求。

【讨论】:

我知道我不应该再说“加一”或“减一”,但我会说出来。对于这个答案,仅仅第一句话就足以让“加一个”。

以上是关于在 C 中处理非常大的距离矩阵(或 C++,如果有帮助的话)的主要内容,如果未能解决你的问题,请参考以下文章

C++ 处理非常大的整数

用于操作非常大的矩阵的 Python 库

在R中聚类非常大的数据集

在 C++ 中输出非常大的数字

有啥技巧可以在 C++ 中处理非常大的输入吗?

如何分割成块(子矩阵),或处理一个巨大的矩阵,在 numpy 上产生内存错误?