You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何控制聚类距离、限制聚类选择,解决KMeans误判无匹配噪声样本问题

KMeans聚类噪声样本强制分配问题的解决方案

KMeans属于硬聚类算法,核心逻辑是将所有输入样本分配到距离最近的质心所属簇,本身没有分布外样本判断能力,这是问题的核心原因。

方案1:统一距离阈值过滤(改造成本最低)

  • 实现逻辑:
    1. KMeans训练完成后,统计所有训练样本到其归属簇质心的距离分布
    2. 选取距离分布的分位值作为阈值,比如95分位代表仅允许5%的训练样本被判定为无匹配,可根据业务需求调整
    3. 预测阶段先计算输入样本到最近质心的距离,超过阈值返回None,否则返回对应簇ID
  • 示例代码:
import numpy as np
from sklearn.metrics.pairwise import euclidean_distances

# 训练阶段计算阈值
train_embed_to_centroid_dist = euclidean_distances(train_embeds, kmeans.cluster_centers_)[np.arange(len(train_embeds)), kmeans.labels_]
# 取95分位作为阈值,可自定义
threshold = np.percentile(train_embed_to_centroid_dist, 95)

# 预测逻辑
def predict_with_reject(sample_embed):
    dists = euclidean_distances(sample_embed.reshape(1, -1), kmeans.cluster_centers_)[0]
    min_dist = dists.min()
    if min_dist > threshold:
        return None
    return dists.argmin()
  • 优缺点:不需要改动原有模型,性能开销可忽略,适配20万级数据集;缺点是当不同簇密度差异较大时,统一阈值容易出现误判。

方案2:分簇单独设置阈值(适配密度不均数据集)

  • 实现逻辑:不在全量训练集统计统一阈值,而是针对每个簇单独统计该簇内所有训练样本到质心的距离分布,每个簇设置独立的阈值
  • 预测阶段:先找到距离样本最近的质心,再用该质心对应的簇阈值做判断,超过则返回None
  • 优缺点:解决了簇密度不均的问题,判断准确率比统一阈值更高,改造成本依然很低,仅需要额外存储每个簇的阈值参数。

方案3:替换为支持噪声识别的聚类算法

  • 可替换的算法选项:
    • DBSCAN:基于密度的聚类算法,天生会将低密度区域的样本标记为噪声(输出标签为-1),不需要额外加阈值逻辑
    • HDBSCAN:DBSCAN的优化版本,自适应匹配不同密度的簇,对大规模高维数据适配性更好,不需要手动调整密度参数
  • 优缺点:不需要额外加判定逻辑,噪声识别准确率高;缺点是需要替换原有KMeans模型,如果业务侧已经绑定了原有簇的业务逻辑,改造成本较高。

方案4:新增分布外(OOD)检测层

  • 实现逻辑:额外训练一个二分类器,将训练集的正常样本作为正例,收集或生成业务场景中可能出现的噪声样本作为负例,预测时先过OOD分类器,判定为分布外直接返回None,否则再走KMeans聚类分配
  • 优缺点:如果有足够的噪声样本做训练,识别准确率远高于距离阈值方案;缺点是需要准备负样本,新增了模型训练和部署成本。

调优参考

  • 阈值选择优先匹配业务需求:如果要求更低的正常样本漏判率,选择更高的分位值(如99分位);如果要求更低的噪声误分配率,选择更低的分位值(如90分位)
  • 距离计算的度量标准要和文本嵌入的训练逻辑对齐:如果嵌入是基于余弦相似度训练的,优先用余弦距离做统计,效果优于欧氏距离
  • 20万级数据集的距离统计和预测阶段的距离计算都可以通过向量化操作优化,不会带来明显的性能损耗

内容的提问来源于stack exchange,提问作者user_12

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 04:30:05