具有最小大小约束的聚类算法
Algorithm for clustering with minimum size constraints
我有一组数据聚类成k组,每个聚类的最小大小限制为m
我对数据进行了一些重新聚类。所以现在我得到了这组点,每个点都有一个或多个更好的集群,但不能单独切换,因为它会违反大小限制。
目标:最小化每个点到其聚类中心的距离之和。
服从:最小簇大小m
我想找到一种算法来重新分配所有点而不违反约束,同时保证减少 objective。
我想到了使用 Graph 来表示点之间的成对关系。但是我不确定如何进行重新分配,因为它存在大密集循环的可能性,而且我在多个集群之间交换多个点时迷路了。
我还创建了一个包含可能交换候选的集群对列表,但仍然找不到优化 objective 的方法。
我希望我解释了我的情况。我是算法新手,不熟悉行话和规则。如果需要任何其他信息,请告诉我。
我做了很多研究,
我尝试了本文中的算法,但没有成功,因为隶属度之和不一定与簇大小相关。
Clustering with Size Constraints
我也阅读了关于 SO 的其他类似帖子,但没有找到我可以实现的详细算法。
我试图构建一个加权有向图,顶点代表集群,A到B的边代表集群A中愿意迁移到集群B的点。权重是点的总和
但是根据我的数据,所有节点都处于一个边缘非常密集的巨大循环中。由于我的经验有限,我仍然想不出如何在这么多集群中重新分配。任何建议表示赞赏!
类似这样。
要获得最小(不幸的是不是最小)解决方案:
- 首先,贪婪地重新聚类任何你可以不违反的点
最小尺寸限制。
- 接下来,构建一个有向多重图如下:
- 每个集群成为一个节点。
- 为 A 中靠近 B 中心的每个点 添加边 (A,B) (因此同一对节点);它的重量应该与移动它获得的收益成正比。
- Looking for cycles in this graph 将允许您找到动作
(移动包括移动循环中的每个顶点)。
- 选择总权重最大的循环,重新聚类边对应的节点。
- 重复步骤 1-4 直到没有更多的循环。
创建图形的复杂度为O(kn),其中总共有k 和n 个点,并且可以创建相同数量的多边。 Tarjan 的算法将具有 O(k2) 的复杂性,假设您跳过多边到 DFS 中的相同目的地。每消去一个圈,全局距离就会减少一定量,并从图中至少去除一条边,所以算法的总时间不能超过 O(k4m2)。那太奢侈了;我确定可以通过启发式方法(可能还有更详细的分析)来改进下限。
本文解决了这个问题:
Bradley, P. S.、K. P. Bennett 和 Ayhan Demiriz。 "Constrained k-means clustering." 微软研究院,雷德蒙德 (2000): 1-8.
We propose explicitly adding $k$ constraints to the underlying clustering optimization problem requiring that cluster $h$ contain at least $\tau_h$ points.
我在python中有一个implementation的算法。
试试这个:pip install k-means-constrained
然后
from k_means_constrained import KMeansConstrained
KMeansConstrained(n_clusters=8, size_min=None, size_max=None, init='k-means++', n_init=10, max_iter=300, tol=0.0001, verbose=False, random_state=None, copy_x=True, n_jobs=1)
来源:
我有一组数据聚类成k组,每个聚类的最小大小限制为m
我对数据进行了一些重新聚类。所以现在我得到了这组点,每个点都有一个或多个更好的集群,但不能单独切换,因为它会违反大小限制。
目标:最小化每个点到其聚类中心的距离之和。
服从:最小簇大小m
我想找到一种算法来重新分配所有点而不违反约束,同时保证减少 objective。
我想到了使用 Graph 来表示点之间的成对关系。但是我不确定如何进行重新分配,因为它存在大密集循环的可能性,而且我在多个集群之间交换多个点时迷路了。
我还创建了一个包含可能交换候选的集群对列表,但仍然找不到优化 objective 的方法。
我希望我解释了我的情况。我是算法新手,不熟悉行话和规则。如果需要任何其他信息,请告诉我。
我做了很多研究, 我尝试了本文中的算法,但没有成功,因为隶属度之和不一定与簇大小相关。 Clustering with Size Constraints
我也阅读了关于 SO 的其他类似帖子,但没有找到我可以实现的详细算法。
我试图构建一个加权有向图,顶点代表集群,A到B的边代表集群A中愿意迁移到集群B的点。权重是点的总和
但是根据我的数据,所有节点都处于一个边缘非常密集的巨大循环中。由于我的经验有限,我仍然想不出如何在这么多集群中重新分配。任何建议表示赞赏!
类似这样。
要获得最小(不幸的是不是最小)解决方案:
- 首先,贪婪地重新聚类任何你可以不违反的点 最小尺寸限制。
- 接下来,构建一个有向多重图如下:
- 每个集群成为一个节点。
- 为 A 中靠近 B 中心的每个点 添加边 (A,B) (因此同一对节点);它的重量应该与移动它获得的收益成正比。
- Looking for cycles in this graph 将允许您找到动作 (移动包括移动循环中的每个顶点)。
- 选择总权重最大的循环,重新聚类边对应的节点。
- 重复步骤 1-4 直到没有更多的循环。
创建图形的复杂度为O(kn),其中总共有k 和n 个点,并且可以创建相同数量的多边。 Tarjan 的算法将具有 O(k2) 的复杂性,假设您跳过多边到 DFS 中的相同目的地。每消去一个圈,全局距离就会减少一定量,并从图中至少去除一条边,所以算法的总时间不能超过 O(k4m2)。那太奢侈了;我确定可以通过启发式方法(可能还有更详细的分析)来改进下限。
本文解决了这个问题:
Bradley, P. S.、K. P. Bennett 和 Ayhan Demiriz。 "Constrained k-means clustering." 微软研究院,雷德蒙德 (2000): 1-8.
We propose explicitly adding $k$ constraints to the underlying clustering optimization problem requiring that cluster $h$ contain at least $\tau_h$ points.
我在python中有一个implementation的算法。
试试这个:pip install k-means-constrained
然后
from k_means_constrained import KMeansConstrained
KMeansConstrained(n_clusters=8, size_min=None, size_max=None, init='k-means++', n_init=10, max_iter=300, tol=0.0001, verbose=False, random_state=None, copy_x=True, n_jobs=1)
来源: