归一化互信息(Normalized Mutual Information, NMI)是一种衡量两个聚类结果相似度的指标。它基于互信息(Mutual Information, MI)的概念,通过归一化处理,将结果的取值范围限定在0(无互信息)到1(完美相关)之间。在计算NMI时,互信息会被两个标签集合的熵的某种广义平均数所归一化,这个过程由参数average_method
定义。需要注意的是,这种度量方法并没有对偶然性进行调整,因此,在某些情况下,可能更倾向于使用调整后的互信息评分(Adjusted Mutual Information Score)。
NMI评分不受标签绝对值的影响,即对类别或聚类标签值的排列不会以任何方式改变评分值。此外,这种度量方法是对称的:交换label_true
和label_pred
会返回相同的评分值。这在衡量两个独立的标签分配策略在同一数据集上的一致性时非常有用,尤其是在真实基准未知的情况下。
在sklearn库中,NMI评分的计算可以通过normalized_mutual_info_score
函数实现。该函数接受两个参数:真实的标签集合labels_true
和预测的标签集合labels_pred
。此外,还可以指定average_method
参数来选择如何计算分母中的归一化因子。可选的average_method
包括'min'、'geometric'、'arithmetic'和'max',默认值为'arithmetic'。
从版本0.20开始,average_method
的默认值从'geometric'更改为'arithmetic'。函数返回的是一个介于0.0和1.0之间的浮点数,表示归一化的nats(基于自然对数)。1.0表示完全一致的标记。
在实际应用中,如果两个聚类结果完全一致,即每个类别的成员都完全分布在同一个聚类中,那么NMI评分将为1.0。例如,以下代码展示了两个完全一致的聚类结果:
from sklearn.metrics.cluster import normalized_mutual_info_score
# 完全一致的聚类结果
nmi_score = normalized_mutual_info_score([0, 0, 1, 1], [0, 0, 1, 1])
print(nmi_score) # 输出: 1.0
# 交换聚类标签,NMI评分仍然为1.0
nmi_score = normalized_mutual_info_score([0, 0, 1, 1], [1, 1, 0, 0])
print(nmi_score) # 输出: 1.0
相反,如果类别成员完全分散在不同的聚类中,那么分配结果将完全不一致,此时NMI评分将为0.0。例如:
# 类别成员完全分散在不同的聚类中
nmi_score = normalized_mutual_info_score([0, 0, 0, 0], [0, 1, 2, 3])
print(nmi_score) # 输出: 0.0
除了NMI评分,还可以参考其他聚类评估指标,如V-Measure(NMI的算术平均数选项)、调整后的Rand指数(Adjusted Rand Index)和调整后的互信息评分(Adjusted Mutual Information Score)。这些指标在评估聚类性能时,可能会提供不同的视角和见解。