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

如何让KMeans聚类标签按质心对应max_vals升序排列?

调整KMeans聚类标签的顺序

我有一个应用于浮点型列表的简单KMeans聚类算法,代码如下:

def clustering(k,lists_to_cluster):
    max_vals = [max(sublist) for sublist in lists_to_cluster]
    kmeans_ampl = KMeans(k, random_state=123).fit(np.array(max_vals).reshape(-1,1))
    centroids_ampl = kmeans_ampl.labels_ 
    return centroids_ampl

centroids_labels = clustering(3,lists_to_cluster)

当前centroids_labels返回结果为[0,0,1,2,2,0],但拥有最大max_vals的列表被标记为0。我希望聚类标签按max_vals升序分配:标签0对应max_vals最小的列表,标签k-1对应max_vals最大的列表。请问能否在执行KMeans之前/过程中实现该需求,还是只能在聚类完成后通过排序映射来调整?


解决方案

KMeans算法本身的聚类标签是随机分配的,无法在执行前或聚类过程中直接指定标签与max_vals大小的对应关系,必须在聚类完成后通过排序映射来调整标签顺序。

具体实现步骤:

  • 获取每个聚类的中心值(对应max_vals的聚类中心)
  • 对聚类中心按升序排序,建立原标签到新标签的映射关系
  • 使用映射关系替换原标签,得到符合要求的标签序列

修改后的代码示例:

from sklearn.cluster import KMeans
import numpy as np

def clustering(k, lists_to_cluster):
    max_vals = [max(sublist) for sublist in lists_to_cluster]
    X = np.array(max_vals).reshape(-1, 1)
    kmeans_ampl = KMeans(k, random_state=123).fit(X)
    
    # 提取聚类中心并建立标签映射
    centroids = kmeans_ampl.cluster_centers_.flatten()
    sorted_centroid_indices = np.argsort(centroids)
    label_mapping = {old_label: new_label for new_label, old_label in enumerate(sorted_centroid_indices)}
    
    # 替换原标签
    adjusted_labels = np.array([label_mapping[label] for label in kmeans_ampl.labels_])
    return adjusted_labels

centroids_labels = clustering(3, lists_to_cluster)

调整后,新标签会严格按照max_vals聚类中心的升序分配:标签0对应整体max_vals最小的列表组,标签k-1对应整体max_vals最大的列表组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 18:15:01