前面文章中,介绍过《手写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