以分布式方式融合小于一定大小的集群的最佳方法?

数据挖掘 聚类
2022-03-09 19:34:27

我有 X 个大小为 (n1,n2...,nX) 的集群,我想将少于 T 个成员的小集群与最近的相邻集群(即最近的相邻集群)融合在一起。

问题是当我有两个小的邻居集群 A->B 和 B->A 时,它们会创建一个无限循环。

我试图通过删除具有此属性 [(A,B),(B,A)] 的其中一个来避免这种情况。

但是有没有更好的方法来按顺序完成这项任务?

是否有可能以分布式方式(Spark)做到这一点?

2个回答

我的建议只是一种贪婪的蛮力方法。我确信可能存在更有效的解决方案,但这可能是您最终解决方案的第一步。

将每个大小小于 T 的集群存储在一张表中,与它最近的相邻集群的距离以及该最近集群的 ID。

现在,按距离升序对表格条目进行排序。将第一个条目中的集群与其最近的相邻条目合并。如果最近的簇在表中也有一个条目,并且它的大小大于 T,则删除其对应的条目。最后,更新表的所有条目,并再次按距离升序对它们进行排序。

重复上述步骤,直到表格中没有更多条目。

我并没有真正看到无限循环的问题。似乎您正在遍历您的集群并找到所有需要合并的集群,然后在一个单独的循环中进行合并,并且当两个集群被标记为它们都需要合并到另一个。相反,您可以将其视为更多的队列。

然后你可以循环一次,将小集群与它们的邻居合并,然后销毁它们。

想象一下,您有一个cluster具有以下属性的类:membercount、、members和最近邻,以及方法addMembers()destroy()

然后你可以做类似的事情:

for (cluster in clusterList):
    if cluster.membercount<T:
        cluster.nearestNeighbor.addMembers(cluster.members)
        cluster.destroy()

这只会在 clusterList 中循环一次,并且会立即合并和销毁小于 T 的集群。

假设您有面向对象编程的经验,这将很容易实现。即使您在阵列中执行此操作,您也可以pop在将它们与其他集群合并后进行集群。

希望这可以帮助!