Розрахунок індексу ранду


17

Я намагаюся розібратися, як обчислити індекс Rand алгоритму кластера, але я застряг у тому, як обчислити справжній і хибний негатив.

На даний момент я використовую приклад із книги «Вступ до пошуку інформації» (Manning, Raghavan & Schütze, 2009). На сторінці 359 вони розповідають про те, як обчислити індекс Rand. У цьому прикладі вони використовують три кластери, а кластери містять наступні об'єкти.

  1. аааааб
  2. abbbbc
  3. aaccc

Я замінюю об'єкт (початкові знаки на літери, але ідея та кількість рахунків залишаються однаковими). Я дам точні слова з книги, щоб побачити, про що вони говорять:

Спочатку обчислюємо TP + FP. Три кластери містять відповідно 6, 6 та 5 балів, тому загальна кількість "позитивних" або пар документів, що знаходяться в одному кластері, становить:

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

З них пари в кластері 1, b пари в кластері 2, c пари в кластері 3, а пари в кластері 3 - справжні позитиви:

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

Таким чином, FP = 40 - 20 = 20.

Доки тут розрахунки зрозумілі, і якщо я беру інші приклади, я отримую ті самі результати, але коли я хочу обчислити помилковий негативний та справжній негативний Меннінг та ін. констатуйте наступне:

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), чи можна обчислити TN та FN, якщо ви знаєте лише TP & NP? І якщо так, то як виглядає подібний розрахунок на основі наведеного прикладу?

Відповіді:


9

Я розмірковував приблизно так само, і я вирішував це так. Припустимо, у вас є матриця спільної зустрічі / таблиця непередбачених ситуацій, де рядки - це основні кластери істини, а стовпці - це кластери, знайдені алгоритмом кластеризації.

Так, для прикладу в книзі це виглядатиме так:

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

Тепер ви можете дуже легко обчислити TP + FP, взявши суму за стовпець і "вибрати 2" за всіма цими значеннями. Отже, суми становлять [6, 6, 5], і ви робите "6 вибираємо 2" + "6 вибираємо 2" + "5 вибираємо 2".

Тепер, дійсно так само, ви можете отримати TP + FN, взявши суму по рядках (так, тобто [8, 5, 4] у наведеному вище прикладі), застосуйте «вибрати 2» над усіма цими значеннями та візьміть сума цього.

Самі ТП можна обчислити, застосувавши "вибрати 2" до кожної комірки в матриці та взявши суму всього (якщо вважати, що "1 вибір 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

Я фактично не перевірив жодного іншого прикладу, окрім цього, тому сподіваюся, що я зробив це правильно .... ;-)


Ти для відповіді, але ти не пояснюєш. Ви кажете, що обидва рази базується на колонці. чи можете ви оновити свою відповідь і включити FN + TN, як і FP + TP
MonsterMMORPG

Я не розумів, чому для TP вважається "2 вибирають 2". Чи не означає це, що x неправильно класифікується як ◊?
vcosk

Ви не маєте на увазі "суму за рядками" для TP + FN?
zython

Мені шкода, так, ти маєш рацію. Виправлено це у відповіді.
Том

6

Вивчивши інші відповіді в цій темі, ось моя реалізація Python, яка приймає масиви як вхідні дані, sklearn-style:

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,

тобто 5 'x' + (2'x '+ 3'd') = (10 2)

(4 2) - Кластер 3, порахуйте ті, які НЕ "x", а НЕ "d" (ромбоподібний елемент), які правильно кластеризовані в кластери 1 і 2.

тобто 4 'o в кластері 2. = (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))

    виберіть 2 з 8 для 'x' (a) комбінації одного класу в тих самих кластерах (c (5,2) для кластера 1 і c (2,2) для кластера 3),

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

    виберіть 2 з 5 'o' (b) мінус комбінація того ж класу в тих самих кластерах (c (4,2) для кластеру 2)

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

    виберіть 2 з 4 для '◇' (c) мінус поєднання одного класу в тих самих кластерах (c (3,2) для кластера 3)

Я вивів це так.


1

У мене це реалізація в R, який я поясню:

TP (a в коді) - це сума кожного вибору клітинки 2. Відповідно до оригінального запитання (0 або 1 виберіть 2, що дорівнює 0)

FN (b) - це сума кожного вибору рядка 2, всі підсумовані, менше ТП. Де кожна сума рядків представляє кількість документів у кожному класі True.

Сума цього - всі документи, подібні та в одному кластері (TP), плюс усі документи, які схожі та не в одному кластері (FN).

Так це (TP + FN) - TP = FN

FP (c) розраховується аналогічно. Суму кожного стовпця вибирають 2, всі підсумовані, менше ТП. У цьому випадку кожна сума стовпців представляє кількість документів у кожному кластері.

Таким чином, сума цього - це всі документи, подібні і в одному кластері (TP), плюс усі документи, які не схожі і є в одному кластері (FP).

Так це (TP + FP) - TP = FP

З цих 3 обчислених решта обчислення TN пряма вперед. Сума таблиці виберіть 2, менше TP, FP & FN = TN (d)

Єдиний запит, який у мене є у цього методу, - це визначення TP. Використовуючи термінологію в цьому питанні, я не розумію, чому 2 а в кластері 3 вважаються 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)
}

