如何匹配两个相似数据集经KMeans聚类后得到的不同标签分配?
实现思路
方法1:基于质心距离的匈牙利算法匹配(最常用,效果稳定)
这是该类标签对齐场景的标准解决方案,仅要求两个数据集的聚类簇数量完全一致:
- 提取数据集A的所有聚类质心,记为矩阵
centroids_A,形状为(n_clusters, 3),索引顺序对应A的原始标签0到n-1 - 提取数据集B的所有聚类质心,记为矩阵
centroids_B,形状同样为(n_clusters, 3),索引顺序对应B的原始标签0到n-1 - 计算两个质心集合的两两距离矩阵:
dist_matrix[i][j]表示A的第i个质心和B的第j个质心的欧氏距离(数据已归一化的场景下也可使用余弦距离) - 调用匈牙利算法(Kuhn-Munkres算法)求解该距离矩阵的最小权匹配,得到的匹配结果即为A的标签i对应B的标签j
- 最后构建标签映射字典,将B的所有原始标签按照映射关系替换为A的对应标签即可完成对齐
Python实现可直接调用scipy的scipy.optimize.linear_sum_assignment接口,示例代码片段:
import numpy as np from scipy.optimize import linear_sum_assignment # 输入两个质心矩阵 dist = np.linalg.norm(centroids_A[:, None] - centroids_B[None, :], axis=2) row_ind, col_ind = linear_sum_assignment(dist) # 构建映射:B的原始标签 -> A的对应标签 label_map = {col: row for row, col in zip(row_ind, col_ind)} # 对B的原始标签重映射 aligned_labels_B = np.array([label_map[x] for x in original_labels_B])
方法2:基于A的聚类模型直接预测B的标签(简单高效,适合分布差异极小的场景)
如果两个数据集的分布偏差确实很小,可以不用单独对B执行KMeans聚类:
- 直接使用数据集A训练完成的KMeans模型,对B的所有样本执行预测,得到的标签天然和A的标签体系对齐,无需额外匹配
- 该方法实现成本极低,缺点是如果B的簇分布和A存在明显偏移,聚类效果会弱于单独对B执行KMeans的结果
方法3:基于最大重叠的标签匹配(适合存在样本对应关系的场景)
如果两个数据集的样本是一一对应的(比如同一批样本两次采集得到的两个数据集),可以用标签重叠度完成匹配:
- 统计B的每个标签和A的每个标签的共同样本数量,构建共现矩阵
- 同样用匈牙利算法求解最大匹配,得到最终的标签映射关系
内容的提问来源于stack exchange,提问作者Paolo Accordini
相关产品推荐
相关产品推荐

