你的聚类模型靠谱吗?5大外部指标彻底揭秘

在聚类分析中,我们常常需要评估聚类结果的质量。

外部指标是一种通过与已知的"真实标签"进行比较来评估聚类性能的方法。

这些指标可以帮助我们判断聚类算法是否能够准确地将数据划分为有意义的类别。

本文将介绍几种常见的外部指标,包括 Jaccard 系数 、FM 指数 、Rand 指数 、DB 指数 和 Dunn 指数 ,并通过代码示例展示如何基于scikit-learn库来计算它们。

1. Jaccard系数

Jaccard 系数 是一种衡量两个集合相似度的指标,在聚类评估中,它用于比较聚类结果与真实标签之间的相似性。

具体来说,Jaccard 系数定义为两个集合的交集大小与并集大小的比值。

对于聚类结果,它关注的是每个类别内部的样本是否正确划分。

假设我们有两个集合 A \\(和\\) B \\(,\*\*Jaccard 系数\*\*\\) J 可以表示为:

J(A,B)=\\frac{\|A\\cap B\|}{\|A\\cup B\|}

在聚类评估中,我们通常计算所有类别对的** Jaccard 系数的平均值**,以得到整体的相似度。

Jaccard 系数 在scikit-learn库中已经封装好,使用方式如下:

python 复制代码
from sklearn.metrics import jaccard_score
import numpy as np

# 真实标签和聚类结果
true_labels = np.array([0, 0, 1, 1, 2, 2])
predicted_labels = np.array([0, 0, 1, 1, 2, 2])

# 计算 Jaccard 系数
jaccard = jaccard_score(true_labels, predicted_labels, average="macro")
print("Jaccard 系数:", jaccard)

可以调节上面的true_labels和predicted_labels,试试不同的计算结果。

2. FM(Fowlkes-Mallows)指数

FM 指数 是一种综合考虑了真正例 (TP)、假正例 (FP)和假负例 (FN)的指标。

它通过计算精确率 (Precision)和召回率 (Recall)的几何平均值来衡量聚类结果的质量。

具体公式如下:

\\text{FM}=\\sqrt{\\frac{TP}{TP+FP}\\times\\frac{TP}{TP+FN}}

其中:

  • TP 是正确分类的样本对数。
  • FP 是错误分类为同一类的样本对数。
  • FN 是应该在同一类但被分类到不同类的样本对数。

FM 系数 在scikit-learn库中已经封装好,使用方式如下:

python 复制代码
from sklearn.metrics import fowlkes_mallows_score

# 真实标签和聚类结果
true_labels = np.array([0, 0, 1, 1, 2, 2])
predicted_labels = np.array([0, 0, 1, 1, 2, 2])

# 计算 FM 指数
fm = fowlkes_mallows_score(true_labels, predicted_labels)
print("FM 指数:", fm)

3. Rand指数

Rand 指数是一种衡量聚类结果与真实标签一致性的指标,它通过计算样本对的分类一致性来评估聚类质量。

具体来说,Rand 指数定义为:

\\text{Rand}=\\frac{TP+TN}{TP+TN+FP+FN}

其中:

  • TP 是正确分类为同一类的样本对数。
  • TN 是正确分类为不同类的样本对数。
  • FP 是错误分类为同一类的样本对数。
  • FN 是应该在同一类但被分类到不同类的样本对数。

Rand 指数 在scikit-learn库中已经封装好,使用方式如下:

python 复制代码
from sklearn.metrics import rand_score

# 真实标签和聚类结果
true_labels = np.array([0, 0, 1, 1, 2, 2])
predicted_labels = np.array([0, 0, 1, 1, 2, 2])

# 计算 Rand 指数
rand = rand_score(true_labels, predicted_labels)
print("Rand 指数:", rand)

4. DB(Davies-Bouldin)指数

DB 指数是一种衡量聚类结果内部一致性的指标,但它也可以用于外部评估。

DB 指数通过比较每个类别的紧致性和分离性来评估聚类质量。

具体来说,DB 指数定义为:

\\text{DB}=\\frac{1}{k}\\sum_{i=1}\^{k}\\max_{j\\neq i}\\left(\\frac{\\sigma_i+\\sigma_j}{d(c_i,c_j)}\\right)

