登录

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

雄霸天下风云起 Java技术

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

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

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

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

1. Jaccard系数

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

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

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

假设我们有两个集合AAA和BBB,Jaccard 系数JJJ可以表示为:

J(A,B)=∣A∩B∣∣A∪B∣J(A,B)=frac{|Acap B|}{|Acup B|}J(A,B)=∣A∪B∣∣A∩B∣

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

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

python 体验AI代码助手 代码解读复制代码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)的几何平均值来衡量聚类结果的质量。

具体公式如下:

FM=TPTP+FP×TPTP+FNtext{FM}=sqrt{frac{TP}{TP+FP}timesfrac{TP}{TP+FN}}FM=TP+FPTP×TP+FNTP

其中:


TPTPTP是正确分类的样本对数。

FPFPFP是错误分类为同一类的样本对数。

FNFNFN是应该在同一类但被分类到不同类的样本对数。


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

python 体验AI代码助手 代码解读复制代码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 指数定义为:

Rand=TP+TNTP+TN+FP+FNtext{Rand}=frac{TP+TN}{TP+TN+FP+FN}Rand=TP+TN+FP+FNTP+TN

其中:


TPTPTP是正确分类为同一类的样本对数。

TNTNTN是正确分类为不同类的样本对数。

FPFPFP是错误分类为同一类的样本对数。

FNFNFN是应该在同一类但被分类到不同类的样本对数。


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

python 体验AI代码助手 代码解读复制代码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 指数定义为:

DB=1k∑i=1kmax?j≠i(σi+σjd(ci,cj))text{DB}=frac{1}{k}sum_{i=1}^{k}max_{jneq i}left(frac{sigma_i+sigma_j}{d(c_i,c_j)}right)DB=k1∑i=1kmaxj?=i(d(ci,cj)σi+σj)

其中:


kkk是类别数量。

σisigma_iσi是类别iii的平均距离。

cic_ici是类别iii的中心。

d(ci,cj)d(c_i,c_j)d(ci,cj)是类别iii和类别jjj中心之间的距离。


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


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

python 体验AI代码助手 代码解读复制代码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 指数定义为:

Dunn=min?i≠jd(ci,cj)max?iδ(ci)text{Dunn}=frac{min_{ineq j}d(c_i,c_j)}{max_idelta(c_i)}Dunn=maxiδ(ci)mini?=jd(ci,cj)

其中:


d(ci,cj)d(c_i,c_j)d(ci,cj)是类别iii和类别jjj中心之间的距离。

δ(ci)delta(c_i)δ(ci)是类别iii内部的最大距离。


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

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

python 体验AI代码助手 代码解读复制代码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(https://www.co-ag.com)(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)https://www.co-ag.com/ np.max(intra_cluster_distances)



# 计算 Dunn 指数

dunn = dunn_index(X, predicted_labels)

print("Dunn 指数:", dunn)


6. 总结

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

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


有真实标签时:优先使用Adjusted Rand(平衡随机性)

无真实标签时:使用DB或Dunn

小规模数据:可计算所有指标综合判断


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


展开全文
打开APP,一键看同内容文章>

相关推荐

最新问答

查看更多问答
反馈