1 против 1 голоса: подсчитать рейтинг (Flickchart.com) - PullRequest
15 голосов
/ 06 декабря 2009

Вместо того, чтобы оценивать предметы с оценками от 1 до 10, я хотел бы провести 1 бой против 1. Два элемента отображаются рядом друг с другом, и вы выбираете тот, который вам нравится больше. Основываясь на этих результатах «боя», алгоритм должен рассчитывать рейтинги для каждого предмета.

Вы можете увидеть этот подход на Flickchart.com , где фильмы оцениваются с использованием этого подхода.

Это выглядит так:

Screenshot

Как видите, предметы выталкиваются вверх, если они выигрывают "бой". Рейтинг всегда меняется в зависимости от результатов «боя». Но это не может быть основано только на выигрышной котировке (здесь 54%), поскольку выиграть у «Титаника» сложнее, чем у «25-го часа» или около того.

Есть несколько вещей, которые мне не совсем понятны: - Как рассчитываются рейтинги? Как вы решаете, какой фильм занимает первое место в рейтинге? Вы должны учитывать, как часто выигрывают предметы и насколько хороши побитые предметы. - Как выбрать, какие предметы имеют «бой»?

Конечно, вы не можете сказать мне, как именно Flickchart делает все это. Но, может быть, вы можете сказать мне, как это можно сделать. Заранее спасибо!

Ответы [ 9 ]

8 голосов
/ 06 декабря 2009

Это может быть не совсем то, что делает фликчарт, но вы можете использовать вариант алгоритма ELO , используемый в шахматах (и других видах спорта), так как это по сути бои / игры, в которых они выигрывают / проигрывают .

Обычно все фильмы начинаются с 0 побед / проигрышей, и каждый раз, когда они получают победу, они получают определенное количество очков. Обычно у вас в среднем около 20 (но подойдет любое число), и победа над фильмом с таким же рейтингом, как у вас, даст ровно 20. Победа над плохим фильмом, возможно, даст около 10 баллов, а победа над лучшим фильмом может дать вам 30 баллов. С другой стороны, проигрывая хороший фильм, вы теряете только 10 баллов, но если вы проигрываете плохому, вы теряете 30 баллов.

Специфика алгоритма находится в ссылке на википедию.

5 голосов
/ 11 декабря 2009

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

Вам нужен взвешенный рейтинг, также называемый байесовской оценкой.

Я думаю, Лучшие 250 фильмов IMDB - лучшая отправная точка для создания рейтинга сайта. В некоторых фильмах более 300 000 голосов, а в других - менее 50 000. IMDB использует оценку Байеса для ранжирования фильмов друг против друга без несправедливого взвешивания популярных фильмов. Алгоритм приведен внизу страницы:

weighted rating (WR) = (v ÷ (v+m)) × R + (m ÷ (v+m)) × C где:

  • R = среднее для фильма (среднее) = (Рейтинг)
  • v = количество голосов за фильм = (голосов)
  • м = минимальное количество голосов должны быть перечислены в Топ-250 (в настоящее время 3000)
  • C = средний голос по всему отчету (в настоящее время 6,9)

для Топ 250, только голоса от постоянными избирателями считаются.

Я не знаю, как IMDB выбрал 3000 в качестве минимального голоса. Они могли бы выбрать 1000 или 10000, и список был бы более или менее таким же. Может быть, они используют «среднее количество голосов после 6 недель в кассах», или они используют метод проб и ошибок.

В любом случае, это не имеет значения. Приведенная выше формула в значительной степени является стандартом для нормализации голосов на рейтинговых веб-сайтах, и я почти уверен, что Flickrchart использует нечто подобное в фоновом режиме.

Формула работает так хорошо, потому что она «тянет» рейтинги к среднему, поэтому рейтинги выше среднего немного снижаются, рейтинги ниже среднего немного повышаются. Однако , сила притяжения обратно пропорциональна количеству голосов, которые имеет фильм. Поэтому фильмы с небольшим количеством голосов более агрессивно тянутся к среднему значению, чем фильмы с большим количеством голосов. Вот две точки данных для демонстрации свойства:

Rank  Movie            Votes            Avg Rating        Weighted Rating
----  -----            -----            ----------        ---------------
219   La Strada        15,000+          8.2               8.0
221   Pirates of the   210,000+         8.0               8.0
      Caribbean 2

Рейтинги обоих фильмов снижены, но «Ла Страда» более драматична, поскольку у нее меньше голосов, и поэтому она не так репрезентативна, как рейтинги PotC.


В вашем конкретном случае у вас есть два предмета в «бою». Вам, вероятно, следует оформить таблицу следующим образом:

Items
-----
ItemID (pk)
FightsWon (int)
FightsEngaged (int)

