KMeans聚类算法中如何选择合适的聚类个数?
问题描述
我们随机生成一些二维点的数据,然后通过不同的K值对其进行分类评估。
具体步骤:
- 随机生成一些二维点
- 选取不同的K值进行模型训练,并计算轮廓系数
- 画出K值与轮廓关系的折线图,看取哪一个K值合适
1. 随机生成二维数据点
import numpy as np
x1 = np.random.randint(1,10,size=14) x2 = np.random.randint(1,10,size=14) • 1 • 2
x = np.c_[x1,x2] x
array([[6, 5], [3, 6], [4, 4], [2, 9], [1, 8], [1, 5], [1, 7], [7, 4], [3, 7], [2, 2], [2, 8], [6, 5], [3, 2], [6, 4]])
# 画出这些点的散点图 plt.scatter(x1,x2)
2. 定义不同聚类中心个数对点进行分类
# 定义出若干种聚类的个数 clusters = [2,3,4,5,8]
plt.figure(figsize=(8*2,3*3)) # 定义一个列表用于存储轮廓系数 sil_scores = [] # 定义一个变量,用于记录当前是第几个图 sub_center = 1 axes = plt.subplot(231) axes.scatter(x1,x2) axes.set_title("Instances") for cluster in clusters: km = KMeans(n_clusters=cluster).fit(x) # 打印每种聚类划分的标签 print(km.labels_) # 求每一次划分的轮廓系数 sil_score = metrics.silhouette_score(x,km.labels_) sil_scores.append(sil_score) # 画图 sub_center += 1 axes = plt.subplot(2,3,sub_center) axes.scatter(x1,x2,c=km.labels_) # 把当前的K值和轮廓系数作为标题 axes.set_title("K=%s,Sil_score=%s"%(cluster,sil_score))
[0 1 0 1 1 1 1 0 1 0 1 0 0 0] [0 1 0 1 1 1 1 0 1 2 1 0 2 0] [2 3 1 0 0 3 0 2 3 1 0 2 1 2] [2 1 0 3 3 4 3 2 1 0 3 2 0 2] [2 3 6 7 1 4 1 5 3 0 7 2 0 5]
3. 画图选取最合适的K值
# 画一个折线图,体现聚类个数和轮廓系数之间的关系 plt.plot(clusters,sil_scores) • 1 • 2
[<matplotlib.lines.Line2D at 0x26d99d4a5f8>]
通过上面折线图我们可以看到,当K=3时,轮廓系数最大,分类效果最好。
如果内容对你有帮助,感谢记得点赞+关注哦!