返回

【阿旭机器学习实战】【17】KMeans聚类算法中如何选择合适的聚类个数K

发布时间:2022-12-08 22:13:19 314
# 数据

目录

  • ​​KMeans聚类算法中如何选择合适的聚类个数?​​
  • ​​问题描述​​
  • ​​1. 随机生成二维数据点​​
  • ​​2. 定义不同聚类中心个数对点进行分类​​
  • ​​3. 画图选取最合适的K值​​

KMeans聚类算法中如何选择合适的聚类个数?

问题描述

我们随机生成一些二维点的数据,然后通过不同的K值对其进行分类评估。

具体步骤:

  1. 随机生成一些二维点
  2. 选取不同的K值进行模型训练,并计算轮廓系数
  3. 画出K值与轮廓关系的折线图,看取哪一个K值合适

1. 随机生成二维数据点

import numpy as np
x1 = np.random.randint(1,10,size=14)
x2 = np.random.randint(1,10,size=14)
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)

【阿旭机器学习实战】【17】KMeans聚类算法中如何选择合适的聚类个数K_二维

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]

【阿旭机器学习实战】【17】KMeans聚类算法中如何选择合适的聚类个数K_如何选择合适聚类个数_02

3. 画图选取最合适的K值

# 画一个折线图,体现聚类个数和轮廓系数之间的关系
plt.plot(clusters,sil_scores)
[]

【阿旭机器学习实战】【17】KMeans聚类算法中如何选择合适的聚类个数K_聚类_03

通过上面折线图我们可以看到,当K=3时,轮廓系数最大,分类效果最好。

如果内容对你有帮助,感谢记得点赞+关注哦!

欢迎关注我的公众号:​​阿旭算法与机器学习​​​,共同学习交流。
更多干货内容持续更新中…

 

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线
下一篇
Redis持久化是如何实现的 2022-12-08 21:47:57