具有最小尺寸约束的聚类算法

时间:2015-05-07 22:01:36

标签: algorithm cluster-analysis

我有一组数据聚类到 k 组,每个聚类的最小尺寸约束为 m

我已经完成了一些数据的重新复制。所以现在我得到了这一组点,每个点都有一个或多个更好的簇,但不能单独切换,因为它会违反大小约束。

目标:最小化从每个点到其群集中心的距离之和。

约束:最小簇大小m

我想找到一种算法来重新分配所有点而不违反约束,同时保证减少目标。

我想过使用Graph来表示点之间的成对关系。但我不知道如何进行重新分配,因为它存在大密集循环的可能性,而且我在多个集群之间交换多个点时迷失了。

我还创建了一个可能交换候选者的聚类对列表,但仍无法找到最佳目标的方法。

我希望我解释了我的情况。我是算法新手,不熟悉行话和规则。如果需要任何其他信息,请告诉我。

我做了很多研究, 我已经尝试了本文中的算法,但没有成功,因为隶属度的总和不一定与簇大小相关。 Clustering with Size Constraints

我也读过SO上的其他类似文章,但没有找到我可以实现的详细算法。

我试图构建一个加权有向图,顶点表示聚类,A到B的边表示聚类A中愿意重新定位到聚类B的点,权重是点的总和

但是根据我的数据,结果表明所有节点都处于一个边缘非常密集的巨大周期中。由于我的经验有限,我仍然无法弄清楚如何在如此多的集群中重新分配。任何建议都表示赞赏!

这样的东西。
enter image description here

3 个答案:

答案 0 :(得分:4)

获得最小(不幸的是不是最小)解决方案:

  1. 首先,贪婪地重新集中你可以不受侵犯的任何一点 最小尺寸约束。
  2. 接下来,构建一个定向多图如下:
    1. 每个群集都成为一个节点。
    2. 为A中的每个点添加一条边(A,B),它更靠近B的中心(这样在同一对节点之间可能有多条边);它的重量应与移动它的好处成正比。
  3. Looking for cycles in this graph可让您找到动作 (移动包括在周期中移动每个顶点)。
  4. 选择总重最高的循环,然后重新集群对应边缘的节点。
  5. 重复步骤1-4,直到没有更多周期。
  6. 创建图形将具有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)

来源:

https://pypi.org/project/k-means-constrained/

https://joshlk.github.io/k-means-constrained/

答案 2 :(得分:1)

本文讨论了这个问题:

Bradley,P。S.,K。P. Bennett和Ayhan Demiriz。 “受约束的k均值聚类。” Microsoft Research,Redmond(2000):1-8。

  

我们建议明确地向底层群集优化问题添加$ k $约束,要求群集$ h $至少包含$ \ tau_h $ points。

我在python中有implementation算法。