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

如何识别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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 08:54:01