前面文章中,介绍过《手写KMeans聚类算法》,本文介绍用Sklearn中的cluster.KMeans类,来实现聚类算法。并使用轮廓系数来评估KMeans中的K值是否合适。
1、生成数据并可视化
from sklearn.datasets import make_blobs import matplotlib.pyplot as plt x, y = make_blobs(200, 2, centers=4, random_state=16) plt.scatter(x[:,0], x[:,1]) plt.show()
2、聚类并可视化结果
from sklearn.cluster import KMeans cluster = KMeans(n_clusters=3, random_state=20).fit(x) y_pred = cluster.predict(x) centers = cluster.cluster_centers_ plt.scatter(x[:, 0], x[:, 1], c=y_pred) plt.scatter(centers[:, 0], centers[:, 1], c='red', marker='x') plt.show()
3、轮廓系数
在本示例中,我们创建数据时指定了4个中心点,而在聚类算法中我们要求分为3簇,看上去也得到了不错的结果。那么在不同的分类方法中,哪一种才是最合理的呢?这就要引入一个聚类评估指标:轮廓系数。
根据聚类的要求“簇内差异小,簇外差异大”,轮库系数评估的就是,簇内和簇外差异的比值。
from sklearn.metrics import silhouette_score scores = [] for i in range(2, 10): cluster = KMeans(n_clusters=i, random_state=20).fit(x) score = silhouette_score(x, cluster.labels_) scores.append(score) plt.plot(range(2, 10), scores) plt.show()
由图可见,n_clusters=3 比 n_clusters=4 的轮廓系数大,说明我们的数据分为3簇也是合理的,具体的簇的数量,最终还是取决业务场景。
本文为 陈华 原创,欢迎转载,但请注明出处:http://ichenhua.cn/read/280
- 上一篇:
- 数据结构之队列求解迷宫最短路径问题
- 下一篇:
- 数据结构之单链表与创建方法