【机器学习|学习笔记】K-means 聚类算法详解 + 优化方法(附 Python 代码)
【机器学习|学习笔记】K-means 聚类算法详解 + 优化方法(附 Python 代码)
欢迎铁子们点赞、关注、收藏!
祝大家逢考必过!逢投必中!上岸上岸上岸!upupup
大多数高校硕博生毕业要求需要参加学术会议,发表EI或者SCI检索的学术论文会议论文。详细信息可关注VX “
学术会议小灵通
”或参考学术信息专栏:https://blog.csdn.net/2401_89898861/article/details/148514108
前言
- K-means 是机器学习中最经典的无监督聚类算法之一。它不仅在基础研究中被广泛使用,也在现代机器学习系统(如图像分割、向量搜索、推荐系统、预训练模型的离散化等)中有着极其重要的实际应用。
✅ 一、K-means 算法简介
📌 核心思想:
- 将 n n n 个样本划分为 K K K 个簇,使得簇内距离最小、簇间距离最大。
📈 算法流程:
- 1. 初始化 K K K 个簇中心(随机或优化方式)
- 2. 对每个样本,分配给最近的中心
- 3. 更新每个簇的中心点(取其所有成员点的均值)
- 4. 重复步骤 2、3,直到收敛(中心点不再变化或最大迭代数)
🧪 二、Python 实现 K-means(以 sklearn 为例)
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
# 构造模拟数据
X, _ = make_blobs(n_samples=300, centers=4, cluster_std=0.6, random_state=42)
# KMeans 聚类
kmeans = KMeans(n_clusters=4, random_state=42)
kmeans.fit(X)
y_kmeans = kmeans.predict(X)
# 可视化
plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, cmap='viridis')
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s=200, c='red', marker='X')
plt.title("K-means 聚类结果")
plt.show()
🧠 三、K-means 的优缺点总结
优点 ✅ | 缺点 ❌ |
---|---|
实现简单,计算效率高 | 对初始中心敏感(容易陷入局部最优) |
对低维数据效果较好 | 无法处理非凸簇或不同密度的簇 |
在大数据场景下易并行化 | K 值需要人为指定 |
🧩 四、K-means 常见优化方法
✅ 方法1:K-means++ 初始化
- 问题:随机初始化可能选到不代表性样本,导致聚类质量差
- K-means++ 会优先选择分布更“稀疏”的点作为初始中心,提升聚类稳定性。
KMeans(n_clusters=4, init='k-means++')
✅ 方法2:多次运行取最优(n_init)
KMeans(n_clusters=4, n_init=10)
✅ 方法3:肘部法则选择最优 K 值
inertias = []
for k in range(1, 10):
model = KMeans(n_clusters=k, random_state=42).fit(X)
inertias.append(model.inertia_)
plt.plot(range(1, 10), inertias, marker='o')
plt.xlabel("簇数 k")
plt.ylabel("SSE (inertia)")
plt.title("肘部法则选择最佳簇数")
plt.show()
✅ 方法4:MiniBatchKMeans(适合大规模数据)
- K-means 的全量计算方式对大数据不友好,MiniBatchKMeans 用小批量更新中心,大大提升速度。
from sklearn.cluster import MiniBatchKMeans
mbk = MiniBatchKMeans(n_clusters=4, batch_size=100, random_state=42)
mbk.fit(X)
✅ 方法5:谱聚类、层次聚类等替代(非凸簇)
如果数据非线性分布(如两月牙状数据),K-means 无法正确划分,可改用:
- 谱聚类(SpectralClustering)
- DBSCAN(基于密度的聚类)
🧠 五、K-means 与现代机器学习的结合
场景 | 应用说明 |
---|---|
图像压缩 | 对像素聚类(颜色聚类)降低色阶 |
向量搜索系统(如 FAISS) | 聚类索引加速 ANN 检索(IVF-PQ 结构) |
词嵌入离散化 | Word2Vec/BERT 向量离散化为 token |
图神经网络 | 社区发现、节点划分 |
自监督学习 | 聚类生成伪标签(如 DeepCluster) |
🧮 六、K-means 聚类数学公式
- 给定聚类中心
μ
j
μ_j
μj,聚类目标为最小化:
- 本质上是最小化样本到各自簇中心的平方距离和(SSE)
✅ 七、总结 & 建议
内容 | 推荐方案 |
---|---|
✅ 聚类方法 | K-means:适合凸簇、低维、等方差 |
⚠ 初始化优化 | 使用 K-means++ + 多次初始化(n_init) |
📉 大规模数据 | 使用 MiniBatchKMeans 加速 |
🔍 K 值选择 | 使用肘部法或 Gap Statistics |
🧠 替代方法 | 对非凸簇数据可使用 DBSCAN / 谱聚类 |
🤖 实际工程 | 向量检索中聚类作为 FAISS IVF 的核心组件 |