【发布时间】:2011-09-20 20:58:29
【问题描述】:
我需要将大约 50000 个点划分为不同的集群。有一个要求:每个簇的大小不能超过K。有没有什么聚类算法可以做这个工作?
请注意,每个集群的上限 K 是相同的,例如 100。
【问题讨论】:
标签: c++ algorithm machine-learning cluster-analysis
我需要将大约 50000 个点划分为不同的集群。有一个要求:每个簇的大小不能超过K。有没有什么聚类算法可以做这个工作?
请注意,每个集群的上限 K 是相同的,例如 100。
【问题讨论】:
标签: c++ algorithm machine-learning cluster-analysis
一种方法是使用hierarchical K-means,但你不断拆分大于K的每个集群,直到它们都更小。
另一种(在某种意义上相反的方法)是使用hierarchical agglomerative clustering,即自下而上的方法,并再次确保您不会合并集群,如果它们会形成一个大小 > K 的新集群。
【讨论】:
大多数聚类算法可用于创建一棵树,其中最低级别只是单个元素 - 要么因为它们自然地通过连接元素对然后连接元素组来“自下而上”地工作,或者因为 - 像 K -意思是,它们可用于重复地将组分成更小的组。
一旦你有了一棵树,你就可以决定在哪里分割子树以形成大小
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;
}
【讨论】:
朴素聚类的问题在于,您确实必须计算一个距离矩阵,该矩阵包含 A 与集合中每个其他成员的距离。这取决于您是对总体进行了预处理,还是将集群合并为典型个体,然后再次重新计算距离矩阵。
【讨论】: