聚类精确度(Cluster Accuracy)

介绍:

聚类精确度(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=Ni=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

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
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页