如何根据原列表元素升序规则重新对聚类簇标签进行编号
实现思路
- 首先为每个原始聚类簇计算可排序的代表值(通常取簇内元素最小值即可满足升序排序需求)
- 对所有原始聚类簇按照代表值从小到大排序,生成「原始簇编号→新簇编号」的映射表
- 遍历原clusters列表,用映射表替换所有编号即可,全程不会改变元素与簇的归属对应关系
代码实现(Python)
l = [4, 55, 8, 9, 12, 11, 11, 813, 832, 774, 781, 5, 769, 22] clusters = [0, 3, 0, 0, 0, 0, 0, 1, 1, 2, 2, 0, 2, 0] # 收集每个原始簇包含的所有元素 cluster_element_map = {} for val, old_cluster_id in zip(l, clusters): cluster_element_map.setdefault(old_cluster_id, []).append(val) # 按簇的最小元素升序排列原始簇,生成编号映射 sorted_old_ids = sorted(cluster_element_map.keys(), key=lambda x: min(cluster_element_map[x])) id_mapping = {old_id: new_id for new_id, old_id in enumerate(sorted_old_ids)} # 替换得到新的聚类编号列表 new_clusters = [id_mapping[old_id] for old_id in clusters] print(new_clusters)
运行上述代码输出结果为:[0, 1, 0, 0, 0, 0, 0, 3, 3, 2, 2, 0, 2, 0],完全符合需求。
自定义说明
如果需要调整簇的排序基准,只需修改sorted方法的key参数即可,比如替换为max(cluster_element_map[x])按最大值排序,或替换为sorted(cluster_element_map[x])[len(cluster_element_map[x])//2]按中位数排序,适配不同的升序规则。
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

