使用 python 确定给定数据集的最佳 k 均值

To determine the optimal k-mean for given dataset using python

我对 python 和集群的东西还很陌生。现在我有一个任务是分析一组数据并使用肘部和轮廓法确定其最佳 Kmean。

如图所示,我的数据集有三个特征,一是被测者的体重,二是被测者的血液胆固醇含量,三是被测者的性别('0'表示女性,“1”表示男性)

我先用肘法看wcss在不同k值下的值

from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
wcss = []
for i in range(1, 11):
    kmeans = KMeans(n_clusters=i, init='k-means++', max_iter=300, n_init=10, random_state=0)
    kmeans.fit(data)
    wcss.append(kmeans.inertia_)
plt.plot(range(1, 11), wcss)
plt.title('Elbow Method')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')
plt.show()
            

并得到如下图:

然后,我用silhouette的方法来看silhouette得分:

from sklearn.metrics import silhouette_score

sil = []

for k in range(2, 6):
  kmeans = KMeans(n_clusters = k).fit(data)  
  preds = kmeans.fit_predict(data)
  sil.append(silhouette_score(data, preds, metric = 'euclidean'))


plt.plot(range(2, 6), sil)
plt.title('Silhouette Method')
plt.xlabel('Number of clusters')
plt.ylabel('Sil')
plt.show()

for i in range(len(sil)):
 print(str(i+2) +":"+ str(sil[i]))

我得到了以下结果:

有人可以建议我如何选择最佳 Kmean 吗?我做了一些简单的研究,有人说 s-score 越高越好(在我的情况下,簇号应该是 2?),但在其他一些情况下,他们不只是使用具有最高分数的簇号。

另一个想法是,我在这里将性别作为一个特征,我是否应该先将我的数据按性别分成两个类,然后分别对它们进行聚类?

K-means 算法非常容易受到测量特征的范围的影响,在您的情况下,性别是一个二进制变量,它只取值 01,但另一个两个特征是更大尺度的度量,我建议您先对数据进行归一化,然后再次绘图,这样可以在肘部曲线和轮廓方法之间产生一致的结果。

希望对您有所帮助。