Голосование 1 против 1:рассчитывать рейтинги (Flickchart.com)

StackOverflow https://stackoverflow.com/questions/1855800

Вопрос

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

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

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

Screenshot

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

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

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

Это было полезно?

Решение

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

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

Подробности алгоритма есть в ссылке википедии.

Другие советы

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

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

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

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

  • R = среднее значение для фильма (mean) = (Рейтинг)
  • v = количество голосов за фильм = (голосов)
  • m = минимальное количество голосов требуется для попадания в Топ-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.

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

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

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

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

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

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

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

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

Вначале это относительно нестабильно, но со временем должно улучшиться.Однако оно никогда не перестает колебаться.

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

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

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

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

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

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

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

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

Необходимые данные:

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

Дополнительные данные:

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

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

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

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

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

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

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

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

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

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

Итак, чтобы подсчитать оценку одного фильма, нужно просто сложить votesforthisfilm / numberofvotes для каждого фильма его можно сопоставить.

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

===ТО, ЧТО ПОСЛЕДУЮЩЕЕ ПО БОЛЬШОЙ НЕПРАВИЛЬНО И ПРИВЕДЕНО В основном ДЛЯ ИСТОРИЧЕСКОГО КОНТЕКСТА===

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top