使用 k-means 聚类时,我可以使用 calinski 和 hrabasz 验证来确定 k 吗?

Posted

技术标签:

【中文标题】使用 k-means 聚类时,我可以使用 calinski 和 hrabasz 验证来确定 k 吗?【英文标题】:Can I determine k with calinski and hrabasz validation when using k-means clustering? 【发布时间】:2017-05-24 12:46:00 【问题描述】:

我想使用 python 中 scikit 包中的 calinski 和 harabasz 验证自动选择 k(k-means 聚类)(metrics.calinski_harabaz_score)。

我循环遍历所有聚类范围以选择 calinski_harabaz_score 的最大值

    for kClusterCnt in range(2, 21) :
       value = metrics.calinski_harabaz_score(datasets.data, kmCls.labels_)

我只使用那个方法有什么缺陷或错误吗?

【问题讨论】:

您也可以掷骰子选择k。不要依赖这些措施,始终手动验证您的集群。 感谢您的回复。我知道我必须用平方和和其他方法来查看聚类数。但是我需要制作一个程序来自动选择 K 并在没有人为决定的情况下运行聚类。所以我写了这些问题来获得一些建议。 不,也不要依赖平方和!自动聚类是矛盾的。 【参考方案1】:

我认为您需要调用 kmeans 适合每个集群编号。我合并了来自scikit learn documentation 的示例和您的代码如下。

from sklearn import metrics
from sklearn.metrics import pairwise_distances
from sklearn import datasets
dataset = datasets.load_iris()
X = dataset.data
y = dataset.target
import numpy as np
from sklearn.cluster import KMeans
kmeans_model = KMeans(n_clusters=3, random_state=1).fit(X)
labels = kmeans_model.labels_
metrics.calinski_harabaz_score(X, labels)
for k in range(2, 21):
    kmeans_model = KMeans(n_clusters=k, random_state=1).fit(X)
    labels = kmeans_model.labels_
    labels = kmeans_model.labels_
    print k, metrics.calinski_harabaz_score(X, labels)

输出如下。

2 513.303843352
3 560.399924247
4 529.120719084
5 494.094381914
6 474.517429587
7 448.871449442
8 436.613024881
9 414.530317405
10 390.646480599
11 368.89696343
12 357.194592002
13 342.732084105
14 344.610818724
15 337.809470535
16 324.972019063
17 322.825466107
18 314.587220111
19 306.64863559
20 316.905301605

根据这个结果,3 个聚类中心是最好的。 “3 560.399924247”。

【讨论】:

感谢您回答问题。是的,我像你一样制作了源代码。但是不知道选k是否有效,也不会出错。 找到精确的 k 仍然是一个开放的研究问题。 calinski_harabaz_score 是提出的聚类适应度方法之一。只有您可以说它是否对您的问题/数据集有效。 总是对 k-means 进行多次随机初始化。【参考方案2】:

请记住,由于初始化阶段的随机性,k-means 是非确定性的。这意味着您将获得一系列答案,并且您必须针对每个 k 值对该范围进行采样,以获得最适合该 k 的值。这不是一次性完成的。

【讨论】:

感谢您回答问题。我试着再考虑一下。

以上是关于使用 k-means 聚类时,我可以使用 calinski 和 hrabasz 验证来确定 k 吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 K-Means 聚类时,为啥我的数据点不在正确准确的聚类中?

使用带有 Silhouette 函数的 k-means 聚类时如何选择 k?

使用带有 Silhouette 函数的 k-means 聚类时如何选择 k?

使用 k-means 聚类时如何确定 k?

使用 k-means 聚类时如何确定 k?

使用 k-means 聚类时如何确定 k?