Skip to content

聚类算法 (Clustering)


一句话定义:聚类是一种无监督学习算法,目标是将数据点分成若干组,使得组内相似、组间不同

与分类不同,聚类不需要标签,让数据自己”物以类聚”。


观察 K-Means 算法的迭代过程:分配点 → 更新中心 → 重复直到收敛

🎯K-Means 聚类可视化

C1C2C3123
K (簇数)3
迭代次数0
Inertia0.00
阶段初始化
📝 K-Means 算法步骤
1. 初始化
随机选择 K 个中心
2. 分配
点归属最近中心
3. 更新
重算簇中心
4. 收敛
中心不再变化

超市老板想把商品分类摆放,但没有预设分类标准:

  1. 把相似的商品放一起(饮料区、零食区、生鲜区)
  2. 不同区域的商品差异明显
  3. 顾客购物更方便

这就是聚类在做的事:发现数据中的自然分组


最经典的聚类算法,步骤简单直观:

1. 随机选择 K 个点作为初始中心点
2. 重复直到收敛:
a. 分配: 每个点归属于最近的中心
b. 更新: 重新计算每组的中心点
初始状态: 第1轮: 第2轮: 收敛:
o o o o
o o o o o o o o
* * ★ ★
o o o o o o o o
o o o o
* * ★ ★
* = 初始中心 ★ = 更新后中心

目标:最小化组内平方和 (Within-Cluster Sum of Squares)

J=k=1KxiCkxiμk2J = \sum_{k=1}^{K} \sum_{x_i \in C_k} \|x_i - \mu_k\|^2

其中 μk\mu_k 是簇 CkC_k 的中心点。


from sklearn.cluster import KMeans
import numpy as np
import matplotlib.pyplot as plt
# 生成数据
from sklearn.datasets import make_blobs
X, _ = make_blobs(n_samples=300, centers=4, random_state=42)
# K-Means 聚类
kmeans = KMeans(n_clusters=4, random_state=42)
labels = kmeans.fit_predict(X)
centers = kmeans.cluster_centers_
# 可视化
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', alpha=0.6)
plt.scatter(centers[:, 0], centers[:, 1], c='red', marker='X', s=200)
plt.title('K-Means Clustering')
plt.show()

算法原理优点缺点
K-Means划分到最近中心简单快速需指定 K,只能球形簇
DBSCAN基于密度任意形状,自动去噪参数敏感
层次聚类自底向上合并可视化树状图计算量大
GMM高斯混合模型软聚类,概率输出需指定 K

画出 K vs Inertia 曲线,找”肘部”拐点。

s=bamax(a,b)s = \frac{b - a}{\max(a, b)}
  • aa:点到同簇其他点的平均距离
  • bb:点到最近其他簇的平均距离
  • 范围 [1,1][-1, 1],越大越好
from sklearn.metrics import silhouette_score
score = silhouette_score(X, labels)
print(f"轮廓系数: {score:.3f}")

  1. 必须预设 K - 可用肘部法或轮廓系数估计
  2. 只能发现球形簇 - 非凸形状用 DBSCAN
  3. 对初始中心敏感 - 使用 init='k-means++'
  4. 对异常值敏感 - 预处理时去除噪声

场景说明
客户分群按消费行为分组,精准营销
图像分割按颜色聚类分割区域
异常检测远离所有簇中心的点
文档聚类相似主题的文章分组
数据压缩用簇中心代表整组数据