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

HDBSCAN聚类参数优化求助:动漫人脸嵌入聚类效果未达预期

问题背景

我构建了一个PyTorch模型,用于判断两张动漫裁剪人脸图像是否相似(基于人脸图像对,采用cosine similarity和contrastive loss进行训练)。

嵌入提取代码

def calculate_embeddings(model, loader):
    model.eval()

    embeddings = []
    with torch.no_grad():
        for batch_idx, images in enumerate(loader):
            images = images.to(device)
            batch_embeddings = model(images)
            embeddings.extend(batch_embeddings.cpu().numpy())

            print('STEP %d/%d, Batch size: %d' % (batch_idx + 1, len(loader), images.size(0)), end='\t\r')

    return np.array(embeddings)

embeddings = calculate_embeddings(model, clustering_loader)

聚类代码

from sklearn.preprocessing import normalize
import hdbscan

norm_embeddings = normalize(embeddings, norm='l2')
clusterer = hdbscan.HDBSCAN(min_cluster_size=6, min_samples=6)
clusters = clusterer.fit_predict(norm_embeddings)

可视化对比

  • 理想TSNE结果:理想TSNE
  • 实际TSNE结果:我的TSNE

当前数据集共18969张裁剪人脸,噪声点多达14226个。尝试增大min_samples后,得到一个超大簇和若干小簇;试过DBSCAN,效果比HDBSCAN更差。想知道:

  • 能否给HDBSCAN参数调优建议?
  • 是否需要更换其他聚类器?
  • 是不是模型训练不足导致的?

解决方案建议

一、HDBSCAN参数调优方向

  1. 调整min_cluster_size与min_samples的比例
    你当前两个参数均设为6,建议尝试让min_samples小于min_cluster_size,比如min_cluster_size=10、min_samples=3。min_samples控制噪声判定的严格程度,调小它能减少被标记为噪声的点;min_cluster_size保证簇的最小规模,避免生成细碎小簇。
  2. 指定余弦距离度量
    虽然L2归一化后的嵌入,欧氏距离等价于余弦距离,但显式指定metric='cosine'可能让HDBSCAN更适配你的嵌入特性:
    clusterer = hdbscan.HDBSCAN(min_cluster_size=10, min_samples=3, metric='cosine')
    
  3. 添加cluster_selection_epsilon硬阈值
    这个参数可以强制将距离小于阈值的点聚成簇,相当于给HDBSCAN补充DBSCAN的硬约束。你可以先计算嵌入余弦距离的分位数(比如用sklearn.metrics.pairwise_distances),选取95%分位数对应的距离值作为cluster_selection_epsilon,能有效减少噪声点。

二、聚类器替代方案

  1. 层次聚类(Agglomerative Clustering)
    适合人脸嵌入的聚类场景,尤其是当你能接受通过距离阈值自动确定簇数量时:
    from sklearn.cluster import AgglomerativeClustering
    clusterer = AgglomerativeClustering(n_clusters=None, distance_threshold=0.2, metric='cosine', linkage='average')
    clusters = clusterer.fit_predict(norm_embeddings)
    
    平均链接(average linkage)对噪声的鲁棒性优于单链接,更适配人脸嵌入的分布。
  2. K-Means(需预估簇数量)
    如果你能大致估计数据中的簇数量,K-Means在归一化嵌入上的表现也可尝试,它的计算效率更高:
    from sklearn.cluster import KMeans
    clusterer = KMeans(n_clusters=你预估的簇数, random_state=42)
    clusters = clusterer.fit_predict(norm_embeddings)
    

三、模型训练层面排查

  1. 验证嵌入区分度
    先随机选取多组同一角色、不同角色的人脸对,计算它们嵌入的余弦相似度。如果同一角色的相似度没有显著高于不同角色,说明模型嵌入的区分度不足,需要优化训练:
    • 检查contrastive loss的正负样本构造是否合理,是否加入了足够的难负样本
    • 增加训练轮次或调整学习率
    • 尝试替换为triplet loss,它直接优化三元组的距离关系,对聚类任务更友好
  2. 嵌入降维优化
    如果模型输出的嵌入维度过高,可先用PCA降维到50-100维再聚类,冗余维度的去除往往能提升聚类效果:
    from sklearn.decomposition import PCA
    pca = PCA(n_components=50)
    reduced_embeddings = pca.fit_transform(norm_embeddings)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 14:40:23