我有一组数据聚类到 k 组,每个聚类的最小尺寸约束为 m
我已经完成了一些数据的重新复制。所以现在我得到了这一组点,每个点都有一个或多个更好的簇,但不能单独切换,因为它会违反大小约束。
目标:最小化从每个点到其群集中心的距离之和。
受约束:最小簇大小m
我想找到一种算法来重新分配所有点而不违反约束,同时保证减少目标。
我想过使用Graph来表示点之间的成对关系。但我不知道如何进行重新分配,因为它存在大密集循环的可能性,而且我在多个集群之间交换多个点时迷失了。
我还创建了一个可能交换候选者的聚类对列表,但仍无法找到最佳目标的方法。
我希望我解释了我的情况。我是算法新手,不熟悉行话和规则。如果需要任何其他信息,请告诉我。
我做了很多研究, 我已经尝试了本文中的算法,但没有成功,因为隶属度的总和不一定与簇大小相关。 Clustering with Size Constraints
我也读过SO上的其他类似文章,但没有找到我可以实现的详细算法。
我试图构建一个加权有向图,顶点表示聚类,A到B的边表示聚类A中愿意重新定位到聚类B的点,权重是点的总和
但是根据我的数据,结果表明所有节点都处于一个边缘非常密集的巨大周期中。由于我的经验有限,我仍然无法弄清楚如何在如此多的集群中重新分配。任何建议都表示赞赏!
这样的东西。
答案 0 :(得分:4)
获得最小(不幸的是不是最小)解决方案:
创建图形将具有O(kn)的复杂度,其中您具有k和n个总点数,并且可以创建相同数量的多边形。 Tarjan的算法将具有O(k 2 )的复杂性,假设您跳过多边缘到DFS中的相同目的地。每次消除一个循环时,都会减少一定量的全局距离,并从图中删除至少一个边,因此算法的总时间不能超过O(k 4 m 2功能)。这太奢侈了;我确信可能有启发式(可能还有更详细的分析)来改善下限。
答案 1 :(得分:2)
尝试以下操作: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)
来源:
答案 2 :(得分:1)
本文讨论了这个问题:
Bradley,P。S.,K。P. Bennett和Ayhan Demiriz。 “受约束的k均值聚类。” Microsoft Research,Redmond(2000):1-8。
我们建议明确地向底层群集优化问题添加$ k $约束,要求群集$ h $至少包含$ \ tau_h $ points。
我在python中有implementation算法。