Tính toán chỉ số Rand


17

Tôi đang cố gắng tìm ra cách tính Chỉ số Rand của thuật toán cụm, nhưng tôi bị mắc kẹt tại điểm làm thế nào để tính toán các phủ định đúng và sai.

Hiện tại tôi đang sử dụng ví dụ từ cuốn sách Giới thiệu về truy xuất thông tin (Manning, Raghavan & Schütze, 2009). Tại trang 359 họ nói về cách tính chỉ số Rand. Trong ví dụ này, họ sử dụng ba cụm và các cụm chứa các đối tượng sau.

  1. aaaaab
  2. abbbbc
  3. aaccc

Tôi thay thế đối tượng (dấu hiệu ban đầu thành chữ cái, nhưng ý tưởng và số lượng vẫn giữ nguyên). Tôi sẽ đưa ra những từ chính xác từ cuốn sách để xem những gì họ đang nói về:

Đầu tiên chúng tôi tính toán TP + FP. Ba cụm lần lượt chứa 6, 6 và 5 điểm, do đó, tổng số tích cực của các điểm tích cực hoặc các cặp tài liệu nằm trong cùng một cụm là:

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

Trong số này, một cặp trong cụm 1, cặp b trong cụm 2, cặp c trong cụm 3 và một cặp trong cụm 3 là tích cực thực sự:

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

Như vậy, FP = 40 - 20 = 20.

Cho đến khi tính toán ở đây rõ ràng, và nếu tôi lấy các ví dụ khác tôi sẽ nhận được kết quả tương tự, nhưng khi tôi muốn tính toán âm tính giả và âm tính thật Manning et al. tuyên bố như sau:

FN và TN được tính toán tương tự nhau, dẫn đến bảng dự phòng sau:

Bảng dự phòng trông như sau:

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

Câu: "FN và TN được tính tương tự nhau" không rõ ràng đối với tôi và tôi không hiểu những con số nào tôi cần để tính TN và FN. Tôi có thể tính toán phía bên phải của bảng bằng cách làm như sau:

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

Nguồn: http://en.wikipedia.org/wiki/Rand_index

Do đó, FN + TN = 136 - TP + FP = 136 - 40 = 96, nhưng điều này không thực sự giúp tôi tìm ra cách tính các biến riêng biệt. Đặc biệt là khi các tác giả nói: "FN và TN được tính toán tương tự nhau". Tôi không thấy thế nào. Ngoài ra khi tôi nhìn vào các ví dụ khác, họ tính toán từng ô của bảng dự phòng bằng cách nhìn vào từng cặp.

Ví dụ: http : //www.otlet-inst acad.org/wikics/Clustering_Probols.html#toc-Subection-4.1

Câu hỏi đầu tiên của tôi, dựa trên ví dụ của Manning et al (2009), có thể tính TN và FN nếu bạn chỉ biết TP & NP? Và nếu vậy, cách tính tương tự trông như thế nào dựa trên ví dụ đã cho?

Câu trả lời:


9

Tôi đã suy nghĩ về điều tương tự, và tôi đã giải quyết nó như thế này. Giả sử bạn có một ma trận đồng xảy ra / bảng dự phòng trong đó các hàng là các cụm sự thật mặt đất và các cột là các cụm được tìm thấy bởi thuật toán phân cụm.

Vì vậy, ví dụ trong cuốn sách, nó sẽ giống như:

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

Giờ đây, bạn có thể dễ dàng tính toán TP + FP bằng cách lấy tổng trên mỗi cột và 'chọn 2' trên tất cả các giá trị đó. Vậy tổng là [6, 6, 5] và bạn làm '6 chọn 2' + '6 chọn 2' + '5 chọn 2'.

Bây giờ, thực tế, tương tự, bạn có thể nhận TP + FN bằng cách lấy tổng số trên các hàng (vì vậy, đó là [8, 5, 4] trong ví dụ trên), áp dụng 'chọn 2' trên tất cả các giá trị đó và lấy tổng của đó.

