使用 k 均值聚类时,我可以通过 calinski 和 hrabasz 验证来确定 k 吗?

Bet*_*lee 1 python cluster-analysis k-means scikit-learn

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

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

    for kClusterCnt in range(2, 21) :
       value = metrics.calinski_harabaz_score(datasets.data, kmCls.labels_)
Run Code Online (Sandbox Code Playgroud)

仅使用该方法是否有任何缺陷或错误?

Ati*_*gur 5

我认为您需要为每个簇编号调用 kmeans 。我合并了scikit learn 文档中的示例和您的代码,如下所示。

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)
Run Code Online (Sandbox Code Playgroud)

输出如下。

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
Run Code Online (Sandbox Code Playgroud)

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

  • 找到精确的 k 仍然是一个开放的研究问题。calinski_harabaz_score 是提出的集群适应度方法之一。只有您可以说它是否对您的问题/数据集有效。 (2认同)