Средний рейтинг - FightsWon / FightsEngaged. Взвешенный рейтинг рассчитывается по формуле выше.

Когда пользователь выбирает победителя в бою, увеличьте поле FightsWon выигрышного предмета на 1, увеличьте поле FightsEngaged обоих предметов на 1.

Надеюсь, это поможет! - Джульетта

2 голосов
/ 14 декабря 2009

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

На данный момент я просто сортирую по <fights won> / <total fights>, сначала самое высокое. Это хорошо работает, если вы голосуете только один, или если много людей голосуют. В противном случае это может быстро стать неточным.

Одна из проблем здесь состоит в том, как выбрать, с какими двумя предметами бороться. Одна вещь, которая, кажется, работает хорошо (субъективно) - позволить предмету, у которого пока что меньше всего боев, бороться со случайным предметом. Это приводит к относительно равномерному количеству боев за предметы (-> точность), за счет возможного скучного для избирателя (ей). Они часто будут сравнивать новейший предмет с чем-то другим, что довольно скучно. Чтобы смягчить это, вы можете выбрать n предметов с наименьшим количеством боев и выбрать один из них случайным образом в качестве первого соперника.

Вы упомянули, что хотите, чтобы победы над сильными противниками считались больше, чем против слабых. Как упомянуто в других постах выше, рейтинговые системы, используемые для шахмат и т.п. (Elo, Glicko), могут работать. Лично я хотел бы использовать Microsoft TrueSkill, так как она кажется наиболее точной, а также предоставляет хороший способ выбрать два элемента, которые можно сопоставить друг с другом - те, которые имеют наибольшую вероятность извлечения, рассчитанную TrueSkill. Но, увы, мое понимание математики недостаточно хорошо, чтобы по-настоящему понять и реализовать детали системы, и в любом случае оно может облагаться лицензионными сборами ...

Коллективный выбор: конкурентные рейтинговые системы имеет хороший обзор нескольких различных рейтинговых систем, если вам нужно больше информации / вдохновения.

Помимо рейтинговых систем, вы также можете попробовать различные простые лестничные системы. Один пример:

  1. Рандомизировать список предметов, чтобы они заняли от 1 до n
  2. Выберите два предмета наугад и дайте им возможность сразиться
  3. Если победитель оценивается выше проигравшего: ничего не делать
  4. Если проигравший оценивается выше победителя:
    • Если проигравший находится прямо над победителем: поменяйте местами
    • Иначе: переместить победителя вверх по лестнице x % к проигравшему в битве.
  5. Перейти к 2

Это относительно нестабильно в начале, но со временем должно улучшиться. Хотя оно не перестает колебаться.

Надеюсь, я смогу хоть немного помочь.

2 голосов
/ 12 декабря 2009

Что касается фликчарта, я немного поиграл с ним, и я думаю, что система рейтинга довольно проста. Я полагаю, что в псевдокоде это выглядит примерно так:

if rank(loser) == null and rank(winner) == null
    insert loser at position estimated from global rank
    insert winner at position estimated from global rank
else if rank(winner) == null or rank(winner) < rank(loser)
    then advance winner to loser's position and demote loser and all following by 1

Почему я так думаю? Во-первых, я полностью убежден, что их байесовские априоры не основаны на тщательном анализе моего предыдущего выбора. Кажется, у них нет никакой возможности догадаться, потому что мне нравится «Возвращение джедая», мне нравится «Империя наносит ответный удар». На самом деле, они не могут понять, что из-за я видел Home Alone 2, что я мог видеть Home Alone 1. После сотен оценок выбор не пришел.

Во-вторых, если вы посмотрите на приведенный выше код, вы можете найти небольшую ошибку, которую вы обязательно заметите на сайте. Вы можете заметить, что иногда вы будете делать выбор, и победитель будет скользить на один . Это, кажется, происходит только тогда, когда проигравший не был ранее добавлен. Я думаю, что происходит то, что проигравший добавляется выше, чем победитель.

Кроме этого, вы заметите, что рейтинг не меняется вообще, если фильм с более низким рейтингом не побеждает фильм с более высоким рейтингом напрямую . Я не думаю, что какие-либо реальные результаты сохраняются: кажется, что сайт полностью лишен памяти, за исключением порядкового номера каждого фильма и вашего последнего рейтинга.

1 голос
/ 15 декабря 2009

После продумывания, лучшее решение для этого рейтинга фильма выглядит следующим образом.

Обязательные данные:

  • Количество голосов, взятых по каждой паре фильмов.
    • А также отсортированная версия этих данных, сгруппированных как в сортировке по основанию
  • Сколько раз за каждый фильм проголосовали в каждой паре фильмов

