如何识别KMeans聚类图标签并验证文本聚类结果与真实分类的匹配度
问题2:聚类匹配准确率计算
注意K-means输出的簇编号和你真实的类别编号没有天然对应关系(比如聚类簇0可能对应真实类别2),不能直接逐样本对比标签是否相等,需要先通过**匈牙利算法(线性分配)**找到簇编号到真实类别的最优映射,再计算匹配占比。
实现代码如下:
import numpy as np from scipy.optimize import linear_sum_assignment from sklearn.metrics import adjusted_rand_score, normalized_mutual_info_score def calc_cluster_accuracy(true_labels, cluster_labels): true_labels = np.array(true_labels) cluster_labels = np.array(cluster_labels) # 构建混淆矩阵 n_class = max(true_labels.max(), cluster_labels.max()) + 1 conf_mat = np.zeros((n_class, n_class), dtype=np.int64) for i in range(len(true_labels)): conf_mat[cluster_labels[i], true_labels[i]] += 1 # 找最优映射关系 row, col = linear_sum_assignment(conf_mat.max() - conf_mat) # 计算匹配样本占比 return conf_mat[row, col].sum() / len(true_labels) # 调用计算 true_labels = df['Classes'].tolist() cluster_labels = kmeans_model.labels_.tolist() # 自定义的匹配准确率 match_acc = calc_cluster_accuracy(true_labels, cluster_labels) print(f"同真实类别样本被分到同一簇的占比:{match_acc:.4f}") # 也可以直接用行业通用的聚类评价指标 ari = adjusted_rand_score(true_labels, cluster_labels) nmi = normalized_mutual_info_score(true_labels, cluster_labels) print(f"调整兰德系数ARI:{ari:.4f}") print(f"归一化互信息NMI:{nmi:.4f}")
补充说明:
- 上述
match_acc就是你需要的样本占比,取值范围0~1,越接近1说明聚类结果和真实标签匹配度越高。 - ARI、NMI是聚类任务通用的评价指标,取值同样在0~1之间,1代表聚类结果和真实标签完全一致,0代表和随机划分效果无差别,更适合不同聚类方案的效果对比。
内容的提问来源于stack exchange,提问作者U23r
相关产品推荐
相关产品推荐

