调整兰德指数,用于度量聚类结果与真实类别之间的相似度。它考虑了随机分配的影响,值越大表示聚类结果与真实类别越相似。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 |
计算聚类结果中相同类别和不同类别的样本数量
A | B | C | |
---|---|---|---|
A | 1 | 0 | 2 |
B | 0 | 1 | 2 |
C | 0 | 2 | 1 |
接下来,我们需要计算每个类别的样本数量。根据真实类别和聚类结果的分布情况,可以得到:
因此,我们可以得到每个类别的样本数量:
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的取值范围为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的取值范围为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