랜드 인덱스 계산


17

클러스터 알고리즘의 랜드 인덱스를 계산하는 방법을 알아 내려고 노력하고 있지만 참과 거짓 부정을 계산하는 방법에 갇혀 있습니다.

현재 저는 정보 검색에 대한 소개 (Manning, Raghavan & Schütze, 2009) 책의 예를 사용하고 있습니다. 359 페이지에서 Rand 지수를 계산하는 방법에 대해 설명합니다. 이 예에서는 3 개의 클러스터를 사용하며 클러스터에는 다음 객체가 포함되어 있습니다.

  1. aaaaab
  2. abbbbc
  3. 비속

나는 객체를 대체합니다 (일반 기호는 글자로 표시되지만 아이디어와 개수는 동일하게 유지됩니다). 나는 그들이 말하는 내용을보기 위해이 책에서 정확한 단어를 줄 것이다.

먼저 TP + FP를 계산합니다. 세 개의 군집에는 각각 6, 6 및 5 개의 점이 포함되므로 동일한 군집에있는 총 "양수"또는 문서 쌍의 수는 다음과 같습니다.

TP + FP = (62) + (62) + (52) = 15 + 15+ 10 = 40

이 중 클러스터 1의 a 쌍, 클러스터 2의 b 쌍, 클러스터 3의 c 쌍 및 클러스터 3의 a 쌍은 다음과 같습니다.

TP = (52) + (42) + (32) + (22) = 10 + 6 + 3 + 1 = 20

따라서 FP = 40-20 = 20입니다.

여기까지 계산이 명확하고 다른 예제를 사용하면 동일한 결과를 얻을 수 있지만 거짓 부정 및 참 부정 Manning et al. 다음을 진술하십시오 :

FN과 TN도 비슷하게 계산되어 다음과 같은 우발성 테이블이 생성됩니다.

우발 사태 표는 다음과 같습니다.

+--------+--------+
| TP: 20 | FN: 24 |
+--------+--------+
| FP: 20 | TN: 72 |
+--------+--------+

"FN과 TN은 비슷하게 계산된다"는 문장은 명확하지 않으며 TN과 FN을 계산하는 데 필요한 숫자를 이해하지 못합니다. 다음을 수행하여 테이블의 오른쪽을 계산할 수 있습니다.

TP + FP + FN + TN = = = 136(n2)(172)

출처 : http://en.wikipedia.org/wiki/Rand_index

따라서 FN + TN = 136-TP + FP = 136-40 = 96이지만 변수를 개별적으로 계산하는 방법을 알아내는 데 실제로 도움이되지는 않습니다. 특히 저자가 "FN과 TN은 비슷하게 계산된다"고 말할 때. 어떻게 보지 못합니다. 또한 다른 예제를 볼 때 각 쌍을 보면서 우발성 테이블의 각 셀을 계산합니다.

예를 들면 다음과 같습니다. http://www.otlet-institute.org/wikics/Clustering_Problems.html#toc-Subsection-4.1

Manning et al. (2009)의 예를 기반으로 한 첫 번째 질문은 TP 및 NP 만 알고 있으면 TN 및 FN을 계산할 수 있습니까? 그렇다면 주어진 예제를 기준으로 유사한 계산이 어떻게 표시됩니까?

답변:


9

나는 똑같은 생각을하고 있었고, 나는 이것을 이렇게 해결했다. 행이 기본 진리 클러스터이고 열이 클러스터링 알고리즘에 의해 발견 된 클러스터 인 동시 발생 행렬 / 비 상표 테이블이 있다고 가정하십시오.

따라서이 책의 ​​예를 들면 다음과 같습니다.

  | 1 | 2 | 3
--+---+---+---
x | 5 | 1 | 2
--+---+---+---
o | 1 | 4 | 0
--+---+---+---
◊ | 0 | 1 | 3

이제 열당 합계를 취하고 모든 값에서 '2를 선택'하면 TP + FP를 매우 쉽게 계산할 수 있습니다. 따라서 합은 [6, 6, 5]이며 '6 choose 2'+ '6 choose 2'+ '5 choose 2'를 수행합니다.

실제로, 마찬가지로, 행에 대한 합계 (위의 예에서 [8, 5, 4])를 취하여 TP + FN을 구하고 모든 값에 대해 '2를 선택'하고 그 합.

TP 자체는 행렬의 모든 셀에 'choose 2'를 적용하고 모든 값의 합을 취하여 계산할 수 있습니다 ( '1 choose 2'가 0이라고 가정).

실제로 다음은 정확히 수행하는 일부 Python 코드입니다.