Необязательные данные:

  • Сколько раз каждый фильм участвовал в голосовании за каждого пользователя

Как выбрать голос за пользователя:

  • Выберите выбор голосования из отсортированного списка в группе с самым низким использованным радиксом (случайным образом)
  • Необязательно: используйте личную статистику голосования пользователя, чтобы отфильтровать фильмы, по которым им предлагалось голосовать слишком много раз, возможно, перейдя на более высокие интервалы, если нет ничего подходящего.

Как подсчитать рейтинг за фильм:

  • Начните счет с 0
  • Проходите друг через друга фильм в системе
    • Добавить voteswon / votestaken против этого фильма в счет
      • Если между этими двумя фильмами не было получено ни одного голоса, добавьте 0,5 вместо (Это, конечно, при условии, что вы хотите, чтобы новые фильмы начинались как средние в рейтинге)

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

Убедиться в том, что во вновь добавленных фильмах собрана статистика как можно скорее и очень равномерно распределены голоса по всем существующим фильмам, жизненно важно для поддержания правильной статистики для остальных фильмов. Возможно, стоит ошеломить появление в системе множества новых фильмов, чтобы избежать временных сбоев в рейтингах (хотя и не немедленных и не серьезных).

=== ЭТО ОРИГИНАЛЬНЫЙ ОТВЕТ ===

Проблема на самом деле очень проста. Здесь я предполагаю, что вы хотите отдать предпочтение голосованию за фильм, то есть фильм № 1 - это фильм, который, скорее всего, будет выбран при голосовании. Если вы сделаете так, чтобы при каждом голосовании вы выбирали два фильма совершенно случайно, вы можете рассчитать это с помощью простых математических вычислений.

Во-первых, каждый выбор двух фильмов для голосования одинаково вероятен, поэтому результаты каждого голосования можно просто сложить для получения оценки (экономия умножается на 1 / nC2 для всего). И, очевидно, вероятность того, что кто-то проголосует за один конкретный фильм против другого конкретного фильма, составляет всего votesforthisfilm / numberofvotes.

Таким образом, чтобы рассчитать балл за один фильм, вы просто суммируете votesforthisfilm / numberofvotes за каждый фильм, с которым можно сравнить.

Здесь есть небольшая проблема, если вы добавите новый фильм, у которого не было значительного числа голосов против всех других фильмов, поэтому вы, вероятно, хотите оставить его вне рейтинга, пока не наберется количество голосов. .

=== ЧТО СЛЕДУЕТ НЕПРАВИЛЬНО, ЧТО СЛЕДУЕТ СЛЕДОВАТЬ ИСТОРИЧЕСКОМУ КОНТЕКСТУ ===

Этот метод оценки основан на цепочке Маркова вашей системы голосования, при условии, что все возможные вопросы голосования были одинаково вероятны. [Это первое предложение неверно, потому что в цепочке Маркова должны быть одинаково вероятны все вопросы для голосования, чтобы получить значимые результаты] Конечно, это не так, и на самом деле вы можете это исправить, так как Вы знаете, насколько вероятен был каждый вопрос о голосовании, это просто количество голосов, которые были сделаны по этому вопросу! [Вероятность получения конкретного вопроса для голосования на самом деле не имеет значения, так что это не помогает] Таким образом, используя тот же график, но с весами, взвешенными по голосам, сделано ...

Вероятность получения каждого фильма с учетом того, что он был включен в голосование, равна вероятности получения каждого фильма и его нахождения в голосовании, деленного на вероятность того, что он был включен в голосование. Это составляет sumoverallvotes((votesforthisfilm / numberofvotes) * numberofvotes) / totalnumberofvotes, деленное на sumoverallvotes(numberofvotes) / totalnumberofvotes. С большой отменой это доходит до votesforthisfilmoverallvotes / numberofvotesinvolvingthisfilm. Что действительно просто!

1 голос
/ 09 декабря 2009

Или вы можете использовать вариант PageRank, см. prof. Классное описание Уилфа .

0 голосов
/ 15 декабря 2009

От всей души рекомендую книгу Программирование Коллективного Разума для всевозможных интересных алгоритмов и анализа данных по этим направлениям.

0 голосов
/ 12 декабря 2009

Я полагаю, что такой сценарий типа 1 против 1 может быть типом совместного анализа, называемого Дискретный выбор .Я вижу это довольно часто в веб-опросах для исследования рынка.Клиента обычно просят выбрать между двумя + различными наборами функций, которые он предпочел бы больше всего.К сожалению, это довольно сложно (для такого неопытного парня, как я), поэтому у вас могут возникнуть трудности с его пониманием.

0 голосов
/ 10 декабря 2009
...