我想在python(metrics.calinski_harabaz_score)中使用scikit包中的calinski和harabasz验证自动选择k(k-means聚类)。
我遍历所有聚类范围以选择calinski_harabaz_score的最大值
for kClusterCnt in range(2, 21) :
value = metrics.calinski_harabaz_score(datasets.data, kmCls.labels_)
当我只使用那种方法时是否有任何缺陷或错误?
答案 0 :(得分: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"。
答案 1 :(得分:1)
请记住,由于初始化阶段的随机性,k-means是非确定性。这意味着您将获得一系列答案,并且您必须为k的每个值采样该范围,以获得最适合该k的值。这不是一次性完成的。