import numpy as np
from scipy.misc import comb

# There is a comb function for Python which does 'n choose k'                                                                                            
# only you can't apply it to an array right away                                                                                                         
# So here we vectorize it...                                                                                                                             
def myComb(a,b):
  return comb(a,b,exact=True)

vComb = np.vectorize(myComb)

def get_tp_fp_tn_fn(cooccurrence_matrix):
  tp_plus_fp = vComb(cooccurrence_matrix.sum(0, dtype=int),2).sum()
  tp_plus_fn = vComb(cooccurrence_matrix.sum(1, dtype=int),2).sum()
  tp = vComb(cooccurrence_matrix.astype(int), 2).sum()
  fp = tp_plus_fp - tp
  fn = tp_plus_fn - tp
  tn = comb(cooccurrence_matrix.sum(), 2) - tp - fp - fn

  return [tp, fp, tn, fn]

if __name__ == "__main__":
  # The co-occurrence matrix from example from                                                                                                           
  # An Introduction into Information Retrieval (Manning, Raghavan & Schutze, 2009)                                                                       
  # also available on:                                                                                                                                   
  # http://nlp.stanford.edu/IR-book/html/htmledition/evaluation-of-clustering-1.html                                                                     
  #                                                                                                                                                      
  cooccurrence_matrix = np.array([[ 5,  1,  2], [ 1,  4,  0], [ 0,  1,  3]])

  # Get the stats                                                                                                                                        
  tp, fp, tn, fn = get_tp_fp_tn_fn(cooccurrence_matrix)

  print "TP: %d, FP: %d, TN: %d, FN: %d" % (tp, fp, tn, fn)

  # Print the measures:                                                                                                                                  
  print "Rand index: %f" % (float(tp + tn) / (tp + fp + fn + tn))

  precision = float(tp) / (tp + fp)
  recall = float(tp) / (tp + fn)

  print "Precision : %f" % precision
  print "Recall    : %f" % recall
  print "F1        : %f" % ((2.0 * precision * recall) / (precision + recall))

내가 그것을 실행하면 나는 얻는다 :

$ python testCode.py
TP: 20, FP: 20, TN: 72, FN: 24
Rand index: 0.676471
Precision : 0.500000
Recall    : 0.454545
F1        : 0.476190

실제로이 예제 이외의 다른 예제는 확인하지 않았으므로 올바르게 수행했으면 좋겠습니다 .... ;-)


답을 위해 타이하지만 당신은 설명하지 않습니다. 두 번 열을 기반으로 말합니다. 당신은 당신의 대답을 업데이트하고 FP + TP처럼 FN + TN을 포함 할 수 있습니다
MonsterMMORPG

TP '2 choose 2'에 대한 이유를 이해하지 못했습니다. x가 ◊로 잘못 분류되었다는 의미는 아닙니까?
vcosk

TP + FN에 대해 "행에 대한 합계"를 의미하지 않습니까?
zython

죄송합니다. 네 말이 맞습니다. 답변에서 수정했습니다.
Tom

6

이 스레드에서 다른 답변을 연구 한 후 배열을 입력으로 사용하는 Python 구현은 sklearn다음과 같습니다.

import numpy as np
from scipy.misc import comb

def rand_index_score(clusters, classes):

    tp_plus_fp = comb(np.bincount(clusters), 2).sum()
    tp_plus_fn = comb(np.bincount(classes), 2).sum()
    A = np.c_[(clusters, classes)]
    tp = sum(comb(np.bincount(A[A[:, 0] == i, 1]), 2).sum()
             for i in set(clusters))
    fp = tp_plus_fp - tp
    fn = tp_plus_fn - tp
    tn = comb(len(A), 2) - tp - fp - fn
    return (tp + tn) / (tp + fp + fn + tn)

In [319]: clusters
Out[319]: [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2]

In [320]: classes
Out[320]: [0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 2, 1, 0, 2, 2, 2, 0]

In [321]: rand_index_score(clusters, classes)
Out[321]: 0.67647058823529416

4

나는 확실하지 않지만 이것이 TN 값을 수행 한 방법입니다.
TN = (7 2) (10 2) (4 2)

(7 2) – 클러스터 1 – 테스트에 'x'가 표시되므로 x가 아닌 (클러스터 2 및 3에서 올바르게 클러스터링 된) 수를 계산하십시오.

즉 4 'o 's + 3'd' s (다이아몬드) = (7 2)

(10 2) – 클러스터 2, 클러스터 1과 3에서 'o'가 아니고 올바르게 클러스터 된 클러스터를 세

즉 5 'x'+ (2'x '+ 3'd') = (10 2)

