Какова правильная версия средней точности?

Я пытаюсь вычислить среднюю точностьсреднюю среднюю точность) в наборе изображений здания Оксфорд.

Ниже приведен код, который они предоставляют для вычисления средней точности. Заметить, что pos_set является объединением "оптимальных" и "хороших" изображений из набора наземных форелей, в то время как junk_set это набор не относящихся к делу изображений.

void OxfordTest::computeAp(std::vector<std::string> &ranked_list){
      float old_recall = 0.0;
      float old_precision = 1.0;
      float ap = 0.0;

      size_t intersect_size = 0;
      size_t i = 0;
      size_t j = 0;
      for ( ; i<ranked_list.size(); ++i) {
              if(!pos_set.count(ranked_list[i]))
                  std::cin.get();
        }
        if (junk_set.count(ranked_list[i])) continue; 
        if (pos_set.count(ranked_list[i])) intersect_size++;

        float recall = intersect_size / (float)pos_set.size();
        float precision = intersect_size / (j + 1.0);

        ap += (recall - old_recall)*((old_precision + precision)/2.0);

        old_recall = recall;
        old_precision = precision;
        j++;
      }
}

Который является чем-то совершенно отличным от понятия, данного на связанной странице Википедии. Какова взаимосвязь между этими понятиями?

Я более чем уверен, что понятие Википедии правильно, поскольку оно соответствует тому, что приведено в этом ответе и в этой статье.

Я не понимаю, почему в коде выше сообщается:

  1. Напомним, в то время как понятие Википедии включает в себя только точность в последней формуле.
  2. Даже учитывая формулу с дельта-отзывом, никто не говорит о `(old_precision + precision) /2

Это оригинальный код C++.

2 ответа

Решение

Хлам набор

Оригинальная статья гласит:

(3) Junk – less than 25% of the object
is visible, or there is a very high level of occlusion or distortion.
(4) Absent – the object is not present

Т.е. нежелательные изображения не являются негативами. Есть положительные стороны (ОК + Хорошо), игнорирует (Нежелательная) и отрицательные (Отсутствует). Обратите внимание, что все они для каждого запроса, то есть некоторые изображения являются ненужными для запроса 1, но не для запроса 15. Если вы посмотрите на изображения, которые являются "нежелательными", вы увидите неоднозначные примеры, например, в некоторых случаях наблюдается экстремальное масштабирование или размытие, которые заставит вас задуматься, содержит ли это изображение запрашиваемый ориентир или нет, и случаи, когда видна только крошечная часть объекта, поэтому изображение слишком жесткое.

In computing the average precision, we use the Good and
Ok images as positive examples of the landmark in question,
Absent images as negative examples and Junk images
as null examples. These null examples are treated as though
they are not present in the database – our score is unaffected
whether they are returned or not.

Таким образом, авторы определили, что набор мусора не является ни положительным, ни отрицательным - изображения, скорее всего, изображают запрашиваемый объект, но для некоторых из них мы не уверены, или было бы слишком резким считать их положительными и попросить систему извлечь эти примеры (и, следовательно, оштрафовать, если это не так). В то же время, было бы также трудно рассматривать их как негативы, как если бы система действительно их получала, это не должно быть наказано. Таким образом, все, что нужно сделать, это то, что (для каждого запроса) вы игнорируете мусоры и относитесь к ним, как будто они не существуют. Таким образом, вы берете полученный список, отфильтровываете все ненужные изображения для этого запроса, а затем запускаете обычные вычисления AP для этого отфильтрованного списка. Это то, что код делает эффективно - когда пример находится в amb(= мусор), он просто пропускается. Затем, если пример не находится в amb, если он находится в pos(itives), то увеличивается значение intersect_size (текущее число положительных значений вплоть до позиции i). Величина j (ну, j-1) - это число не пропущенных элементов в списке (оно увеличивается только в том случае, если текущий элемент не является ненужным).

Вычисление AP

Вы, безусловно, нуждаетесь в отзыве в своих вычислениях AP, как объяснил Шири в предыдущем ответе, и как описано в вашей статье, p(r) - это точность при конкретном отзыве. Лучший способ думать о AP - это не исследовать случайную формулу, а понять, что такое интуиция, а затем посмотреть, как она улавливается формулой, то есть то, что Википедия говорит в начале: вы можете изобразить точность как функцию отзыва, и AP тогда просто площадь под кривой. Вы хотите, чтобы точность была высокой при всех повторных вызовах, поэтому идеальная кривая - это p(r)=1, которая максимизирует точку доступа.

Так что же делает код? Он вычисляет площадь под кривой точного возврата с использованием правила трапеции, посмотрите это уравнение в Википедии, и вы увидите, что оно идентично коду. Вычисление AP для дискретного случая из вашей статьи в Википедии является (обычно используемым) худшим приближением к области под кривой точного возврата, методом прямоугольника.

Напоминание определенно относится к средней точности, так как вы эффективно рассчитываете точность в каждой возможной точке отзыва. Вы можете увидеть это в первых определениях Википедии, как вы заметили сами.

Хороший обзор с четким объяснением AP также можно найти здесь: https://sanchom.wordpress.com/tag/average-precision/

Я начну с предположения, что этот фрагмент кода правильно вычисляет AP, и посмотрим, к чему это нас приведет. (Это не обязательно так, но с учетом того, что рассматриваемый документ цитировался 1,8 тыс. Раз с 2007 года, предположительно, если бы произошла ошибка, кто-то бы его уже поймал.)


Каждый элемент, вносящий вклад в сумму AP, определяется Википедией как:

P(k) * delta_r (k)

где k - ранг в последовательности извлеченных документов, n - количество извлеченных документов, P(k) - точность на пределе k в списке, а delta_r(k) - это изменение в отзыве из элементов k-1 к.

Другими словами, эта строка...

ap += (recall - old_recall)*((old_precision + precision)/2.0);

... по-видимому, это то, что добавляет элементы суммы.

Понятно, что delta_r(k)==(recall - old_recall), так что эта часть покрыта.

Теперь как насчет ((old_precision + precision)/2.0)? Это было также то, что вас беспокоило.


ХОРОШО. Так. Эта часть действительно странная. Вместо того, чтобы использовать P(k) (точность при срезе k), он, по-видимому, усредняет P(k) и P (k-1). Я управлял этим своими коллегами (я работаю в национально признанной лаборатории IR), и мы не могли понять, почему кодекс сделает это. Я догадываюсь, что это какая-то форма сглаживания, которую выбрали авторы, но я не понимаю, почему. Другой альтернативой является то, что сумма каким-то образом складывается и эти элементы взаимно компенсируются. Это конечно выглядит странно.

Редактировать: Это "странное" правило, очевидно, основано на использовании правила трапеции, а не правила прямоугольника для оценки площади под кривой, как объяснил Реля Аранджелович в принятом ответе. Добавляем сюда для полноты. <\ Редактировать>


Между тем, вы можете сопоставить свои результаты из этой функции ранжирования с trec_eval и посмотреть, получите ли вы те же результаты или разные.

Другие вопросы по тегам