kmeans python_聚类的Python实现(二):确定分群数K

2f3643791d9a9c586aece0cc19cfbaa7.png

对于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), sse_list, '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()

7bffe648a13e0a79c5a4bb12a0c5b249.png

轮廓系数法

求出所有样本的轮廓系数后再求平均值就得到了平均轮廓系数。平均轮廓系数的取值范围为[-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()
​

0fa9e9a8b46e2cde4c9860d3a8713d25.png
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
K-means是常用的聚类之一,它的主要思想是将数据点分为K个簇,使得同一簇内的点相似度较高,不同簇之间的点相似度较低。在scikit-learn中,KMeans聚类已经实现,可以方便地进行聚类操作。 本文将介绍使用scikit-learn中的KMeans聚类进行聚类的步骤和实现方法,并介绍MiniBatchKMeans的使用。 ## 1. 数据准备 我们先生成一个随机数据集,用于演示KMeans聚类: ```python import numpy as np # 生成随机数据 np.random.seed(0) X = np.random.randn(1000, 2) # 生成1000个维数据点 ``` ## 2. 模型训练 接下来,我们使用KMeans模型对数据进行聚类: ```python from sklearn.cluster import KMeans # 构建模型 kmeans = KMeans(n_clusters=3, random_state=0) # 训练模型 kmeans.fit(X) ``` 这里选择将数据分为3个簇,可以根据实际情况进行调整。训练完成后,我们可以查看簇中心点的位置: ```python print(kmeans.cluster_centers_) ``` 输出: ``` [[ 0.05161133 -0.96525049] [ 1.06359705 -0.02646225] [-0.9680658 0.04252211]] ``` ## 3. 预测和评估 训练完成后,我们可以使用训练好的模型对新数据进行预测: ```python # 预测新数据 y_pred = kmeans.predict(X) ``` 对于聚类,我们可以使用轮廓系数(Silhouette Coefficient)评估聚类效果。轮廓系数是一种衡量聚类质量的指标,取值范围在[-1, 1]之间,越接近1表示聚类效果越好。在scikit-learn中,可以使用metrics.silhouette_score来计算轮廓系数: ```python from sklearn import metrics # 计算轮廓系数 score = metrics.silhouette_score(X, y_pred) print(score) ``` 输出: ``` 0.6011942331016043 ``` ## 4. MiniBatchKMeans KMeans聚类的一个问题是它对于大规模数据的聚类会比较慢。因此,scikit-learn中还提供了MiniBatchKMeans,它可以加快聚类速度。 MiniBatchKMeans的使用方法KMeans类似: ```python from sklearn.cluster import MiniBatchKMeans # 构建模型 mbkmeans = MiniBatchKMeans(n_clusters=3, random_state=0) # 训练模型 mbkmeans.fit(X) # 预测新数据 y_pred = mbkmeans.predict(X) # 计算轮廓系数 score = metrics.silhouette_score(X, y_pred) print(score) ``` 需要注意的是,MiniBatchKMeans聚类效果上可能会稍微劣于KMeans,但是速度更加快捷。在处理大规模数据时,可以优先考虑使用MiniBatchKMeans。 本文介绍了使用scikit-learn中的KMeans聚类进行聚类的步骤和实现方法,并介绍了MiniBatchKMeans的使用。在实际应用中,可以根据实际情况选择不同的聚类和参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值