介绍:
聚类精确度(Cluster Accuracy,AC)用于比较获得标签和数据提供的真实标签:
A
C
=
∑
i
=
1
n
δ
(
s
i
,
m
a
p
(
r
i
)
)
N
AC = \frac{\sum_{i=1}^{n}\delta(s_i , map(r_i))}{N}
AC=N∑i=1nδ(si,map(ri))
其中:
r
i
r_i
ri为聚类后的标签。
s
i
s_i
si为真实标签。
n
n
n为数据总的个数。
δ
\delta
δ表示指示函数,具体如下:
δ
(
x
,
y
)
=
{
1
i
f
x
=
y
0
o
t
h
e
r
w
i
s
e
\delta(x,y) = \begin{cases} 1 & if x=y \\ 0 & otherwise \end{cases}
δ(x,y)={10ifx=yotherwise
而式中的map则表示最佳类标的重现分配,以确保统计的正确。一般的该最佳重分配可以通过匈牙利算法(Kuhn-Munkres or Hungarian Algorithm)实现,从而在多项式时间内求解该任务(标签)分配问题。
参考博客:[ML] 聚类评价指标
Python代码:
需要numpy和sklearn库。利用sklearn调用匈牙利算法
也可以直接调用scikit-learn库中的函数来计算metrics.accuracy_score(y_true, y_pred)
import numpy as np
from sklearn import metrics
def acc(y_true, y_pred):
"""
Calculate clustering accuracy. Require scikit-learn installed
# Arguments
y: true labels, numpy.array with shape `(n_samples,)`
y_pred: predicted labels, numpy.array with shape `(n_samples,)`
# Return
accuracy, in [0,1]
"""
y_true = y_true.astype(np.int64)
assert y_pred.size == y_true.size
D = max(y_pred.max(), y_true.max()) + 1
w = np.zeros((D, D), dtype=np.int64)
for i in range(y_pred.size):
w[y_pred[i], y_true[i]] += 1
from sklearn.utils.linear_assignment_ import linear_assignment
ind = linear_assignment(w.max() - w)
return sum([w[i, j] for i, j in ind]) * 1.0 / y_pred.size
if __name__ == '__main__':
# A为真实值、B,C,D为等效果的预测值 即: func(A,B)=func(A,C); func(B,D)=func(C,D);
A = np.array([1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3])
B = np.array([1, 2, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 1, 1, 3, 3, 3])
C = np.array([2, 1, 2, 2, 2, 2, 2, 1, 1, 1, 1, 3, 2, 2, 3, 3, 3]) # 将B中的 1 与 2 互换
D = np.array([1, 3, 1, 1, 1, 1, 1, 3, 3, 3, 3, 2, 1, 1, 2, 2, 2]) # 将B中的 2 与 3 互换
# 测试
print(acc(A, B)) # 0.7058823529411765
print(acc(A, C)) # 0.7058823529411765
print(metrics.accuracy_score(A, B)) # 0.7058823529411765
print(acc(B, D)) # 1.0
print(acc(C, D)) # 1.0