(4 2) – 군집 3, 군집 1 및 2에 올바르게 군집 된 'x'및 NOT 'd'(다이아몬드 모양의 요소)가 아닌 것을 세십시오.

즉, 클러스터 2에 4 'o'가 있습니다. = (4 2)

TN = (7 2) + (10 2) + (4 2) = 72.

그런 다음 FN은 다음과 같습니다.

FN = (17 2)-(TP + FP)-TN = 136-40-72 = 24. ---> (17 = 총 문서 수)


이 책이 말하고 질문에서 언급하는 것처럼 "FN과 TN이 어떻게 비슷하게 계산되는지"는 실제로 보여주지는 않지만, 이것은 나에게 가장 적합한 대답입니다. 아마도 클러스터 / 클래스 전환 전략 힌트를 언급 한 답변과 같이 더 간단한 방법이있을 것으로 생각됩니다.
cjauvin

이 설명은 다른 예제에서는 작동하지 않습니다. 내 공감대를 돌려줘! 정답은 @ user9668입니다.
Özgür

이 답변은 실제로 완벽하게 이해됩니다.
EhsanF

2

다른 질문의 예를 들면 :

  | 1 | 2 | 3
--+---+---+---
x | 5 | 1 | 2
--+---+---+---
o | 1 | 4 | 0
--+---+---+---
◊ | 0 | 1 | 3

FN에 대한 합리적인 답변 :

FN = (c(8,2)-c(5,2)-c(2,2))+(c(5,2)-c(4,2))+(c(4,2)-c(3,2))=24  

설명:

  • (c (8,2) -c (5,2) -c (2,2))

    'x'에 대해 8에서 2를 선택합니다 (a) 동일한 군집에서 동일한 클래스의 조합 (군집 1의 경우 c (5,2) 및 군집 3의 경우 c (2,2))

  • (c (5,2) -c (4,2))

    같은 클러스터에서 같은 클래스의 조합을 뺀 5 'o'(b)에서 2를 선택하십시오 (클러스터 2의 경우 c (4,2))

  • (c (4,2) -c (3,2)

    동일한 클러스터에서 동일한 클래스의 조합을 뺀 '◇'(c)에 대해 4에서 2를 선택하십시오 (클러스터 3에 대해 c (3,2)).

나는 이것을 이렇게 파생시켰다.


1

R에 이것을 구현하여 설명합니다.

TP (코드에서 a)는 모든 셀의 합계입니다. 2를 선택하십시오. 원래 질문에 따라 (0 또는 1은 2와 0을 선택하십시오)

FN (b)는 각 행 선택 2의 합계이며 모두 합산되고 TP는 적습니다. 여기서 각 행 합계는 각 True 클래스의 문서 수를 나타냅니다.

이 합계는 유사하고 동일한 클러스터 (TP)에있는 모든 문서와 유사하고 동일 클러스터 (FN)에없는 모든 문서입니다.

그래서 이것은 (TP + FN)입니다-TP = FN

FP (c)는 유사하게 계산된다. 각 열의 합은 모두 합산 된 TP를 2로 선택합니다. 이 경우 각 열 합계는 각 클러스터의 문서 수를 나타냅니다.

따라서이 합계는 유사하고 동일한 클러스터 (TP)에있는 모든 문서와 유사하지 않고 동일한 클러스터 (FP)에있는 모든 문서입니다.

그래서 이것은 (TP + FP)입니다-TP = FP

이 3 개의 계산으로 TN의 나머지 계산은 간단합니다. 표의 합계는 2, 적은 TP, FP 및 FN = TN (d)을 선택합니다.

이 방법으로 가지고있는 유일한 쿼리는 TP의 정의입니다. 이 질문에서 용어를 사용하면 클러스터 3의 2 a가 TP로 간주되는 이유를 이해할 수 없습니다. 나는 여기와 관련 교과서에서 이것을 발견했다. 그러나 TP 계산이 정확하다는 가정하에 계산을 이해합니다.

도움이 되었기를 바랍니다

FMeasure = function (x, y, beta) 
{
  x <- as.vector(x)
  y <- as.vector(y)
  if (length(x) != length(y)) 
    stop("arguments must be vectors of the same length")
  tab <- table(x, y)
  if (all(dim(tab) == c(1, 1))) 
    return(1)
  a <- sum(choose(tab, 2))
  b <- sum(choose(rowSums(tab), 2)) - a
  c <- sum(choose(colSums(tab), 2)) - a
  d <- choose(sum(tab), 2) - a - b - c
  ## Precision
  P = a / (a + c)
  ## Recall
  R = a / (a + b)
  ##F-Measure
  Fm <- (beta^2 + 1) * P * R / (beta^2*P + R)
  return(Fm)
}

이것은 매우 유행입니다. 델, 행, 열은 무엇을 의미합니까?
Özgür

왜 랜드 통계를 유행이라고 묘사하는지 잘 모르겠습니다. 셀, 행 및 열은 혼동 행렬의 셀 행 및 열을 나타냅니다. OP의 질문에 따라.
SamPassmore

글쎄, 원래 질문에 혼란 매트릭스가 없기 때문에? 그리고 어디에서도 혼동 행렬이라고 언급하지 않았습니다. 위의 첫 번째 대답에 있고 일단 사용되면 네 방법이 효과가있는 것 같습니다.
Özgür

0

TN과 FN을 같은 방식으로 계산할 수 있습니다.

레이블클러스터 의 역할 만 전환하면 됩니다 .

a) 1 1 1 1 1 2 3 3
b) 1 2 2 2 2
c) 2 3 3 3 3

