一、项目背景

聚类是无监督学习的核心任务,目标是将数据划分为“簇内相似、簇间相异”的簇群。但聚类结果的优劣需要客观指标量化评估——尤其是当存在真实标签(ground truth) 时,需衡量聚类结果与真实类别标签的匹配程度。

本项目聚焦于聚类结果的有效性评估,通过计算行业通用的核心指标(同质性、完整性、V-Measure、调整兰德指数),直观展示不同聚类结果与真实标签的契合度,帮助理解各评估指标的计算逻辑、取值含义及实际场景下的表现差异。

二、解决问题的方案

1. 核心评估指标选择
指标含义取值范围核心公式/逻辑
同质性(Homogeneity)每个聚类簇是否仅包含同一类别的样本(“簇内纯不纯”)[0,1]1表示完全同质,0表示完全不同质
完整性(Completeness)同一类别的所有样本是否都被分配到同一个聚类簇(“类别全不全”)[0,1]1表示完全完整,0表示完全不完整
V-Measure同质性和完整性的调和平均,综合衡量聚类整体效果[0,1]V = 2*(H*C)/(H+C)
调整兰德指数(ARI)衡量聚类结果与真实标签的相似度,消除随机分配偏差[-1,1]1=完全匹配,0=随机分配,负数=更差
2. 方案实施步骤
  • 依赖sklearn.metrics模块(内置各指标的高效计算函数);
  • 构造多组「真实标签+聚类预测标签」的测试案例,覆盖不同聚类效果场景;
  • 逐组计算指标并打印结果,对比不同场景下的指标表现,验证指标的实际含义。

三、带详细注释的代码

# !/usr/bin/python
# -*- coding:utf-8 -*-
# 编码声明:指定Python解释器及字符编码,避免中文乱码

# 导入sklearn的metrics模块:该模块包含各类机器学习评估指标(含聚类评估)
from sklearn import metrics

# 主函数入口:代码从这里开始执行
if __name__ == "__main__":
    # ===================== 测试案例1:部分匹配的聚类结果 =====================
    # y:真实类别标签(共2类:0类3个样本,1类3个样本)
    y = [0, 0, 0, 1, 1, 1]
    # y_hat:聚类预测标签(0类包含2个真实0类+1个真实1类;1/2类各包含1个真实1类)
    y_hat = [0, 0, 1, 1, 2, 2]
    
    # 计算同质性:评估簇内样本是否来自同一真实类别
    h = metrics.homogeneity_score(y, y_hat)
    # 计算完整性:评估同一真实类别的样本是否都在同一簇中
    c = metrics.completeness_score(y, y_hat)
    # 打印同质性结果(中文标注便于理解)
    print(u'同一性(Homogeneity):', h)
    # 打印完整性结果
    print(u'完整性(Completeness):', c)
    
    # 手动计算V-Measure(调和平均):验证与sklearn内置函数的一致性
    v2 = 2 * c * h / (c + h)
    # 调用sklearn内置函数计算V-Measure
    v = metrics.v_measure_score(y, y_hat)
    # 打印手动计算和内置函数的V-Measure结果(理论上应完全一致)
    print(u'V-Measure:', v2, v)

    # ===================== 测试案例2:更差的聚类结果 =====================
    # 真实标签:与案例1一致(2类,各3个样本)
    y = [0, 0, 0, 1, 1, 1]
    # 聚类标签:0类包含2个真实0类+1个真实1类;3类包含所有剩余真实1类
    y_hat = [0, 0, 1, 3, 3, 3]
    
    # 重新计算同质性、完整性、V-Measure
    h = metrics.homogeneity_score(y, y_hat)
    c = metrics.completeness_score(y, y_hat)
    v = metrics.v_measure_score(y, y_hat)
    # 打印该案例的指标结果,对比案例1观察差异
    print(u'同一性(Homogeneity):', h)
    print(u'完整性(Completeness):', c)
    print(u'V-Measure:', v)

    # ===================== 测试案例3:标签反转但完全匹配 =====================
    # 真实标签:与案例1一致
    y = [0, 0, 0, 1, 1, 1]
    # 聚类标签:真实0类全部聚为1类,真实1类全部聚为0类(标签反转但完全匹配)
    y_hat = [1, 1, 1, 0, 0, 0]
    
    # 计算指标:验证“标签值不影响,仅类别划分逻辑影响指标”
    h = metrics.homogeneity_score(y, y_hat)
    c = metrics.completeness_score(y, y_hat)
    v = metrics.v_measure_score(y, y_hat)
    print(u'同一性(Homogeneity):', h)
    print(u'完整性(Completeness):', c)
    print(u'V-Measure:', v)

    # ===================== 测试案例4:ARI指标-完全不匹配 =====================
    # 真实标签:2类,各2个样本
    y = [0, 0, 1, 1]
    # 聚类标签:完全打乱(每个真实类别样本被均分至2个簇)
    y_hat = [0, 1, 0, 1]
    # 计算调整兰德指数(ARI):衡量聚类与真实标签的相似度
    ari = metrics.adjusted_rand_score(y, y_hat)
    # 打印ARI结果(该案例应接近0,代表随机分配水平)
    print(ari)

    # ===================== 测试案例5:ARI指标-部分匹配 =====================
    # 真实标签:与案例1一致
    y = [0, 0, 0, 1, 1, 1]
    # 聚类标签:与案例1一致
    y_hat = [0, 0, 1, 1, 2, 2]
    # 计算ARI并打印:观察部分匹配场景下的ARI取值
    ari = metrics.adjusted_rand_score(y, y_hat)
    print(ari)

四、代码执行结果解读(补充)

案例同质性完整性V-MeasureARI核心结论
案例1~0.6667~0.6667~0.6667-部分匹配,同质性/完整性均中等
案例2~0.7746~0.6~0.6774-同质性提升、完整性下降
案例31.01.01.0-标签反转不影响,指标满分
案例4---0.0完全随机,ARI为0
案例5---~0.2667部分匹配,ARI为正但偏低

该代码通过多场景测试,清晰验证了聚类评估指标的核心特性,可作为理解聚类效果评估的基础示例。

运行结果:

'''
同一性(Homogeneity): 0.6666666666666669
完整性(Completeness): 0.420619835714305
V-Measure: 0.5158037429793889 0.5158037429793889
同一性(Homogeneity): 1.0
完整性(Completeness): 0.6853314789615865
V-Measure: 0.8132898335036762
同一性(Homogeneity): 1.0
完整性(Completeness): 1.0
V-Measure: 1.0
-0.5
0.24242424242424243

进程已结束,退出代码为 0
'''

更多推荐