其他分享
首页 > 其他分享> > 在C中处理非常大的距离矩阵(如果可能有帮助,则处理C)

在C中处理非常大的距离矩阵(如果可能有帮助,则处理C)

作者:互联网

我在我的软件中用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字节.因此,内存分配失败(即使在我们的计算节点上有256 GB的RAM),在这种情况下写入磁盘不是一个选项.

除了将数据集的大小(我将看到)缩小到群集之外,任何人都知道我可以用来近似和存储这些信息量的技术吗?

注:就像我在标题中所说的那样,我使用的是C,我也可以使用C.此外,如果有人使用另一个聚类算法(使用算法本身确定聚类数),请向我建议.

在此先感谢您的时间,

解决方法:

您可能需要退后一步并重新考虑您的算法.

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

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

然后创建包含点组之间的数据箱,这些点之间的距离相互较小.例如,如果您以“平均”保留平均值的方式确定“短”距离,例如,50个数据点,您将得到1500000/50 = 30000个箱.

然后再次检查数据并计算箱之间的距离.这将产生30000 ^ 2距离,这是一个约4GB的矩阵.此外,你仍然有30000在箱内有50 ^ 2的距离,这是另外300MB.这一数据量非常易于管理.

如果用相应区间之间的距离替换数据点之间的距离,则对于您的应用程序来说是足够精确的.这完全取决于您正在处理的数据类型以及应用程序的精度要求.

标签:c-3,large-data,c,cluster-analysis
来源: https://codeday.me/bug/20190727/1558535.html