我需要将大约50000点的分区划分为不同的群集。有一个要求:每个集群的大小不能超过K.是否有任何集群算法可以完成这项工作?
请注意,每个群集的上限K都相同,比如说100。
答案 0 :(得分:2)
大多数聚类算法可用于创建一个树,其中最低级别只是一个元素 - 或者因为它们通过连接元素对然后加入元素组自然地“自下而上”工作,或者因为 - 像K一样 - 意思是,他们可以用来反复将小组分成小组。
一旦你有了一棵树,你可以决定在哪里拆分子树以形成你的大小的簇<= 100。修剪现有的树通常很容易。假设您要划分现有树以最小化您创建的群集的某些成本的总和。你可能有:
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;
}
答案 1 :(得分:1)
一种方法是使用hierarchical K-means,但是你要继续拆分大于K的每个群集,直到所有群集都变小。
另一种(在某种意义上相反的方法)将是使用hierarchical agglomerative clustering,即自下而上的方法,并再次确保如果他们将形成一个大小&gt;的新的合并群集。 ķ。
答案 2 :(得分:0)
天真聚类的问题在于你确实必须计算一个距离矩阵,它保持A与集合中每个其他成员的距离。这取决于您是否预先处理了人口,或者将群集合并为典型个体,然后再次重新计算距离矩阵。