我试图在一组高维数据点(大约50维)上应用k-means,并且想知道是否有任何实现可以找到最佳数量的聚类。
我记得在某处读到算法通常这样做的方式是群集间距离最大化并且群集内距离最小化但我不记得我在哪里看到它。如果有人可以指出我讨论这个的任何资源,那将是很棒的。我目前正在使用SciPy进行k-means,但任何相关的库都可以。
如果有其他方法可以实现相同或更好的算法,请告知我们。
答案 0 :(得分:15)
一种方法是cross-validation。
从本质上讲,您选择数据的一个子集并将其聚类到 k 群集中,并询问它与其他数据相比的集群程度:您是否将数据点分配给相同的集群成员资格,还是属于不同的集群?
如果成员资格大致相同,则数据非常适合 k 集群。否则,您尝试使用其他 k 。
此外,您可以执行PCA(principal component analysis)将您的50个维度减少到更易处理的数字。如果PCA运行表明您的大部分差异来自50个维度中的4个,那么您可以在此基础上选择 k ,以探索如何分配四个群集成员资格。< / p>
答案 1 :(得分:8)
看看这个wikipedia page on determining the number of clusters in a data set。
您也可以尝试Agglomerative hierarchical clustering。这种方法不需要知道簇的数量,它将逐渐形成簇的簇,直到只存在一簇。这种技术也存在于SciPy(scipy.cluster.hierarchy)中。
答案 2 :(得分:4)
一个有趣的方法是Fred和Jain的evidence accumulation。这是基于将多个k-means运行与大量集群相结合,将它们聚合成一个整体解决方案。该方法的好处包括在过程中确定簇的数量,并且最终簇不必是球形的。
答案 3 :(得分:1)
有可视化应该暗示好的参数。对于k-means,您可以使用Graphgrams可视化具有不同k的多个运行(请参阅WEKA graphgram包 - 最好由包管理器或here获得。还可以找到介绍和示例here。
答案 4 :(得分:0)
您还应该确保每个维度实际上都是独立的。许多所谓的多维数据集具有同一事物的多种表示。
在数据中包含这些内容并没有错。使用与支持群集参数相同的多个版本是错误的。
答案 5 :(得分:0)
如果群集编号未知,为什么不使用层次聚类呢?
在开始时,每个孤立的群集都是一个群集,如果它们的距离低于阈值,则每两个群集将被合并,算法将在不再进行合并时结束。
分层聚类算法可以为您的数据执行合适的“K”。
答案 6 :(得分:0)
一种方法是运行k-means大k(比你认为的正确数字大得多),比如1000.然后,在这1000个点上运行均值漂移算法(均值转换使用整个数据,但你只会“移动”这1000个点)。然后平均移位将找到簇的数量。 之前没有k-means的平均移动是可能的,但它通常太慢O(N ^ 2 *#steps),所以之前运行k-means会加快速度:O(N K #steps)