处理非常大的距离矩阵在C(或c++,如果它可以帮助)

Handle very large distance matrix in C (or C++ if it could help)

本文关键字:如果 c++ 帮助 非常 距离 处理      更新时间:2023-10-16

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

除了减少数据集的大小(我将看到)群集,有人知道我可以使用一种技术来近似和存储这些信息量吗?

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

提前感谢您的时间,

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

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

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

然后创建包含点组的数据箱,它们之间的距离较小。例如,如果你设定"短"距离的阈值,那么箱子平均可以容纳50个数据点,你就会得到1500000/50=30000个箱子。

然后再次遍历数据并计算箱子之间的距离。这将产生30000^2个距离,这是一个大约4GB的矩阵。除此之外,你还有30000在箱子里有50^2的距离,也就是另外300MB。这个数据量是很容易管理的。

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

相关文章: