2017-12-09 21 views
0

이 코드를 사용하여 클러스터의 ARI 둘 사이의 세트를 계산하기 위해 노력하고 있어요 :컴퓨팅 조정 랜드 색인

#computes ARI for this type of clustering 
def ARI(table,n): 

index = 0 
sum_a = 0 
sum_b = 0 
for i in range(len(table)-1): 
    for j in range(len(table)-1): 
     sum_a += choose(table[i][len(table)-1],2) 
     sum_b += choose(table[len(table)-1][j],2) 
     index += choose(table[i][j],2) 


expected_index = (sum_a*sum_b) 
expected_index = expected_index/choose(n,2) 
max_index = (sum_a+sum_b) 
max_index = max_index/2 

return (index - expected_index)/(max_index-expected_index) 


#choose to compute rand 
def choose(n,r): 

f = math.factorial 
if (n-r)>=0: 
    return f(n) // f(r) // f(n-r) 
else: 
    return 0 

나는 아직도 (의 범위를 벗어나는 값을 얻을, 내가 제대로 우발 테이블을 만든 가정 - 1,1). 예를 들어

:

비상 테이블 : 내 코드를 실행하면

[1, 0, 0, 0, 0, 0, 0, 1] 
[1, 0, 0, 0, 0, 0, 0, 1] 
[0, 0, 0, 1, 0, 0, 0, 1] 
[0, 1, 0, 0, 0, 0, 0, 1] 
[0, 0, 0, 0, 0, 1, 1, 2] 
[1, 0, 1, 0, 1, 0, 0, 3] 
[0, 0, 0, 0, 0, 0, 1, 1] 
[3, 1, 1, 1, 1, 1, 2, 0] 

-1.6470588235294115의 ARI를 얻을 수 있습니다. 이 코드에 버그가 있습니까? 또한 여기에

내가 비상 행렬을 계산하고 방법입니다

table = [[0 for _ in range(len(subjects)+1)]for _ in range(len(subjects)+1)] 
#comparing all clusters 
for i in range(len(clusters)): 
    index_count = 0 
    for subject, orgininsts in orig_clusters.items(): 
     madeinsts = clusters[i].instances 
     intersect_count = 0 
     #comparing all instances between the 2 clusters 
     for orginst in orgininsts: 
      for madeinst in makeinsts: 
       if orginst == madeinst: 
        intersect_count += 1 

     table[index_count][i] = intersect_count 
     index_count += 1 


for i in range(len(table)-1): 
    a = 0 
    b = 0 
    for j in range(len(table)-1): 
     a += table[i][j] 
     b += table[j][i] 

    table[i][len(table)-1] = a 
    table[len(table)-1][i] = b 

clusters은 해당 클러스터에 포함 된 인스턴스의 목록입니다 속성 instances을 가지고 클러스터 객체의 목록입니다. orig_clusters은 클러스터 레이블을 나타내는 키가있는 dictonary이며 값은 해당 클러스터에 포함 된 인스턴스의 목록입니다. 이 코드에 버그가 있습니까?

답변

0

코드에서 ARI를 계산할 때 실수를 저지르는 경우가 있습니다. 한 번만 수행하는 대신 테이블을 두 번 반복하기 때문에 a와 b를 너무 자주 계산합니다.

또한 n을 매개 변수로 전달하지만 분명히 10으로 설정됩니다 (즉, 결과를 얻는 방법입니다). 테이블을 통과시킨 다음 거기에서 n을 계산하는 것이 더 쉬울 것입니다. 난 당신의 코드를 조금 수정 :

def ARI(table): 
    index = 0 
    sum_a = 0 
    sum_b = 0 
    n = sum([sum(subrow) for subrow in table]) #all items summed 

    for i in range(len(table)): 
     b_row = 0#this is to hold the col sums 
     for j in range(len(table)): 
      index += choose(table[i][j], 2) 
      b_row += table[j][i] 
     #outside of j-loop b.c. we want to use a=rowsums, b=colsums 
     sum_a += choose(sum(table[i]), 2) 
     sum_b += choose(b_row, 2) 

    expected_index = (sum_a*sum_b) 
    expected_index = expected_index/choose(n,2) 
    max_index = (sum_a+sum_b) 
    max_index = max_index/2 

    return (index - expected_index)/(max_index-expected_index) 

을하거나 로우 - 및 열 합계와 함께 테이블에 전달하는 경우 :

def ARI(table): 

    index = 0 
    sum_a = 0 
    sum_b = 0 
    n = sum(table[len(table)-1]) + sum([table[i][len(table)-1] for i in range(len(table)-1)]) 
    for i in range(len(table)-1): 
     sum_a += choose(table[i][len(table)-1],2) 
     sum_b += choose(table[len(table)-1][i],2) 
     for j in range(len(table)-1): 
      index += choose(table[i][j],2) 

    expected_index = (sum_a*sum_b) 
    expected_index = expected_index/choose(n,2) 
    max_index = (sum_a+sum_b) 
    max_index = max_index/2 

    return (index - expected_index)/(max_index-expected_index) 

다음

def choose(n,r): 
    f = math.factorial 
    if (n-r)>=0: 
     return f(n) // f(r) // f(n-r) 
    else: 
     return 0 

table = [[1, 0, 0, 0, 0, 0, 0, 1], 
[1, 0, 0, 0, 0, 0, 0, 1], 
[0, 0, 0, 1, 0, 0, 0, 1], 
[0, 1, 0, 0, 0, 0, 0, 1], 
[0, 0, 0, 0, 0, 1, 1, 2], 
[1, 0, 1, 0, 1, 0, 0, 3], 
[0, 0, 0, 0, 0, 0, 1, 1], 
[3, 1, 1, 1, 1, 1, 2, 0]] 

ARI(table) 

ARI(table) 
Out[56]: -0.0604008667388949 

올바른 결과를!

+0

감사합니다. 완전성을 위해,'table'의 마지막 행과 열은 나머지 행과 열의 합계입니다. 그래서 내가 실제로하고 싶었던 것은'table [ len (table) -1]'[len (table) -1]''을 호출하고 마지막 두 열을 사용하여'sum_a'와'sum_b'를 계산합니다. 마지막 열과 행을 지우고'ARI 테이블)'이 작동하고 마지막 행과 열을 만들 필요가 없습니다. – tharvey

+0

오 - 나는 그것을 보지 못했습니다. 이 경우 루프를 하나 또는 여러 번 반복하면 제 편집을 볼 수 있습니다 :) – erocoar