R中的约束k-means算法(必须链接约束)

数据挖掘 r k-均值 无监督学习
2021-10-01 22:20:47

我目前面临一个无监督学习任务,即使用聚类的方法。更具体地说,它是一个分段任务,因此有一些关于 a) 聚类数量和 b) 每个分段的粗略内容的先验知识。从文学作品来看,这似乎是一个典型的例子,“受约束的 k-means”将发挥作用,我真的很想尝试一下。上述两个先验知识都可以合并到“受约束的k-means”中,因为a)由k表示,b)可以用“必须链接约束”表示。(有关受约束的 k 均值的一个很好的概述,请参阅 Wagstaff、Cardie、Rogers、Schrödl 和其他人 (2001)。)

我现在的问题是我在 CRAN 上的 R 中找不到合适的实现。根据伪代码,我自己在 R 中编程是可以的,但我的编程肯定不够高效,因为我们谈论的是一个有点大的数据集(75.000 x 30)。

因此,我求助于这个社区,希望有人在 R 中找到了“受约束的 k-means”的有效实现,或者愿意提供一些有效的代码。

非常感谢你,

克莱门斯

2016 年 6 月 23 日更新:感谢您到目前为止的回复。为了使问题更简洁,请在此处查看示例数据文件。(注意:这不是我原始数据的摘录,因为它是高度敏感的,而是具有相同特征的人工数据集(尽管行数更少))

简单约束的两个示例:

  • 所有在 v305 中为 1 或在 v306 中为 1 的观测值都必须链接(必须链接约束)
  • 所有在 v258 和 v262 中为 1 的观测值都必须链接(必须链接约束)

目前正在查看您的建议,Rahul。非常感谢。

2个回答

对于给定的问题,我将在 R 中应用受约束的层次聚类。在这种情况下更有效。如果你喜欢应用层次聚类,包是“rioja”,你可以使用的函数是 chclust()。
这不是 R 中受限的 K-means 实现,但这应该可以解决您的实际问题。

chclust() 函数中有两种类型的约束,您可以通过函数中的方法参数来设置它们。这将在平方和的基础上添加约束。您可以通过简单的搜索详细了解这些约束。

这个 chclust 函数将生成约束对象,您可以使用“rioja”包中的其他函数检查正确的组数。

可以在以下链接上检查相同的实际实现: https ://gist.github.com/benmarwick/7097120

R 包结论似乎是您正在寻找的。

从包装描述:

该包中有 4 个主要函数:ckmeans()、lcvqe()、mpckm() 和 ccls()。他们将一个未标记的数据集和两个必须链接和不能链接约束列表作为输入,并生成一个聚类作为输出。

还有一个python实现(免责声明:我已经开发了它)。