41

我试图在一组高维数据点(大约 50 维)上应用 k-means,并且想知道是否有任何实现可以找到最佳集群数量。

我记得在某处读到,算法通常这样做的方式是使集群间距离最大化而集群内距离最小化,但我不记得我在哪里看到的。如果有人可以向我指出任何讨论这个问题的资源,那就太好了。我目前正在将 SciPy 用于 k-means,但任何相关的库也可以。

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

4

7 回答 7

16

一种方法是交叉验证

本质上,您选择数据的一个子集并将其聚类到k个聚类中,然后询问与其余数据相比,它的聚类效果如何:您是将数据点分配给相同的聚类成员,还是它们属于不同的聚类?集群?

如果成员资格大致相同,则数据很适合k个集群。否则,您尝试不同的k

此外,您可以进行 PCA(主成分分析)以将 50 个维度减少到一些更易于处理的数字。如果 PCA 运行表明您的大部分方差来自 50 个维度中的 4 个,那么您可以在此基础上选择k,以探索如何分配四个集群成员。

于 2011-07-07T19:04:42.783 回答
9

看看这个关于确定数据集中集群数量的维基百科页面

此外,您可能想尝试凝聚层次聚类。这种方法不需要知道集群的数量,它会逐渐形成集群的集群,直到只有一个存在。这种技术也存在于 SciPy ( scipy.cluster.hierarchy ) 中。

于 2011-07-07T19:04:11.090 回答
4

一种有趣的方法是Fred 和 Jain的证据积累方法。这是基于将多次运行的 k-means 与大量集群相结合,将它们聚合成一个整体解决方案。该方法的优点包括集群的数量在过程中确定,并且最终的集群不必是球形的。

于 2011-07-07T19:03:28.807 回答
1

有应该暗示好的参数的可视化。对于 k-means,您可以使用 Graphgrams 可视化具有不同 k 的多个运行(请参阅 WEKA graphgram 包 - 最好由包管理器或此处获得。介绍和示例也可以在此处找到。

于 2014-08-30T17:44:52.940 回答
0

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

在您的数据中包含这些并没有错。使用同一事物的多个版本作为对集群参数的支持是错误的。

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

于 2011-07-07T21:05:26.900 回答
0

如果集群编号未知,为什么不使用层次聚类呢?

开始时,每个孤立的都是一个簇,如果两个簇的距离小于某个阈值,则每两个簇将被合并,当没有更多的合并时,算法将结束。

层次聚类算法可以为您的数据执行合适的“K”。

于 2013-10-18T08:19:08.370 回答
0

一种方法是使用大 k(比您认为的正确数字大得多)运行 k-means,例如 1000。然后,在这 1000 个点上运行均值偏移算法(均值偏移使用整个数据,但您只会“移动”这 1000 个点)。然后,均值偏移将找到簇的数量。在没有 k-means 之前运行 mean shift 是可能的,但它通常太慢了 O(N^2*#steps),所以之前运行 k-means 会加快速度:O(N K #steps)

于 2015-10-27T16:59:38.797 回答