使用python确定给定数据集的最佳k-mean
Posted
技术标签:
【中文标题】使用python确定给定数据集的最佳k-mean【英文标题】:To determine the optimal k-mean for given dataset using python 【发布时间】:2020-07-23 11:03:35 【问题描述】:我对 python 和集群的东西很陌生。现在我的任务是分析一组数据并使用肘部和轮廓法确定其最佳 Kmean。
如图所示,我的数据集有三个特征,一是被测人的体重,二是被测人的血液胆固醇含量,第三是被测人的性别('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()
并得到下面的情节:
然后,我用剪影法看剪影分数:
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 之前是否对数据进行了标准化?它们在很大程度上受数据规模的影响。在您的示例中,性别是二元的,而其他特征是在更大范围内测量的,请尝试在对数据进行归一化后进行绘图。 我认为你应该做一个grid search @ParthasarathySubburaj 规范化效果很好! 为了完整起见,我将其作为答案,请接受它作为经过验证的答案以关闭此问题并帮助将来可能访问此问题的其他人。 【参考方案1】:K-means 算法非常容易受到测量特征的范围的影响,在您的情况下,性别是一个二进制变量,只取值 0
和 1
,但其他两个特征是规模较大,我建议您先对数据进行归一化,然后再次绘制绘图,这样可以在肘部曲线和轮廓方法之间产生一致的结果。
希望这会有所帮助。
【讨论】:
以上是关于使用python确定给定数据集的最佳k-mean的主要内容,如果未能解决你的问题,请参考以下文章
您使用啥方法来选择 k-means 和 EM 中的最佳聚类数?
Sklearn k-means聚类(加权),确定每个特征的最佳样本权重?
如何确定Keras ImageDataGenerator中测试数据集的最佳“步数”和“批量大小”?