如何让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
相关产品推荐
相关产品推荐