Bản thân TP có thể được tính bằng cách áp dụng 'chọn 2' cho mọi ô trong ma trận và lấy tổng của mọi thứ (giả sử rằng '1 chọn 2' là 0).

Trong thực tế, đây là một số mã Python thực hiện chính xác điều đó:

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))

Nếu tôi chạy nó, tôi nhận được:

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

Tôi thực sự đã không kiểm tra bất kỳ ví dụ nào khác ngoài ví dụ này, vì vậy tôi hy vọng tôi đã làm đúng .... ;-)


ty cho câu trả lời nhưng bạn không giải thích. bạn nói cả hai lần dựa cột. bạn có thể cập nhật câu trả lời của mình và bao gồm FN + TN như bạn đã làm FP + TP
MonsterMMORPG

Tôi không hiểu tại sao TP '2 chọn 2' được xem xét. Điều đó không có nghĩa là x được phân loại không chính xác là ◊?
vcosk

không phải bạn có nghĩa là "tổng số hàng" cho TP + FN sao?
zython

Tôi xin lỗi, vâng, bạn đúng. Đã sửa nó trong câu trả lời.
Tom

6

Sau khi nghiên cứu các câu trả lời khác trong luồng này, đây là triển khai Python của tôi, lấy mảng làm đầu vào, sklearnkiểu:

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

Tôi không chắc lắm về bản thân mình, nhưng đây là cách tôi đã làm giá trị
TN : TN = (7 2) (10 2) (4 2)

(7 2) - Cụm 1 - kiểm tra cho biết 'x', vì vậy hãy đếm những cụm KHÔNG phải x (và được phân cụm chính xác trong cụm 2 & 3)

tức là 4 'o's + 3' d's (kim cương) = (7 2)

(10 2) - Cụm 2, đếm những cụm KHÔNG phải và được phân cụm chính xác trong cụm 1 và 3,

tức là 5 'x' + (2'x '+ 3'd') = (10 2)

(4 2) - Cụm 3, đếm những cái KHÔNG phải là 'x' và KHÔNG 'd' (phần tử hình kim cương) được phân cụm chính xác trong cụm 1 & 2.

tức là 4 'o trong cụm 2. = (4 2)

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

Vậy FN là:

FN = (17 2) - (TP + FP) - TN = 136 - 40 -72 = 24. ---> (17 = tổng số tài liệu)


Đây là câu trả lời có ý nghĩa nhất đối với tôi, mặc dù nó không thực sự cho thấy "FN và TN được tính toán tương tự nhau" như cuốn sách nói và câu hỏi đề cập đến. Tôi nghi ngờ có thể có một cách đơn giản hơn, vì có lẽ câu trả lời đề cập đến các gợi ý chiến lược chuyển đổi cụm / lớp.
cjauvin

Điều này là sai, mô tả này không hoạt động trong các ví dụ khác. Trả lại upvote của tôi! Câu trả lời đúng là của @ user9668.
Özgür

Câu trả lời này thực sự có ý nghĩa hoàn hảo.
EhsanF

2

Lấy ví dụ về một câu hỏi khác:

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

Câu trả lời hợp lý cho FN:

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

Giải trình:

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

    chọn 2 từ 8 cho 'x' (a) sự kết hợp của cùng một lớp trong cùng một cụm (c (5,2) cho cụm 1 và c (2,2) cho cụm 3),

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

    chọn 2 từ 5 'o' (b) trừ đi sự kết hợp của cùng một lớp trong cùng một cụm (c (4.2) cho cụm 2)

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

    chọn 2 từ 4 cho '◇' (c) trừ đi sự kết hợp của cùng một lớp trong cùng một cụm (c (3,2) cho cụm 3)

Tôi bắt nguồn từ nó như thế này.


1

Tôi có một triển khai này trong R mà tôi sẽ giải thích:

TP (a trong mã) là tổng của mỗi ô chọn 2. Theo câu hỏi ban đầu (0 hoặc 1 chọn 2 tương đương với 0)

FN (b) là tổng của mỗi hàng chọn 2, tất cả được tính tổng, ít TP. Trong đó mỗi tổng hàng đại diện cho số lượng tài liệu trong mỗi lớp True.

