k-means获取最佳k值:手肘法与轮廓系数法

本文介绍了确定k-means聚类中最佳k值的两种方法:手肘法和轮廓系数法。通过计算误差平方和(SSE)和轮廓系数,分析得出在给定数据集上,k=11时达到最优聚类效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、手肘法

获取最佳的k值
1、手肘法的核心指标是SSE(sum of the squared errors,误差平方和),
在这里插入图片描述

其中,Ci是第i个簇,p是Ci中的样本点,mi是Ci的质心(Ci中所有样本的均值),SSE是所有样本的聚类误差,代表了聚类效果的好坏。
手肘法的核心思想是:随着聚类数k的增大,样本划分会更加精细,每个簇的聚合程度会逐渐提高,
那么误差平方和SSE自然会逐渐变小。并且,当k小于真实聚类数时,由于k的增大会大幅增加每个簇的聚合程度,
故SSE的下降幅度会很大,而当k到达真实聚类数时,再增加k所得到的聚合程度回报会迅速变小,
所以SSE的下降幅度会骤减,然后随着k值的继续增大而趋于平缓,也就是说SSE和k的关系图是一个手肘的形状,
 而这个肘部对应的k值就是数据的真实聚类数。
 当然,这也是该方法被称为手肘法的原因。

代码:

from sklearn.cluster import KMeans
from matplotlib 
### K-Means中的手肘轮廓系数 #### 手肘的作用 手肘是一种用于确定K-Means聚类最佳簇数量 \( k \) 的方。该方基于误差平方和(Sum of Squared Errors, SSE),即每个样本到其所属簇中心的距离平方和。当 \( k \) 小于真实聚类数时,随着 \( k \) 增加,SSE 会显著下降;然而,当 \( k \) 达到真实聚类数后,继续增加 \( k \) 对降低 SSE 的效果变得微乎其微[^4]。因此,在绘制 \( k \)-\( SSE \) 曲线时,曲线会出现类似于“手肘”的形状,其中弯曲处对应的 \( k \) 即为最优簇数。 #### 轮廓系数的作用 轮廓系数则提供了一种更全面的方来评估聚类质量。它综合考虑了簇内紧密性和簇间分离度两个方面。具体而言,对于每一个数据,计算其同簇其他的平均距离(簇内距离)以及其他最近簇的平均距离(簇间距离)。通过这两个指标,可以得到单个的轮廓,范围介于 -1 到 1 之间。较高的轮廓表示更好的聚类效果,意味着簇内的紧凑性高且簇间的区分明显[^2]。 #### 手肘轮廓系数的区别 | **对比维度** | **手肘** | **轮廓系数** | |----------------------|-----------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------| | **核心原理** | 基于 SSE 随着 \( k \) 变化的趋势分析 | 综合评价簇内紧致性和簇间分离度 | | **适用场景** | 更适合初步估计 \( k \),尤其是在数据分布较为简单的情况下 | 提供更为精细的质量评估,适用于复杂数据结构 | | **优缺** | 计算简便快速,但可能受噪声影响较大 | 结果更加可靠,但在大规模数据集上的计算成本较高 | | **输出形式** | 返回单一的最佳 \( k \) | 输出每一的具体评分,可进一步挖掘局部异常 | 以下是两种方的一个实现示例: ```python from sklearn.cluster import KMeans from sklearn.metrics import silhouette_score import matplotlib.pyplot as plt import numpy as np # 数据准备 data = np.random.rand(100, 2) # 使用手肘寻找最佳k sse = [] for k in range(1, 11): kmeans = KMeans(n_clusters=k, random_state=42).fit(data) sse.append(kmeans.inertia_) plt.plot(range(1, 11), sse, marker='o') plt.title('Elbow Method') plt.xlabel('Number of clusters (k)') plt.ylabel('SSE') plt.show() # 使用轮廓系数验证最佳k sil_scores = [] for k in range(2, 11): # 至少需要2个簇才能计算轮廓系数 kmeans = KMeans(n_clusters=k, random_state=42).fit(data) score = silhouette_score(data, kmeans.labels_) sil_scores.append(score) best_k_silhouette = np.argmax(sil_scores) + 2 # 加2是因为range从2开始 print(f"Best k by Silhouette Score: {best_k_silhouette}") ``` #### 总结 尽管两者都旨在优化 K-Means 中的 \( k \) 参数选择,但它们各有侧重:手肘依赖全局 SSE 下降的趋势,操作直观易懂;而轮廓系数深入考察个体层面的归属合理性,从而得出更具说服力的结果。实际应用中可根据需求灵活选用或联合运用这两种技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东木月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值