掘金 人工智能 05月19日 11:53
你的聚类模型靠谱吗?5大外部指标彻底揭秘
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文介绍了聚类分析中常用的外部评估指标,用于评估聚类结果的质量。文章详细阐述了Jaccard系数、FM指数、Rand指数、DB指数和Dunn指数的定义、计算公式以及在scikit-learn库中的应用方法。通过代码示例,展示了如何使用这些指标来评估聚类算法的性能,帮助读者了解这些指标的优缺点和适用场景,从而更全面地评估聚类模型的表现。

🤝 Jaccard系数:衡量聚类结果与真实标签的相似性,通过计算两个集合交集与并集的比值实现。在scikit-learn中使用`jaccard_score`函数计算,关注类别内部样本的正确划分。

📊 FM指数:综合考虑了真正例(TP)、假正例(FP)和假负例(FN)的指标,通过计算精确率和召回率的几何平均值来衡量聚类结果的质量。在scikit-learn中使用`fowlkes_mallows_score`函数计算。

✅ Rand指数:衡量聚类结果与真实标签的一致性,通过计算样本对的分类一致性来评估聚类质量。在scikit-learn中使用`rand_score`函数计算,考虑了正确分类为同一类和不同类的样本对。

🔎 DB指数:衡量聚类结果内部一致性的指标,通过比较每个类别的紧致性和分离性来评估聚类质量。DB指数越小,表示聚类结果越好。在scikit-learn中使用`davies_bouldin_score`函数计算。

📈 Dunn指数:衡量聚类结果分离性和紧致性的指标,通过计算类内距离的最小值与类间距离的最大值的比值来评估聚类质量。Dunn指数越大,表示聚类结果越好。scikit-learn没有现成函数,但可根据公式自行封装。

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

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

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

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

1. Jaccard系数

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

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

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

假设我们有两个集合AABBJaccard 系数JJ可以表示为:

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

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

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

from sklearn.metrics import jaccard_scoreimport 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_labelspredicted_labels,试试不同的计算结果。

2. FM(Fowlkes-Mallows)指数

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

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

具体公式如下:

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

其中:

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

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+FN\text{Rand}=\frac{TP+TN}{TP+TN+FP+FN}

其中:

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

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=1ki=1kmaxji(σi+σjd(ci,cj))\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)

其中:

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


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

from sklearn.metrics import davies_bouldin_scorefrom sklearn.cluster import KMeansimport 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=minijd(ci,cj)maxiδ(ci)\text{Dunn}=\frac{\min_{i\neq j}d(c_i,c_j)}{\max_i\delta(c_i)}

其中:

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

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

from sklearn.cluster import KMeansimport 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 指数

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

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

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

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

聚类分析 外部指标 Jaccard系数 FM指数 Rand指数
相关文章