K-Means 是经典无监督聚类算法,通过迭代优化最小化簇内平方和,使同簇样本相似度高、异簇相似度低。
算法流程
- 初始化:选择 k 个初始聚类中心(可用 K-Means++)
- 分配:每个样本分配到最近的聚类中心
- 更新:重新计算每个簇的均值作为新中心
- 迭代:重复直到收敛
目标函数
$$\min_{C} \sum_{i=1}^{n} \min_{j} |x_i - \mu_j|^2$$
为什么用均值:均值最小化簇内平方和。
优缺点
| 优点 | 缺点 |
|---|
| 简单高效 | 需预设 k 值 |
| 时间复杂度 $O(nkt)$ | 对初始化敏感 |
| 适合大规模数据 | 仅适用于球状簇 |
适用场景
K 值选择
| 方法 | 说明 |
|---|
| 肘部法则 | WCSS 曲线拐点 |
| 轮廓系数 | 选择最高值 |
| Gap Statistic | 比较参照分布 |
代码示例
1
2
3
4
5
| from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=3, init='k-means++', random_state=42)
y_kmeans = kmeans.fit_predict(X)
centers = kmeans.cluster_centers_
|
改进版本
| 版本 | 改进 |
|---|
| K-Means++ | 智能初始化,提高稳定性 |
| Mini-Batch K-Means | 大规模数据加速 |
| Kernel K-Means | 处理非线性可分数据 |
Comments