KMeans 算法中如何确定簇的数量(K值)?
在 K-Means 算法中,簇的数量 K 需要预先指定。但实际应用中,K 通常是未知的,需要通过一定方法确定。以下是几种常用的方法,其中手肘法是最经典的一种。
一、手肘法(Elbow Method)
原理
手肘法的核心思想是:随着簇数量 K 的增加,数据点与所属簇质心的距离之和(称为总平方误差,SSE)会逐渐减小(理论上是无限接近0, 也就是每个数据点都是一个簇)。
但当 K 增大到真实簇数量时,SSE 的下降幅度会显著降低,形成类似“手肘”的拐点,此时的 K 即为合理值。
公式
总平方误差(SSE)的计算公式:
SSE=∑i=1K∑x∈Ci∥x−μi∥2SSE=i=1∑Kx∈Ci∑∥x−μi∥2
其中:
- CiCi 是第 ii 个簇
- μiμi 是第 ii 个簇的质心
步骤
- 对不同的
K值(如 K=1,2,...,10K=1,2,...,10)分别运行 K-Means 算法。 - 计算每个
K对应的 SSE。 - 绘制
K与 SSE 的关系曲线,观察拐点(SSE 下降幅度骤减的点)。
示例图
当 K=3 时,SSE 下降明显变缓,因此选择 K=3:
SSE
|
|*****
| *****
| *****
| ------(拐点)
+-----------------------
1 2 3 4 5 6 7 8 9 10
K值
优缺点
-
优点:简单直观,易于实现。
-
缺点:
- 拐点可能不明显(尤其在数据分布复杂时)。
- 依赖主观判断,需人工观察曲线。
二、其他方法
-
轮廓系数(Silhouette Coefficient)
-
衡量每个数据点与自身簇和其他簇的相似度,取值范围为 [−1,1][−1,1]。
-
步骤:
- 对不同的
K值计算所有样本的平均轮廓系数。 - 选择轮廓系数最大的
K值。
- 对不同的
-
优点:量化评估聚类效果,无需人工观察。
-
缺点:计算复杂度较高,适用于中小数据集。
-
-
Gap Statistic
- 通过比较实际数据与随机均匀分布数据的聚类效果差异,选择差异最大的
K值。 - 优点:无需人工判断,适用于复杂数据。
- 缺点:计算成本高。
- 通过比较实际数据与随机均匀分布数据的聚类效果差异,选择差异最大的
-
业务需求驱动
-
根据实际场景需求选择
K。例如:- 客户分群时,需按业务目标确定分组数量(如高/中/低价值客户)。
- 图像压缩时,根据颜色数量限制设定
K。
-
手肘法 Python 代码实现
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
# 生成模拟数据(3个真实簇)
X, y = make_blobs(n_samples=500, centers=3, cluster_std=0.8, random_state=42)
# 尝试不同的 K 值(1到10)
sse = []
k_values = range(1, 11)
for k in k_values:
kmeans = KMeans(n_clusters=k, init='k-means++', n_init=10, random_state=42)
kmeans.fit(X)
sse.append(kmeans.inertia_) # inertia_ 属性即为 SSE
# 绘制手肘图
plt.figure(figsize=(8, 5))
plt.plot(k_values, sse, 'bo-', linewidth=2, markersize=8)
plt.xlabel('Number of Clusters (K)')
plt.ylabel('SSE')
plt.title('Elbow Method for Optimal K')
plt.axvline(x=3, color='r', linestyle='--', label='Elbow Point (K=3)')
plt.legend()
plt.show()
输出结果
- 图中会在
K=3处出现明显拐点,表明数据真实簇数为3。
三、如何选择方法?
| 场景 | 推荐方法 |
|---|---|
| 数据分布简单,需快速判断 | 手肘法 |
| 数据分布复杂,需量化评估 | 轮廓系数 / Gap Statistic |
| 有明确的业务目标 | 业务需求驱动 |
总结
- 手肘法是确定
K值的经典方法,通过观察 SSE 下降趋势的拐点选择K。 - 若拐点不明显,可结合轮廓系数或 Gap Statistic 进行验证。
- 实际应用中,常将数学方法与业务需求结合,选择最合理的
K值。