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

问题描述 投票:0回答:1

我对python和杂乱无章的东西很陌生。现在,我的任务是分析一组数据,并使用弯头和轮廓法确定最佳Kmean。

dataset information

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

我首先使用弯头方法查看不同k值处的wcss值

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()

并在下面获得图:Elbow Result

然后,我使用轮廓法查看轮廓分数:

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]))

我得到了以下结果:enter image description here

有人可以建议我如何选择最佳Kmean吗?我做了一些轻松的研究,有人说s分数越高越好(在我的情况下,群集数应为2?),但在其他情况下,他们并不仅仅是使用得分最高的群集数。

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

python scikit-learn k-means hierarchical-clustering sklearn-pandas
1个回答
0
投票

K均值算法非常容易测量您的特征的范围,在这种情况下,性别是一个二进制变量,仅取值01,而其他两个特征则是较大范围内的度量比例尺,我建议您先对数据进行归一化,然后再做一次绘制,这可能会在肘部曲线和轮廓法之间产生一致的结果。

希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.