深度聚类中ARI、AMI以及ACC指标解析

ARI(Adjusted Rand Index)

调整兰德指数,用于度量聚类结果与真实类别之间的相似度。它考虑了随机分配的影响,值越大表示聚类结果与真实类别越相似。ARI的取值范围为-1到1,值越大表示聚类结果越好.

计算公式:

ARI = (sum_ij(C(n_ij, 2)) - [sum_i(C(a_i, 2)) * sum_j(C(b_j, 2)) / C(n, 2)]) / (1/2 * [sum_i(C(a_i, 2)) + sum_j(C(b_j, 2))] - [sum_i(C(a_i, 2)) * sum_j(C(b_j, 2)) / C(n, 2)])

其中,C(n, k)表示组合数,即从n个元素中选取k个元素的组合数。

其中,n_{ij}表示聚类结果中第 i 类与真实类别中第 j 类共同包含的样本数量,a_i 表示聚类结果中第 i 类的样本数量,b_j 表示真实类别中第 j 类的样本数量,n 表示总样本数。
实例:

样本序列 真实类别 聚类结果
1 A A
2 A C
3 A C
4 B C
5 B B
6 B C
7 C B
8 C B
9 C C

计算聚类结果中相同类别和不同类别的样本数量

  • 如果两个样本属于同一真实类别,同时也属于同一聚类结果,那么它们就是一个共现项,对应的共现矩阵中该项的值加1。
  • 如果两个样本属于同一真实类别,但属于不同的聚类结果,那么它们也是一个共现项,对应的共现矩阵中该项的值加1。
  • 如果两个样本属于不同的真实类别,但属于同一聚类结果,那么它们也是一个共现项,对应的共现矩阵中该项的值加1。
  • 如果两个样本属于不同的真实类别,且属于不同的聚类结果,那么它们不是一个共现项,对应的共现矩阵中该项的值不变。
A B C
A 1 0 2
B 0 1 2
C 0 2 1

接下来,我们需要计算每个类别的样本数量。根据真实类别和聚类结果的分布情况,可以得到:

  • 真实类别A有3个样本,聚类结果A有1个样本。
  • 真实类别B有2个样本,聚类结果B有2个样本。
  • 真实类别C有4个样本,聚类结果C有3个样本。

因此,我们可以得到每个类别的样本数量:

  • 省略
  • 省略
from sklearn import metrics
labels_true = ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C']
labels_pred = ['A', 'C', 'C', 'C', 'B', 'C', 'B', 'B', 'C']
ari = metrics.adjusted_rand_score(labels_true, labels_pred)
print("ARI: {:.3f}".format(ari))
ARI: -0.032

AMI(Adjusted Mutual Information)

调整互信息,用于度量聚类结果与真实类别之间的相似度。它考虑了随机分配和类别不平衡的影响,值越大表示聚类结果与真实类别越相似。AMI的取值范围为0到1,值越大表示聚类结果越好。
计算公式:

AMI = (MI - E[MI]) / (max(H(U), H(V)) - E[MI])

其中,MI表示互信息,H(U)H(V)分别表示聚类结果和真实类别的熵,E[MI]表示随机分配时的期望互信息。

其中,MI 表示聚类结果与真实类别之间的互信息,H(U) 和 H(V) 分别表示聚类结果和真实类别的熵,E[MI]` 表示随机分配时聚类结果与真实类别之间的期望互信息。

from sklearn.metrics import adjusted_mutual_info_score
labels_true = ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C']
labels_pred = ['A', 'C', 'C', 'C', 'B', 'C', 'B', 'B', 'C']
ami = adjusted_mutual_info_score(labels_true, labels_pred)
print("AMI: {:.3f}".format(ami))
AMI:, -0.001

ACC(Accuracy)

准确率,用于度量聚类结果中被正确分类的样本占总样本数的比例。它只考虑了样本分类是否正确,不考虑分类的精度和召回率。ACC的取值范围为0到1,值越大表示聚类结果越好。

计算公式:

ACC = sum_i(n_ii) / n

其中,n_ii表示聚类结果中第i类中被正确分类的样本数量,n表示总样本数。

其中,n_{ii} 表示聚类结果中第 i 类中被正确分类的样本数量,n 表示总样本数。

from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import accuracy_score
labels_true = ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'] # 原始标签
le = LabelEncoder() # 实例化 LabelEncoder
labels_true = le.fit_transform(labels_true) # 将标签转换为数字编码
labels_pred = ['A', 'C', 'C', 'C', 'B', 'C', 'B', 'B', 'C']  # 聚类结果 
labels_pred = le.transform(labels_pred) # 将聚类结果转换为数字编码
acc = accuracy_score(labels_true, labels_pred) # 计算ACC 
print(acc)  # 输出:0.3333333333333333

你可能感兴趣的:(聚类,机器学习,算法)