RAYW,互联网数据分析。
博客:zhihu.com/people/wang-rui-54-41
对于KMeans算法聚类数k的选取非常重要,下面介绍两种常用的选择方法。
手肘法
手肘法的核心指标是SSE(sum of the squared errors,误差平方和):
其中,Ci是第i个簇,p是Ci中的样本点,mi是Ci的质心(Ci中所有样本的均值),SSE是所有样本的聚类误差,代表了聚类效果的好坏。 随着聚类数K的增大,样本划分会更加精细,每个簇的聚合程度会逐渐提高,那么误差平方和(SSE)自然会逐渐变小。但K增大到一定程度时,K增大对SSE减小的作用越来越小,因此K—SSE曲线呈现手肘状,拐点附近的K值通常为适当的分群数量。
如下的聚类数——SSE曲线,我们可以考虑使用4-6的聚类数,建模后观察结果,并最终根据业务需求确定分群。
#创建空列表,依次创建k=1~15的模型并 保存SSE结果
sse_list = [ ]
K = range(1, 15)
for k in range(1,15):
kmeans=KMeans(n_clusters=k, n_jobs = 6)
kmeans.fit(Zdata)
sse_list.append(kmeans.inertia_) #model.inertia_返回模型的误差平方和,保存进入列表
print(sse_list)
#折线图展示聚类数——SSE曲线
plt.figure()
plt.plot(np.array(K), aa, 'bx-')
plt.rcParams['figure.figsize'] = [12,8]
plt.xlabel('分群数量',fontsize=18)
plt.ylabel('SSE',fontsize=18)
plt.xticks(fontsize=15)
plt.yticks(fontsize=15)
plt.show()
轮廓系数法
求出所有样本的轮廓系数后再求平均值就得到了平均轮廓系数。平均轮廓系数的取值范围为[-1,1],且簇内样本的距离越近,簇间样本距离越远,平均轮廓系数越大,聚类效果越好。
那么,很自然地,平均轮廓系数(silhouette_score)最大的k便是最佳聚类数。
在python中,使用sklearn库的metrics.silhouette_score()方法可以很容易作出K—平均轮廓系数曲线。
需要注意的是,轮廓系数计算非常耗费资源,通常可以设置sample_size使用抽样计算平均轮廓系数。
#分别创建分群2-15的KMeans模型
clusters = range(2,15)
sc_scores = []
for k in clusters:
kmeans_model = KMeans(n_clusters=k, n_jobs = 6).fit(Zdata)
sc_score = metrics.silhouette_score(Zdata, kmeans_model.labels_
,sample_size=10000, metric='euclidean')
sc_scores.append(sc_score)
print(sc_scores)
#作出K—平均轮廓系数曲线
plt.figure()
plt.plot(clusters, sc_scores, 'bx-')
plt.rcParams['figure.figsize'] = [12,8]
plt.xlabel('分群数量',fontsize=18)
plt.ylabel('Silhouette Coefficient Score',fontsize=18) #样本平均轮廓系数
plt.xticks(fontsize=15)
plt.yticks(fontsize=15)
plt.show()
§
§
Python中文社区作为一个去中心化的全球技术社区,以成为全球20万Python中文开发者的精神部落为愿景,目前覆盖各大主流媒体和协作平台,与阿里、腾讯、百度、微软、亚马逊、开源中国、CSDN等业界知名公司和技术社区建立了广泛的联系,拥有来自十多个国家和地区数万名登记会员,会员来自以公安部、工信部、清华大学、北京大学、北京邮电大学、中国人民银行、中科院、中金、华为、BAT、谷歌、微软等为代表的政府机关、科研单位、金融机构以及海内外知名公司,全平台近20万开发者关注。
更多推荐
Python迭代器使用详解
一文读懂Python可迭代对象、迭代器和生成器
用Python爬取金融市场数据
搭建CNN模型破解网站验证码
用Python进行图文识别(OCR)
投稿邮箱:[email protected]
▼点击下方阅读原文,免费成为数据科学俱乐部会员