其中:

  • k 是类别数量。
  • \\sigma_i \\(是类别\\) i 的平均距离。
  • c_i \\(是类别\\) i 的中心。
  • d(c_i,c_j) \\(是类别\\) i \\(和类别\\) j 中心之间的距离。

DB 指数越小,表示聚类结果越好。


DB 指数 在scikit-learn库中已经封装好,使用方式如下:

python 复制代码
from sklearn.metrics import davies_bouldin_score
from sklearn.cluster import KMeans
import numpy as np

# 生成数据
X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])

# 使用 KMeans 进行聚类
kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
predicted_labels = kmeans.labels_

# 计算 DB 指数
db = davies_bouldin_score(X, predicted_labels)
print("DB 指数:", db)

5. Dunn指数

Dunn 指数是一种衡量聚类结果分离性和紧致性的指标。

它通过计算类内距离的最小值与类间距离的最大值的比值来评估聚类质量。

具体来说,Dunn 指数定义为:

\\text{Dunn}=\\frac{\\min_{i\\neq j}d(c_i,c_j)}{\\max_i\\delta(c_i)}

其中:

  • d(c_i,c_j) \\(是类别\\) i \\(和类别\\) j 中心之间的距离。
  • \\delta(c_i) \\(是类别\\) i 内部的最大距离。

Dunn 指数越大,表示聚类结果越好。

Dunn 指数 在scikit-learn库中没有现成的函数,不过,根据它的公式封装一个也很简单:

python 复制代码
from sklearn.cluster import KMeans
import numpy as np

# 生成数据
X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])

# 使用 KMeans 进行聚类
kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
predicted_labels = kmeans.labels_


# 计算 Dunn 指数
def dunn_index(X, labels):
    n_clusters = len(set(labels))
    inter_cluster_distances = []
    intra_cluster_distances = []

    for i in range(n_clusters):
        cluster_points = X[labels == i]
        intra_cluster_distances.append(
            np.max(
                np.linalg.norm(cluster_points - np.mean(cluster_points, axis=0), axis=1)
            )
        )
        for j in range(i + 1, n_clusters):
            other_cluster_points = X[labels == j]
            inter_cluster_distances.append(
                np.min(
                    np.linalg.norm(
                        cluster_points[:, np.newaxis] - other_cluster_points, axis=2
                    )
                )
            )

    return np.min(inter_cluster_distances) / np.max(intra_cluster_distances)


# 计算 Dunn 指数
dunn = dunn_index(X, predicted_labels)
print("Dunn 指数:", dunn)

6. 总结

本文介绍了几种常见的聚类性能外部评估指标,包括 Jaccard 系数 、FM 指数 、Rand 指数 、DB 指数 和 Dunn 指数。

这些指标各有优缺点,适用于不同的场景,使用时,建议:

  1. 有真实标签时 :优先使用Adjusted Rand(平衡随机性)
  2. 无真实标签时 :使用DB或Dunn
  3. 小规模数据:可计算所有指标综合判断

通过灵活组合这些指标,可以全面评估聚类模型的表现!

相关推荐
紧跟先前的步伐13 分钟前
# Go AI Agent 实战 21|多工具选择、参数校验与工具执行安全
人工智能·ai·golang
香蕉大香蕉(06敬畏市场)20 分钟前
高频八股 · JVM(7):方法区、元空间与字符串常量池
java·jvm·ai·博客·八股·大厂实习
又过二十26 分钟前
Qwen-Image2.1游戏素材工坊:让角色真的走起来(三)
ai·aigc·comfyui·game·qwen-image
dawnsky.liu9 小时前
在 RHEL 中使用 goose 实现远程主机管理
linux·运维·ai
在世修行9 小时前
智学文枢:变式题生成引擎
python·ai·pyside·题目生成
Industio_触觉智能10 小时前
把NPU检测直接嵌进采集终端|RK3576 AI采集终端全链路拆解教程-下
嵌入式硬件·ai·硬件架构·npu·ai视觉·rk3576·采集终端
汤姆宝库13 小时前
安全深拆:越狱物理、注入攻击与纵深防御
人工智能·安全·机器学习·ai
康燕13 小时前
2026 AI 时代研发流程重构:一份 AI4SE 日常节奏清单 + 新 SWOT 自检框架
ai·ai提效·ai4se·ai超级个体
GJGCY14 小时前
金融AI Agent厂商怎么选?系统集成、API/RPA、权限审计与异常恢复能力评估
人工智能·经验分享·ai·金融·智能体