不知道聚类数的情况下如何进行K均值聚类?

42

我正在尝试对一组高维数据点(约50个维度)应用k-means,并想知道是否有任何实现可以找到最优聚类数量。

我记得在某处读到过,算法通常是通过最大化簇间距离和最小化簇内距离来完成这一点,但我不记得在哪里看到的。如果有人能指点我有关此事的任何资源,那将是很好的。我目前正在使用SciPy进行k-means,但任何相关的库也都可以。

如果有其他实现相同或更好算法的替代方法,请告诉我。


这可能更适合于理论计算机科学Stack Exchange,因为它不是关于实现的问题,而更多地涉及理论。 - gotgenes
2
...和http://stackoverflow.com/questions/6353537/k-means-algorithm以及https://dev59.com/k1fUa4cB1Zd3GeqPLtRH。这个问题被问得相当频繁。 - Stompchicken
我在这里用半打种方法(使用R)回答了一个类似的问题:stackoverflow.com/a/15376462/1036500 - Ben
也许你应该使用减法聚类来寻找聚类中心?这个算法的基本概念在这里介绍:链接,虽然是为matlab设计的,但应该足够好用。 - Bartek S
7个回答

16

一种方法是进行交叉验证

本质上,您选择数据的一个子集并将其聚类为k个簇,并询问其聚类效果与其余数据相比如何:您是否将数据点分配到相同的簇成员身份,或者它们是否落入不同的簇中?

如果成员身份大致相同,则数据很好地适合k个簇。否则,尝试不同的k

此外,您可以进行主成分分析(PCA)以将50维降至更可处理的数量。如果PCA运行表明您的大多数方差来自于50个维度中的4个,那么您可以基于此选择k,以探索如何分配这四个簇成员身份。


7
维度数量和聚类数量之间有什么联系?我可以很容易地为任意K构建具有k个聚类的1维分布。 - Rob Neuhaus
3
如果会员资格大致相同——这意味着数据被均匀地分成了簇,这是一个相当强的假设。 - Fred Foo
“相同的簇成员”是什么意思?您是否将训练折叠上的聚类与测试折叠上的聚类进行比较?如果是这样,我不确定您如何进行比较,因为它们具有完全不重叠的数据点。 - max

10

4

一种有趣的方法是Fred和Jain提出的证据积累。该方法基于将多个具有大量聚类的k-means运行组合成一个整体解决方案。该方法的优点包括:过程中确定聚类数目,最终聚类不必呈球形。


1

有一些可视化工具可以提示好的参数。对于k-means算法,您可以使用Graphgrams可视化不同k值下的多次运行结果(请参见WEKA graphgram包 - 最好通过软件包管理器或此处获取。有关介绍和示例也可以在此处找到)。


0

您还应确保每个维度实际上是独立的。许多所谓的多维数据集具有相同事物的多个表示。

在您的数据中拥有这些并不是错误的。但如果使用同一事物的多个版本作为支持聚类论点,则是错误的。

http://en.wikipedia.org/wiki/Cronbach's_alpha


0
如果聚类数目未知,为什么不使用层次聚类呢?
一开始,每个孤立的点都是一个聚类,然后如果它们的距离低于一个阈值,就会合并每两个聚类,当没有更多的合并时算法就结束了。
层次聚类算法可以为您的数据执行适当的“K”。

0
一种方法是使用较大的 k(远远大于您认为的正确数量),例如 1000,在这些 1000 个点上运行均值漂移算法(平移平均值使用整个数据,但您只会“移动”这些 1000 个点)。 然后,均值漂移将找到聚类的数量。 在未进行 k-means 的情况下运行均值漂移也是可能的,但通常速度太慢(O(N ^ 2 *#步骤)),因此在运行 k-means 之前会加快速度:O(NK#步骤)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接