我试图在一组高维数据点(大约 50 维)上应用 k-means,并且想知道是否有任何实现可以找到最佳集群数量。
我记得在某处读到,算法通常这样做的方式是使集群间距离最大化而集群内距离最小化,但我不记得我在哪里看到的。如果有人可以向我指出任何讨论这个问题的资源,那就太好了。我目前正在将 SciPy 用于 k-means,但任何相关的库也可以。
如果有实现相同或更好算法的替代方法,请告诉我。
我试图在一组高维数据点(大约 50 维)上应用 k-means,并且想知道是否有任何实现可以找到最佳集群数量。
我记得在某处读到,算法通常这样做的方式是使集群间距离最大化而集群内距离最小化,但我不记得我在哪里看到的。如果有人可以向我指出任何讨论这个问题的资源,那就太好了。我目前正在将 SciPy 用于 k-means,但任何相关的库也可以。
如果有实现相同或更好算法的替代方法,请告诉我。
看看这个关于确定数据集中集群数量的维基百科页面。
此外,您可能想尝试凝聚层次聚类。这种方法不需要知道集群的数量,它会逐渐形成集群的集群,直到只有一个存在。这种技术也存在于 SciPy ( scipy.cluster.hierarchy ) 中。
一种有趣的方法是Fred 和 Jain的证据积累方法。这是基于将多次运行的 k-means 与大量集群相结合,将它们聚合成一个整体解决方案。该方法的优点包括集群的数量在过程中确定,并且最终的集群不必是球形的。
您还应该确保每个维度实际上是独立的。许多所谓的多维数据集具有同一事物的多种表示。
在您的数据中包含这些并没有错。使用同一事物的多个版本作为对集群参数的支持是错误的。
如果集群编号未知,为什么不使用层次聚类呢?
开始时,每个孤立的都是一个簇,如果两个簇的距离小于某个阈值,则每两个簇将被合并,当没有更多的合并时,算法将结束。
层次聚类算法可以为您的数据执行合适的“K”。
一种方法是使用大 k(比您认为的正确数字大得多)运行 k-means,例如 1000。然后,在这 1000 个点上运行均值偏移算法(均值偏移使用整个数据,但您只会“移动”这 1000 个点)。然后,均值偏移将找到簇的数量。在没有 k-means 之前运行 mean shift 是可能的,但它通常太慢了 O(N^2*#steps),所以之前运行 k-means 会加快速度:O(N K #steps)