具有每个聚类大小的上限要求的聚类算法

Clustering algorithm with upper bound requirement for each cluster size

本文关键字:聚类 算法      更新时间:2023-10-16

我需要将大约50000个点划分为不同的簇。有一个要求:每个集群的大小不能超过K。有什么集群算法可以完成这项工作吗?

请注意,每个簇的上界K是相同的,比如说100。

大多数聚类算法都可以用来创建一个树,其中最低级别只有一个元素-要么是因为它们通过连接成对的元素,然后连接成组的元素来自然地"自下而上"工作,要么是因为像K-Means一样,它们可以用来重复地将组拆分成更小的组。

一旦你有了一棵树,你就可以决定在哪里拆分子树,形成大小<=修剪现有的树通常很容易。假设您想划分一个现有的树,以最小化您创建的集群的一些成本之和。你可能有:

f(tree-node, list_of_clusters)
{
  cost = infinity;
  if (size of tree below tree-node <= 100)
  {
    cost = cost_function(stuff below tree-node);
  }
  temp_list = new List();
  cost_children = 0;
  for (children of tree_node)
  {
    cost_children += f(child, temp_list);
  }
  if (cost_children < cost)
  {
    list_of_clusters.add_all(temp_list);
    return cost_children;
  }
  list_of_clusters.add(tree_node);
  return cost;
}

一种方法是使用分层K-means,但您可以不断拆分每个大于K的集群,直到所有集群都变小。

另一种(在某种意义上相反的方法)是使用分层聚集聚类,即自下而上的方法,如果它们将形成一个大小>K的新聚类,则再次确保不会合并聚类。

天真聚类的问题是,您确实必须计算一个距离矩阵,该矩阵保持a与集合中其他成员的距离。这取决于你是对种群进行了预处理,还是将集群合并为典型的个体,然后再次重新计算距离矩阵。