Tổng của điều này là tất cả các tài liệu tương tự và trong cùng một cụm (TP) cộng với tất cả các tài liệu tương tự và không nằm trong cùng một cụm (FN).

Vậy đây là (TP + FN) - TP = FN

FP (c) được tính tương tự. Tổng của mỗi cột chọn 2, tất cả được tính tổng, ít TP. Trong trường hợp này, mỗi cột tổng đại diện cho số lượng tài liệu trong mỗi cụm.

Vì vậy, tổng của tất cả các tài liệu này là tương tự và trong cùng một cụm (TP) cộng với tất cả các tài liệu không giống nhau và nằm trong cùng một cụm (FP).

Vậy đây là (TP + FP) - TP = FP

Với 3 tính toán này, tính toán còn lại của TN là thẳng tiến. Tổng của bảng chọn 2, ít TP, FP & FN = TN (d)

Truy vấn duy nhất tôi có với phương pháp này là định nghĩa về TP. Sử dụng thuật ngữ trong câu hỏi này, tôi không hiểu tại sao 2 a trong cụm 3 được coi là TP. Tôi đã tìm thấy điều này cả ở đây và trong sách giáo khoa liên quan. Tuy nhiên tôi hiểu tính toán của họ với giả định rằng tính toán TP của họ là chính xác.

Hi vọng điêu nay co ich

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)
}

Điều này rất thịnh hành, bạn có ý nghĩa gì bởi dell, hàng, cột?
Özgür

Tôi không chắc tại sao bạn mô tả Thống kê Rand là thịnh hành? Ô, hàng và cột tham chiếu đến các hàng và cột của ma trận nhầm lẫn. Theo câu hỏi của OP.
SamPassmore

Chà, bởi vì không có ma trận nhầm lẫn trong câu hỏi ban đầu? và bạn không nói rằng đó là ma trận nhầm lẫn. Đó là trong câu trả lời đầu tiên ở trên và một khi được sử dụng, có, phương pháp của bạn dường như đang hoạt động.
Özgür

0

Bạn có thể tính TN và FN theo cùng một cách.

Chỉ cần chuyển đổi vai trò của nhãncụm .

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

... Sau đó thực hiện các tính toán tương tự.


Bạn có thể rõ ràng hơn? Ngoài ra, bạn đã có thêm 3 trong danh sách của mình (c) Tôi tin rằng, nên có 17 mục.
cjauvin

câu trả lời rất không rõ ràng
MonsterMMORPG

0

Tôi nghĩ rằng tôi đã đảo ngược âm tính giả (FN) ra khỏi nó. Đối với những mặt tích cực thực sự, bạn đã tạo ra 4 nhóm tích cực. Trong cụm 1, bạn có năm a; trong cụm 2, bạn đã có 4 b's; trong cụm 3 bạn có 3 c và 2 a.

Vì vậy, cho âm tính giả.

  1. Bắt đầu với a trong cụm 1; có 5 a được đặt đúng trong cụm 1. Bạn có 1 sai a trong cụm 2 và hai sai a trong cụm 3. Điều đó cho (5 1) và (5 2).
  2. Sau đó cho b's. Có 4 b đặt đúng bạn đã tính trước đó. Bạn có một b sai trong cụm 1, và đó là nó. Điều đó mang lại cho bạn (4 1) cho b's.
  3. Sau đó cho các c. Bạn có một c sai trong cụm 2, với ba đúng trong cụm 3, vì vậy có (3 1).
  4. Sau đó, chúng ta không thể quên cặp đôi đó trong cụm 3 mà chúng ta gọi là dương tính thực sự. Vì vậy, đối với điều đó, chúng ta có 1 sai trong cụm 2. Mặc dù có một số khác trong cụm 1, chúng ta không thể gọi chúng là sai vì có rất nhiều.

Do đó, bạn có (5 1) + (5 2) + (4 1) + (3 1) + (2 1) bằng 5 + 10 + 4 + 3 + 2 = 24. Đó là nơi 24 đến từ đó chỉ cần trừ đi từ 136 bạn đã tìm thấy để có được phủ định thực sự (TN).


