• 카테고리

    질문 & 답변
  • 세부 분야

    딥러닝 · 머신러닝

  • 해결 여부

    미해결

선생님! 아래 코드가 잘 이해가 되지 않습니다.

22.08.26 13:37 작성 조회수 341

1

def cluster_acc(y_true, y_pred):

    y_true = np.array(y_true)
    y_pred = np.array(y_pred)

    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
    ind = linear_assignment(w.max() - w)
     return sum([w[i, j] for i, j in zip(ind[0], ind[1])]) * 1.0 / y_pred.size

위 코드 부분에서 이게 어떻게 cluster의 accuracy를 계산하는지 직관적으로 이해가 되지 않습니다.

제가 이해하기로는 y_true는 각 image의 label을 batchsize에 따라서 가져오니까 y_true는 (120, )의 tensor가 될 것이고, y_pred는 k_means를 통과한 값이 될 것입니다.

이런 식이겠죠

y_true = [0, 1, 1, 2, 3, 0, ...]

y_pred = [3, 4, 4, 5, 1, 3, ...]

계산을 하면 D = 10이 될 것이고, w는 10X10짜리 tensor가 될 것입니다.

이 때 for i in range(120):에서 위의 6 라벨이 들어왔다고 치면

W = [[0, 0, 2, 0, 0, 0, 0, 0, 0, 0]

[0, 0, 0, 2, 0, 0, 0, 0, 0, 0]

[0, 0, 0, 0, 1, 0, 0, 0, 0, 0]

[0, 1, 0, 0, 0, 0, 0, 0, 0, 0]

...]

이런 식으로 코딩이 될 것입니다.

그러면 이게

W.max()를 취하면 2가 나올테고,

w.max() - w

이 식은 [[2, 2, 0, 2, 2, ...], [2,2,2,0,2,...], [2,2,2,2,1,...],

[2,1,2,2,2,...]...] 이렇게 되고

여기에서 linear_assignment를 통과한다면

한 batch에서 정확도를 구할 수 있다는 것인데,

linear_assignment가 hungarian algorhythm을 통해서 bipartite한

graph에서의 정보를 처리한다데 이게 구체적으로 어떤 공식에 의해서

되는 것인지 잘 모르겠습니다..

매번 감사합니다.

답변 1

답변을 작성해보세요.

0

안녕하세요!

좋은 질문 감사합니다.

클러스터링은 데이터의 그룹을 나눠주는 역할만 하는 것이기 때문에 0은 0으로, 6은 6으로 매칭이 되지 않습니다. 따라서 정확도를 구하기 위해 매칭 분포를 나타내는 w 행렬를 구한 후 w를 기준으로 실제 라벨과 클러스터링 라벨이 가장 매칭이 잘 되도록 최적화 과정을 거치게 됩니다. 이 때 linear assignment를 사용합니다.

직관적인 이해를 위해 예를 들면 타겟 라벨이 0: 5개, 1: 3개, 2:1개 있고 예측 라벨이 0:3개, 1:5개, 2:1개라면 예측 라벨의 0->1, 1->0, 2->2 로 맞춰 진다고 생각하시면 됩니다.

이 방법은 최적화 문제 중 한 방법으로 딥러닝 학습하고는 다소 멀리 있는 내용입니다. 여기서 중요한 것은 "클러스터링은 정확히 라벨의 순서를 정해주지 않기 때문에 정확도 계산시 재배치가 필요하다."의 개념을 알고 가시는 것입니다. 수학 내용을 반드시 공부하셔야 한다면 아래 링크에 관련 방법론에 대한 내용과 참고문헌을 확인하실 수 있습니다.

https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.linear_sum_assignment.html

감사합니다 :)