... 그리고 같은 계산을 수행합니다.


좀 더 명확하게 할 수 있습니까? 또한 17 개의 항목이 있어야하므로 목록에 3 개가 더 있습니다 (c).
cjauvin

매우 불분명 한 답변
MonsterMMORPG

0

나는 그것으로부터 거짓 부정 (FN)을 리버스 엔지니어링했다고 생각합니다. 진정한 긍정을 위해, 당신은 긍정적 인 4 개의 그룹을 만들었습니다. 클러스터 1에서 5 개의 a를 가졌습니다. 군집 2에서, 당신은 4 개의 b를 가졌습니다; 군집 3에서 당신은 3 c와 2 a를 가졌습니다.

따라서 잘못된 부정의 경우.

  1. 클러스터 1에서 a로 시작하십시오. 클러스터 1에는 5가 올바르게 배치되어 있습니다. 클러스터 2에는 1이 a이고 클러스터 3에는 2가 있습니다. (5 1)과 (5 2)를 제공합니다.
  2. 그런 다음 b를 위해. 앞서 계산 한 4 개의 정확하게 배치 된 b가 있습니다. 클러스터 1에 하나의 거짓 b가 있으며 그게 다입니다. 그것은 당신에게 (4 1) b를 제공합니다.
  3. 그런 다음 c를 위해. 클러스터 2에는 하나의 잘못된 c가 있고 클러스터 3에는 세 개의 올바른 c가 있으므로 (3 1)이 있습니다.
  4. 그 후에, 우리는 우리가 진정한 긍정적이라고 부르는 클러스터 3의 a 쌍을 잊을 수 없습니다. 따라서, 클러스터 2에 1 개의 거짓 a가 있습니다. 클러스터 1에 다른 a가 있더라도 너무 많기 때문에 거짓 a라고 부를 수 없습니다.

따라서 (5 1) + (5 2) + (4 1) + (3 1) + (2 1)은 5 + 10 + 4 + 3 + 2 = 24와 같습니다. 그냥 당신이 이미 참 (TN)을 얻기 위해 찾은 136에서 빼기.


0

빼기없이 랜드 인덱스에 대한 모든 메트릭을 계산하는 방법은 다음과 같습니다.

이해를 돕기위한 참고 사항 :

1) 랜드 인덱스는 요소 쌍을 비교하는 것을 기반으로합니다. 이론에 따르면 유사한 요소 쌍은 동일한 군집에 배치해야하고 다른 요소 쌍은 별도의 군집에 배치해야합니다.

2) RI는 군집 수의 차이에 신경 쓰지 않습니다. True / False 요소 쌍에만 관심이 있습니다.

이 가정을 기반으로 Rand Index가 계산됩니다.

여기에 이미지 설명을 입력하십시오

자, 여기 우리의 예가 있습니다 :

  | 1 | 2 | 3
--+---+---+---
x | 5 | 1 | 2
--+---+---+---
o | 1 | 4 | 0
--+---+---+---
◊ | 0 | 1 | 3

분모에는 총 가능한 쌍이 있습니다. (17 2) = 136

이제 더 나은 이해를 위해 모든 메트릭을 계산할 수 있습니다.

A) 하자 쉬운 시작 , ( 진정한 긍정적 또는 올바른 유사 )

즉, 예측과 실제 레이블이 함께 배치 된 가능한 모든 요소 쌍을 찾아야합니다. 그리드 예제에서 그것은 각 셀 내에서 가능한 쌍의 합을 얻는 것을 의미합니다.

