我正在处理一个问题,需要在约125个不同的数据集上分别运行KMeans。因此,我希望为每个数据集数学上计算出“最优”的K值。然而,随着K值的增加,评估指标持续下降。
对于一个样本数据集,有50,000行和8列。我使用sklearn的calinski-harabaz得分,通过不同的K值进行迭代以寻找最佳/最小得分。然而,我的代码已经达到k=5,600,而calinski-harabaz得分仍在下降!
似乎有些奇怪的事情在发生。该指标是否不太有效?我的数据可能有问题吗(参见我的关于在PCA后按行标准化的提问)?是否有其他/更好的方法来数学上收敛到“最优”的K?还是我应该强迫自己在所有数据集中手动选择一个恒定的K?
任何额外的观点都会有所帮助。
回答:
总结
随着K的每次增加,指标都在下降;这强烈表明你的数据集上没有自然的聚类。
讨论
CH得分取决于簇内和簇间密度的比率。对于点分布相对平滑的情况,每次增加K都会得到密度略高的簇,簇间密度略低。尝试一个点的网格:改变半径并手动进行计算;你会看到这是如何工作的。在极端情况下,K = n:每个点都是自己的簇,具有无限密度,簇间密度为0。
其他指标
也许最简单的指标是平方和,它已经是聚类计算的一部分。将从质心到各点的距离的平方相加,除以n-1(n=簇人口),然后对所有簇进行加和/平均。
我正在寻找一篇特别讨论此问题的指标的论文;如果我能找到参考文献,我会更新这个答案。
注意:无论你选择哪个指标(如CH),未能找到局部最小值表明数据确实没有自然的聚类。
下一步该做什么?
以某种形式呈现你的数据,让你能够可视化。如果你看到自然的聚类,看看它的特征;你是如何看到的,而代数(指标)却看不到?制定一个突出你所感知到的差异的指标。
我知道,这是一个类似于你试图自动化的问题的努力。欢迎来到研究。:-)