今天我在尝试学习一些关于K-means的内容。我已经理解了这个算法,并且知道它是如何工作的。现在我在寻找合适的k… 我找到了肘部准则作为检测合适k的方法,但我不明白如何在scikit learn中使用它?!在scikit learn中,我是这样进行聚类的
kmeans = KMeans(init='k-means++', n_clusters=n_clusters, n_init=10) kmeans.fit(data)
那么我应该为n_clusters = 1…n多次运行这个代码,并观察错误率来找到合适的k吗?我觉得这样做很愚蠢,而且会花费很多时间?!
回答:
肘部准则是一种可视化方法。我还没有看到它的一个稳健的数学定义。但K-means本身也是一种相当粗糙的启发式方法。
所以,是的,你需要运行K-means,设置k=1...kmax
,然后绘制结果的SSQ,并决定一个“最优”的k。
存在K-means的改进版本,例如X-means,它从k=2
开始,然后增加k,直到一个次要准则(AIC/BIC)不再改善。Bisecting K-means是一种从k=2开始,然后重复分割聚类直到k=kmax的方法。你可能可以从中提取中间的SSQs。
无论哪种方式,我觉得在任何实际使用案例中,如果K-means真的很好,你实际上是事先知道你需要的k。在这些情况下,K-means实际上不仅仅是一个“聚类”算法,而是一个向量量化算法。例如,将图像的颜色数量减少到k。(通常你会选择k,例如32,因为这样就是5位颜色深度,可以以压缩的方式存储)。或者,例如,在视觉词袋方法中,你会手动选择词汇量。一个流行的值似乎是k=1000。你并不太关心“聚类”的质量,主要目的是能够将图像减少到一个1000维的稀疏向量。900维或1100维表示的性能不会有实质性的不同。
对于实际的聚类任务,即当你想要手动分析结果聚类时,人们通常使用比K-means更高级的方法。K-means更多的是一种数据简化技术。