a = (5 2) + (1 2) + (2 2) + (1 2) + (4 2) + (0 2) + (0 2) + (1 2) + (3 2) = 
  = 10 + 0 + 1 + 0 + 6 + 0 + 0 + 0 + 3 = 20

C) 이제 c를 해 봅시다 ( 거짓 긍정 또는 틀린 상이 )

우리가 함께 배치했지만 다른 클러스터에 있어야하는 모든 쌍을 찾으십시오. 그리드 예제에서 그것은 두 개의 수평 셀 사이에서 가능한 모든 쌍을 찾습니다.

c = 5*1 + 5*2 + 1*2 + 
  + 1*4 + 1*0 + 4*0 + 
  + 0*1 + 0*3 + 1*3 = 
  = 5 + 10 + 2 + 4 + 0 + 0 + 0 + 0 + 3 = 24

D) 계산 d ( 거짓 부정적 이거나 틀린 유사 함 ) 이것은 다른 군집에 배치되었지만 함께 있어야하는 모든 쌍을 찾습니다. 그리드 예에서 두 개의 수직 셀 사이에서 가능한 모든 쌍을 찾으십시오.

d = 5*1 + 5*0 + 1*0 + 
  + 1*4 + 1*1 + 4*1 + 
  + 2*0 + 2*3 + 0*3 = 
  = 5 + 0 + 0 + 4 + 1 + 4 + 0 + 6 + 0 = 20

B) 그리고 마지막으로 b ( True Negatives 또는 정확한 이기종 ) 하자

즉, 다른 클러스터에 배치 된 모든 쌍을 찾고 다른 클러스터에도 있어야합니다. 그리드에서, 그것은 두 개의 수직이 아닌 셀과 수평이 아닌 셀 사이에서 가능한 모든 쌍을 찾습니다.

다음은 내가 의미하는 바를 더 잘 이해하기 위해 어떤 숫자를 곱해야 하는가입니다.

d = x1*o2 + x1*o3 + x1*◊2 + x1*◊3 + 
  + x2*o1 + x2*o3 + x2*◊1 + x2*◊3 + 
  + x3*o1 + x3*o2 + x3*◊1 + x3*◊2 + 
  + o1*◊2 + o1*◊3 + 
  + o2*◊1 + o2*◊3 + 
  + o3*◊1 + o3*◊2

숫자로 :

d = 5*4 + 5*0 + 5*1 + 5*3 + 
  + 1*1 + 1*0 + 1*0 + 1*3 + 
  + 2*1 + 2*4 + 2*0 + 2*1 + 
  + 1*1 + 1*3 +
  + 4*0 + 4*3 = 72

그리고 결국 랜드 인덱스는 같습니다 : (20 + 72) / 136 = 0.676


0

아래는 귀하의 질문을 설명하는 그림입니다.

랜드 인덱스 질문

이 문제를 해결하려면 다음 매트릭스를 고려해야합니다.

+--------------------------------+--------------------------------------+
| TP:                            | FN:                                  |
| Same class + same cluster      | Same class + different clusters      |
+--------------------------------+--------------------------------------+
| FP:                            | TN:                                  |
| different class + same cluster | different class + different clusters |
+--------------------------------+--------------------------------------+

랜드 인덱스에 대해 TP, FN, FP를 계산하는 방법은 다음과 같습니다.

랜드 지수에 대한 TP, FN 및 FP 계산

참고 : 위의 방정식에서 삼각형을 사용하여 그림에 다이아몬드를 표시했습니다.

예를 들어 False Negative의 경우 클래스에서 다른 클러스터로 선택해야합니다. 그래서 우리는 선택할 수 있습니다

  • 클러스터 1에서 1 X, 클러스터 2에서 1 X = (51)(11)=5
  • 클러스터 1에서 1 X, 클러스터 3에서 1 X = (51)(21)=10
  • 클러스터 1에서 1 O, 클러스터 2에서 1 O = (11)(41)=4
  • 클러스터 2에서 1 X, 클러스터 3에서 1 X = (11)(21)=2
  • 1 클러스터 2와 1에서 클러스터 3에서 = (11)(1)=

마지막으로 24 (=5+10+4+2+) 상태.

나머지 방정식도 마찬가지입니다.

가장 어려운 부분은 TN이며 아래 그림과 같이 수행 할 수 있습니다.

랜드 지수에 대한 TN 계산

랜드 지수를 계산하는 데는 더 짧은 경로가 있지만 심층적이고 단계적으로 계산됩니다. 마지막으로 우발 사태 표는 다음과 같습니다.

+--------+--------+
| TP: 20 | FN: 24 |
+--------+--------+
| FP: 20 | TN: 72 |
+--------+--------+
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.