0

Dưới đây là cách tính mọi số liệu cho Rand Index mà không trừ

Ghi chú bên để dễ hiểu hơn:

1) Rand Index dựa trên việc so sánh các cặp yếu tố. Lý thuyết gợi ý rằng các cặp phần tử tương tự nên được đặt trong cùng một cụm, trong khi các cặp phần tử khác nhau nên được đặt trong các cụm riêng biệt.

2) RI không quan tâm đến sự khác biệt về số lượng cụm. Nó chỉ quan tâm đến các cặp yếu tố Đúng / Sai.

Dựa trên giả định này, Rand Index, được tính toán

nhập mô tả hình ảnh ở đây

Ok, chúng ta hãy đi sâu vào đây là ví dụ của chúng tôi:

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

Trong mẫu số, chúng ta có tổng số cặp có thể, đó là (17 2) = 136

Bây giờ hãy tính toán mọi số liệu để hiểu rõ hơn:

A) Hãy bắt đầu với một cách dễ dàng , ( Tích cực đúng hoặc tương tự chính xác )

Điều đó có nghĩa là, bạn cần tìm tất cả các cặp yếu tố có thể, trong đó dự đoán và nhãn thực sự được đặt cùng nhau. Trên ví dụ lưới, nó có nghĩa là lấy tổng các cặp có thể có trong mỗi ô.

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) Bây giờ, hãy làm c ( Tích cực sai hoặc không giống nhau )

Nó có nghĩa là, tìm tất cả các cặp, mà chúng ta đặt cùng nhau, nhưng nên ở trong các cụm khác nhau. Trên ví dụ lưới có nghĩa là, tìm tất cả các cặp có thể giữa bất kỳ 2 ô ngang nào

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) Tính d ( Sai âm hoặc tương tự sai ) Có nghĩa là, tìm tất cả các cặp mà chúng tôi đặt trong các cụm khác nhau, nhưng phải cùng nhau. Trên ví dụ lưới, tìm tất cả các cặp có thể giữa bất kỳ 2 ô dọc

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) Và, cuối cùng chúng ta hãy làm b ( Tiêu cực thực sự hoặc không giống nhau chính xác )

Điều đó có nghĩa là, tìm tất cả các cặp mà chúng ta đặt trong các cụm khác nhau, cũng nên nằm trong các cụm khác nhau. Trên lưới, điều đó có nghĩa là tìm tất cả các cặp có thể giữa bất kỳ 2 ô không dọc và không ngang

Đây là những con số nên được nhân lên, để hiểu rõ hơn ý tôi là gì:

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

Bằng số:

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

Và cuối cùng, Rand Index bằng nhau: (20 + 72) / 136 = 0.676


0

Dưới đây là hình ảnh mô tả câu hỏi của bạn:

Rand-Index-Câu hỏi

Để giải quyết vấn đề này, bạn cần xem xét ma trận này:

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

Đây là cách chúng tôi tính toán TP, FN, FP cho Rand Index:

Tính toán TP, FN và FP cho Rand Index

LƯU Ý: Trong các phương trình trên, tôi đã sử dụng một hình tam giác để hiển thị viên kim cương trong hình.

Ví dụ, đối với Sai âm, chúng ta nên chọn từ lớp nhưng trong các cụm khác nhau. Vì vậy, chúng ta có thể chọn

  • (51)(11)= =5
  • (51)(21)= =10
  • (11)(41)= =4
  • (11)(21)= =2
  • (11)(31)= =3

24= =5+10+4+2+3 ).

Điều tương tự là cho phần còn lại của phương trình.

Phần khó nhất là TN có thể được thực hiện như hình dưới đây:

Tính toán TN cho Rand Index

Có một số đường dẫn ngắn hơn để tính Chỉ số Rand, nhưng đó là cách tính sâu và từng bước một. Cuối cùng, bảng dự phòng trông như sau:

+--------+--------+
| TP: 20 | FN: 24 |
+--------+--------+
| FP: 20 | TN: 72 |
+--------+--------+
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.