互信息指标(尤其是adjusted_mutual_info_score)比纯度更可靠,因其不惩罚过度细分、抵抗簇数膨胀、对类别不平衡更鲁棒;纯度仅统计各簇多数类样本数,易在过细划分或极端不平衡时虚高,而AMI基于熵计算并减去随机期望值,下界为0、对少数类敏感、衡量整体统计依赖。

互信息指标(尤其是 adjusted_mutual_info_score)比纯度(purity)更可靠,根本原因在于:纯度不惩罚“过度细分”,而互信息类指标天然抵抗簇数量膨胀,且对类别不平衡更鲁棒。
纯度为什么容易高估聚类质量?
纯度只统计每个簇里“占多数”的真实类别的样本数,再求和归一化。它完全忽略以下事实:
- 把一个真实类别强行拆成 10 个簇,只要每个簇里仍以该类为主,纯度就几乎不变甚至升高
- 把所有样本各自分到独立簇,纯度直接变成 1.0 —— 这显然不是好聚类
- 当真实标签严重不平衡(比如 95% 是 A 类),纯度会严重偏向 A 类的覆盖率,掩盖对 B/C 类的误判
adjusted_mutual_info_score 怎么解决这个问题?
AMI 不是简单计数,而是基于联合分布与边缘分布的信息熵计算,并减去随机分配下的期望值。这意味着:
- 它有理论下界:完全随机聚类时
adjusted_mutual_info_score≈ 0,不会因簇多而虚高 - 它对少数类敏感:哪怕只错分了几个 B 类样本,也会在互信息中体现为联合概率下降,拉低得分
- 它不依赖“多数投票”逻辑,而是衡量整个标签系统的统计依赖强度
示例对比:
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
立即学习“Python免费学习笔记(深入)”;
from sklearn.metrics import purity_score, adjusted_mutual_info_score true = [0]*90 + [1]*10 pred_bad = list(range(100)) # 每个点一个簇 → 纯度=1.0,AMI≈0.0 pred_good = [0]*85 + [1]*15 # 少量错分 → 纯度=0.85,AMI≈0.32
什么时候必须用 AMI 而不是纯度?
当你需要满足以下任一条件时:
- 比较不同
n_clusters的模型(比如 K-Means 选 K) - 数据存在明显类别不平衡(如异常检测、长尾用户分群)
- 结果要用于论文或跨团队复现(AMI 是 scikit-learn 官方推荐的外部指标之一)
- 你担心业务方质疑“这个 0.92 的纯度是不是靠拆簇刷出来的?”
AMI 的代价是计算稍慢、解释性略弱于纯度——但它换来的,是真正可比、抗干扰、贴合信息论直觉的评估结论。这点开销,在模型选型阶段非常值得。

















