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

Posted

技术标签:

【中文标题】具有最小尺寸约束的聚类算法【英文标题】:Algorithm for clustering with minimum size constraints 【发布时间】:2015-07-18 16:43:11 【问题描述】:

我有一组数据聚类成 k 个组,每个聚类的最小大小约束为 m

我已经对数据进行了一些重新聚类。所以现在我得到了这组点,每个点都有一个或多个更好的集群,但不能单独切换,因为它会违反大小限制。

目标:最小化每个点到其聚类中心的距离总和。

服从:最小簇大小 m

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

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

我还创建了一个包含可能交换候选者的集群对列表,但仍然找不到优化目标的方法。

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

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

我还阅读了关于 SO 的其他类似帖子,但没有找到我可以实现的详细算法。

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

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

类似的东西。

【问题讨论】:

在 CrossValidated 上查看 this。 我实际上尝试了论文中的算法。也许我做错了什么。但不知何故,我没有得到想要的结果。由于成员的总和与集群大小无关。例如 u_1 = [0.45, 0.15, 0.4], u_2 = [0.45, 0.3, 0.25] 和 u_3 = [0.1, 0.55, 0.35] 集群仍然不平衡。 “尺寸限制”太不具体了。你的意思是***.com/questions/5452576/…***.com/questions/8796682/…吗? 【参考方案1】:

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

    首先,在不违反规则的情况下,贪婪地重新聚集任何积分 最小尺寸限制。 接下来,构建一个有向多重图,如下所示:
      每个集群都成为一个节点。 为靠近 B 中心的 A 中的每个点添加一条边 (A,B)(因此同一对节点之间可能存在多条边);它的重量应该与移动它所获得的收益成正比。
    Looking for cycles in this graph 可以让你找到动作 (其中移动包括移动循环中的每个顶点)。 选择总权重最高的循环,并重新聚集与边缘对应的节点。 重复步骤 1-4,直到不再有循环。

创建图将具有 O(kn) 的复杂度,其中您有 k 和 n 个总点,并且可以创建相同数量的多边。 Tarjan 算法的复杂度为 O(k2),假设您将多边跳过到 DFS 中的同一目的地。每次消除一个循环,都会将全局距离减少一些,并从图中移除至少一条边,因此算法的总时间不能超过 O(k4m2 )。那是相当奢侈的;我确信可能会有启发式方法(可能还有更详细的分析)来改善下限。

【讨论】:

对不起,但我怀疑这是正确的。循环的存在并不意味着潜在的移动。即使从 A 到 B 和 B 到 A 的边都存在,那么将一个顶点从 A 移动到 B 可能会破坏另一边。 @AmiTavory 您正在考虑先进行一项操作,然后再进行另一项操作。相反,考虑将 A 中的 p 和 B 中的 q 去聚类,然后将它们重新聚类(一个到 A,一个到 B);如果在去聚类之前 p 更接近 B 并且 q 更接近 A,那么如果 p 去 B 并且 q 去 A,则全局距离将最小化。您必须将整个循环视为移动,而不是单个重新聚类。 然后想象一个等腰三角形,A 和 B 形成底部,C 形成顶点。此外,还有一个循环ABC。此外,AB 边缘是由 A 中的右上角元素与 B 具有亲和力。但是,它向 B 的移动降低了 A,所以我不明白为什么它不会破坏 CA。跨度> @AmiTavory 它肯定会破坏 CA。如果您随后不将任何点从 C 移动到 A,则全局解决方案将更加减少。但是,这违反了 A 必须具有某个最小尺寸的硬约束,因此您必须在 B 或 C 中选择危害最小的点并移动它到A; 因为之前有一个循环,我们知道这个伤害最小的点不是刚刚离开A的点。 对不起,我不这么认为。 1.它肯定不会破坏CA,只有可能。更重要的是,2. 没有理由假设任何此类转移必然会违反其中一个集群的最小大小要求。【参考方案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/

【讨论】:

您需要使用size_min 参数指定最小集群大小。例如,如果它的最小尺寸是 10,输入数据是 X:clf = KMeansConstrained(n_clusters=8, size_min=10); labels = clf.fit_predict(X)【参考方案3】:

本文解决了这个问题:

Bradley、P.S.、K.P. Bennett 和 Ayhan Demiriz。 “受约束的 k 均值聚类。” 微软研究院,雷德蒙德 (2000):1-8。

我们建议将 $k$ 约束明确添加到底层聚类优化问题中,要求聚类 $h$ 至少包含 $\tau_h$ 点。

我在 python 中有一个implementation 的算法。

【讨论】:

以上是关于具有最小尺寸约束的聚类算法的主要内容,如果未能解决你的问题,请参考以下文章

查找地理点的聚类(距离聚类中心 y 距离内的最小 x 点)的算法

具有离散和连续属性的聚类算法?

转载各种聚类算法的比较

处理聚类问题常用算法-----算法岗面试题

聚类算法都有哪些

谱聚类算法总结