Це так модно, що ви маєте на увазі під Dell, рядок, стовпець?
Özgür

Я не впевнений, чому ви описуєте статистику Rand як моду? Клітина, рядок і стовпці стосуються рядків та стовпців комірок матриці плутанини. Відповідно до питання ОП.
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

... тоді виконуйте ті самі обчислення.


Чи можете ви бути більш чіткими? Крім того, у вас є один додатковий 3 у вашому списку (в) Я вважаю, оскільки має бути 17 пунктів.
cjauvin

дуже незрозуміла відповідь
MonsterMMORPG

0

Я думаю, що я зворотно спроектував помилковий негативний (FN) з нього. Для справжніх позитивів ви склали 4 групи, які були позитивними. У кластері 1 у вас були п'ять а; у кластері 2 у вас були 4-х; у кластері 3 у вас були 3-х та 2-х.

Тож за хибний негатив.

  1. Починайте з а в кластері 1; є 5 правильно розміщених а в кластері 1. У вас є 1 хибний a в кластері 2, і два false в кластері 3. Це дає (5 1) і (5 2).
  2. Тоді для б. Є 4 правильно розміщені b, які ви розрахували раніше. У вас є одна помилкова b в кластері 1, і все. Це дає вам (4 1) для б.
  3. Тоді для с. У вас є один хибний c в кластері 2, з трьома правильними в кластері 3, тому є (3 1).
  4. Після цього ми не можемо забути про ту пару пар в кластері 3, яку ми назвали справжнім позитивом. Отже, стосовно цього у нас є 1 false a в кластері 2. Хоча в кластері 1 є й інші false, ми не можемо назвати їх false, тому що їх так багато.

Отже, у вас є (5 1) + (5 2) + (4 1) + (3 1) + (2 1), що дорівнює 5 + 10 + 4 + 3 + 2 = 24. Ось звідки походить 24, то просто відніміть, що з 136 ви вже знайшли справжній нег (TN).


0

Ось як обчислити кожен показник для індексу Rand без віднімання

Бічні нотатки для легшого розуміння:

1) Індекс Rand заснований на порівнянні пар елементів. Теорія припускає, що подібні пари елементів повинні бути розміщені в одному кластері, тоді як різні пари елементів повинні бути розміщені в окремих кластерах.

2) RI не хвилює різницю в кількості кластерів. Це просто піклується про True / False пари елементів.

Виходячи з цього припущення, обчислюється індекс Rand

введіть тут опис зображення

Гаразд, зануримося ось наш приклад:

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

У знаменнику маємо загально можливі пари, що є (17 2) = 136

Тепер давайте обчислимо кожен показник для кращого розуміння:

A) Почнемо з легкого a ( True True Positive або виправити подібне )

Це означає, що вам потрібно знайти всі можливі пари елементів, де передбачення та справжня мітка були розміщені разом. На прикладі сітки це означає отримати суму можливих пар у кожній комірці.

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 ( помилкові позитиви чи невірні несхожі )

Це означає, знайти всі пари, які ми розмістили разом, але які повинні бути в різних кластерах. На прикладі сітки це означає, що знайдіть усі можливі пари між будь-якими 2 горизонтальними осередками

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 ( хибний негативний або неправильно подібний ) Це означає, знайти всі пари, які ми розмістили в різних кластерах, але які повинні бути разом. На прикладі сітки знайдіть усі можливі пари між будь-якими 2 вертикальними осередками

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 ( справжні негативи або виправити різні )

Це означає, знайти всі пари, які ми розмістили в різних кластерах, які також повинні бути в різних кластерах. На сітці це означає знайти всі можливі пари між будь-якими 2 не вертикальними і не горизонтальними осередками

Ось які числа слід помножити, щоб краще зрозуміти, що я мав на увазі:

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

І в кінці індекс Rand дорівнює: (20 + 72) / 136 = 0.676


0

Нижче зображено опис вашого питання:

Rand-Index-Question

Щоб вирішити цю проблему, вам потрібно врахувати цю матрицю:

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

Ось як ми обчислюємо TP, FN, FP для індексу Rand:

Розрахунок TP, FN та FP для індексу Rand

ПРИМІТКА. У наведених рівняннях я використав трикутник, щоб показати алмаз на малюнку.

Наприклад, для False Negative, ми повинні вибрати з класу, але в різних кластерах. Отже, ми можемо підібрати

  • 1 X з кластеру 1 і 1 X з кластера 2 = (51)(11)=5
  • 1 X з кластеру 1 і 1 X з кластера 3 = (51)(21)=10
  • 1 O з кластеру 1 і 1 O з кластеру 2 = (11)(41)=4
  • 1 X з кластеру 2 і 1 X з кластера 3 = (11)(21)=2
  • 1 з кластера 2 і 1 від кластера 3 = (11)(31)=3

Нарешті, у нас буде 24 (=5+10+4+2+3) держав.

Те саме стосується решти рівнянь.

Найважча частина - це TN, який можна зробити, як на малюнку нижче:

Розрахунок TN для індексу Rand

Існує кілька коротших шляхів для обчислення індексу Rand, але це обчислення поглиблено і поетапно. Нарешті, таблиця надзвичайних ситуацій виглядає наступним чином:

+--------+--------+
| TP: 20 | FN: 24 |
+--------+--------+
| FP: 20 | TN: 72 |
+--------+--------+
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.