7.1 聚类、距离与稳定性:算法找到的是目标函数偏爱的分组
在聚类之前,先定义哪些特征代表相似、距离怎样计算,以及分组要支持什么行动。数据没有附带“正确簇”这张答案纸;算法找到的是这些选择下的结构,不是某种无条件存在的天然分类。
本课目标
- 把聚类写成明确的目标与相似度假设;
- 推导 K-means 的目标、分配与更新步骤;
- 理解初始化、尺度、异常值和簇形状的影响;
- 区分 K-means 与 DBSCAN 的结构假设;
- 用稳定性、外部证据和下游效用评估聚类。
1. 先定义“相似”
同一批任务可以按地理位置、资源需求、故障模式或文本主题分组。结果不同,不是谁算错了,而是问题不同。
距离函数把业务假设写进模型:
- Euclidean distance 是坐标差平方和的平方根;
- Manhattan distance 累加各维绝对差;相比平方 Euclidean distance,单维偏差的惩罚按线性增长;
- cosine distance 关注方向,常用于稀疏文本表示;
- mixed numeric/categorical 数据需要合适编码或专门相异度;
- 时间序列可能关心形状、相位或动态对齐,不宜直接摊平成普通向量。
单位会支配 Euclidean distance。航程以千米计、温度以摄氏度计时,未经处理的距离可能几乎只看航程。标准化、稳健缩放或领域权重都在改变“相似”的定义,不是无害的清洗步骤。
2. K-means 优化什么
给定
在 Euclidean squared distance 下,固定分组时,使目标最小的中心是簇均值;固定中心时,每个点应分给最近中心。Lloyd 算法交替执行:
- assignment:按最近中心分配样本;
- update:把中心更新为当前簇均值。
每轮不增加目标,因此会停止在某个局部最优/稳定划分;不同初始化可能得到不同结果。它不保证全局最优。
例如一维样本 [0, 2, 8, 10]、初始中心 [0, 8],分配得到 {0, 2} 与 {8, 10}。更新中心为 [1, 9] 后,inertia 从 8 降为 4。均值更新解决了当前分组的最优中心,并没有遍历所有分组方案。
3. 初始化、空簇与收敛
随机挑中心可能把多个初始点放在同一区域。K-means++ 倾向从远离已有中心的位置选新中心,通常改善初始解,但仍保留随机性。
实践中应:
- 固定
random_state以复现实验; - 显式设置多次初始化次数,而不是依赖版本变化的默认值;
- 保存每次运行的 inertia 与分组稳定性;
- 处理 update 后没有样本的空簇;
- 同时检查停止容差、迭代数和中心是否有限。
以下 Python 3 / scikit-learn 1.9.0 片段需提供有限值稠密矩阵 X_train,至少有四个不同的样本。结果是簇标签与标准化坐标中的中心。
from sklearn.cluster import KMeans
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
clusterer = Pipeline([
("scale", StandardScaler()),
("kmeans", KMeans(
n_clusters=4,
init="k-means++",
n_init=20,
max_iter=500,
random_state=42,
)),
])
labels = clusterer.fit_predict(X_train)
centers_scaled = clusterer.named_steps["kmeans"].cluster_centers_若特征是稀疏高维文本,是否中心化、选择哪种距离和使用普通 K-means 还是 spherical K-means,需要单独论证;上面的 dense 数值 pipeline 不能直接照搬。
4. K-means 偏爱怎样的簇
K-means 用均值和 squared Euclidean distance,因此更容易恢复近似凸、各向同性、尺度相近的簇。常见失效包括:
- 两个同心环或弯月形结构;
- 密度/方差差异很大的簇;
- 一个大簇旁有很小的真实群体;
- 少量极端点把均值拉远;
- 高维中距离逐渐集中,近邻对比变弱。
“簇必须一样大”不是严格模型约束,但目标确实可能切开大而分散的簇,并吞并小而靠近的簇。
5. 不是从曲线上自动读出的真相
全局最小 inertia 随
Silhouette 对样本
它不证明业务上存在这些类别,也可能偏爱分离良好的凸簇。选择
- 不同抽样/随机种子下的稳定性;
- 簇是否能用独立特征或后续标签解释;
- 分组是否产生不同且可执行的策略;
- 最小群体规模、运营容量与公平风险;
- 新数据能否可靠分配到既有簇。
若存在真实外部标签,可用 adjusted Rand index、adjusted mutual information 等对 permutation-invariant 的指标比较,但不能训练时偷用未来标签后仍称“完全无监督”。
6. DBSCAN 用密度连接样本
DBSCAN 给定邻域半径 min_samples:
- 核心点:
邻域内样本权重/数量达到阈值,计入自身; - border point:不是核心点,但落在某核心点邻域;
- noise:没有被密度可达关系吸收到簇中。
它能得到非凸形状并把部分点标为噪声,也不要求预先指定簇数。但代价是:
与特征尺度、metric 紧密绑定; - 不同密度的簇很难由一个全局
同时恢复; - 高维邻域会失去区分力;
- 边界点分配可能受样本顺序/实现细节影响;
- 某些实现和参数下邻域图会占用很大内存。
OPTICS/HDBSCAN 等方法可缓解部分“单一密度阈值”问题,但仍要选择 metric、最小簇规模和提取规则。
7. 聚类结果怎样验证
内部指标
Inertia、silhouette、Davies–Bouldin 等只检查特定几何性质。用 K-means 目标选出 K-means 偏爱的解并不奇怪。
稳定性
对样本 bootstrap/subsample、改变初始化和时间窗口,比较 pairwise co-clustering 或对齐后的标签。标签编号本身没有语义:某次的簇 0 可以对应另一次的簇 3。
外部/下游验证
检查每簇的独立结果、人工审阅、后续策略收益与伤害。如果聚类用于分层抽样、推荐或资源分配,应在 held-out/未来数据上验证整个策略,而不只是画二维散点图。
可操作性
给每个簇写出可核查的定义、覆盖人数、关键差异、代表/边界样本和处置动作。无法解释其行动含义的分组可能只是数据压缩结果。
8. 训练/部署边界
若聚类只是一次性探索,可以在明确范围的 snapshot 上拟合。若要给新任务分簇,则需冻结并版本化:
- schema、填补、缩放和编码;
- 特征窗口和 cutoff;
- 中心/密度模型与 cluster-to-action mapping;
- 新类别与缺失处理;
- 漂移和“离所有簇都很远”的拒绝规则。
K-means 可把新样本分给最近的冻结中心。scikit-learn 的标准 DBSCAN 没有对应的 predict;若另写“分给最近核心点”的规则,那是额外的部署规则,需要单独验证。
若聚类特征进入监督模型,所有无监督 transform 也必须在训练 fold 内 fit。无标签不等于不会泄漏 validation/test 的分布信息。
常见误区
- 聚类会发现数据的天然类别:结果由特征、距离和目标共同定义。
- Elbow/silhouette 能给出正确 K:它们只提供几何证据。
- 标准化总是正确:它等价于重设各维权重,应结合业务语义。
- DBSCAN 不需要调参:
eps、min_samples与 metric 决定结果。 - 无监督步骤可在全数据拟合:进入评估 pipeline 时同样会泄漏。
练习
- 在同一数据上分别不缩放、标准化和使用领域权重,比较分组。
- 对多个随机种子与 bootstrap sample 计算 co-clustering 稳定性。
- 用 two moons 比较 K-means 与 DBSCAN,并解释各自假设。
- 为一个聚类应用写出 cluster-to-action mapping 和拒绝规则。
小结
聚类不是从无标签数据中读取唯一答案,而是在选定 representation、metric 和目标后构造分组。K-means 偏爱低 inertia 的均值分区,DBSCAN 偏爱密度连通区域;可靠性要靠稳定性、外部证据和下游行动验证。
下一课研究另一种结构:不把样本分组,而是寻找一个更低维的坐标系来压缩、去噪或可视化数据。