Взвешенная система голосования с кармой - PullRequest
4 голосов
/ 22 октября 2010

Этот вопрос более логичен, чем программирование на данный момент ... как только я пойму, какой алгоритм (ы) мне нужно использовать, я буду искать способы его реализации.

У меня есть список элементов в базе данных, за которые пользователи должны проголосовать за или против, чтобы определить, верны они или нет. Цель состоит в том, чтобы предоставить% для каждого элемента, чтобы показать, насколько надежна информация об элементе.

Есть несколько критериев, которые нужно учитывать ..

  • Голоса не являются абсолютными - вес каждого пользователя зависит от его кармы.
  • Карма пользователя должна рассчитываться на основе его голосов - например, если пользователь отправляет элемент, а другие пользователи голосуют, чтобы подтвердить, что это правильно, карма этого пользователя будет увеличиваться. Карма также может быть дана, если пользователь голосует за предмет в том же направлении, что и другие пользователи с высокой кармой. Если они проголосуют в обратном направлении по отношению к другим пользователям с высокой кармой, их голос будет считаться неправильным, и, хотя это снизит балл за предмет, это также снизит их уровень кармы, сделав их менее влиятельными в будущем голосовании. *
  • Пользователи могут голосовать как за, так и против.
  • Расчетные баллы предметов должны принимать во внимание возраст предмета (со временем оценка уменьшится, поскольку предмет может стать менее надежным).

Есть ли у кого-нибудь какие-либо рекомендации относительно наилучшего алгоритма (-ов) для этого или какие-либо советы о том, как реализовать это на языке программирования (например, PHP)?

Ответы [ 2 ]

6 голосов
/ 22 октября 2010

Сначала прочтите это: http://www.evanmiller.org/how-not-to-sort-by-average-rating.html

Это введение в математическую концепцию, известную как доверительные интервалы оценки Вильсона для параметров Бернулли .

Эта статья является отличным учебником о том, как использовать голоса вашего пользователя для вычисления баллов, которые действительно полезны и математически обоснованно. Сделайте это, и вы уже впереди Amazon.com

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

Наконец, чтобы принять во внимание возраст, вы умножаете результат формулы на множитель возраста. Например, если вы хотите, чтобы результат становился менее значимым на 1% для каждого дня его старения, умножьте его на 0,99 ^ age_in_days .

В двух словах, это путь, которым я бы следовал. Надеюсь, это поможет.

1 голос
/ 22 октября 2010

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

Карма предмета - это сумма кармы всех голосующих пользователей: например, у вас есть три голоса: один с 50 кармой, один с 150 кармой, один с 30 кармой. В результате общая карма составит 170. Таким образом, у предмета есть карма + 170.
Когда новый пользователь голосует, вы пересчитываете карму предмета с новым голосованием, принимая во внимание: (предыдущий пример) новые пользователи голосуют с 10 кармой. Новая карма предмета +180. Разница между старой и новой кармой элемента заключается в карме, которую получает пользователь: (предыдущий пример) пользовательский голос изменил карму элемента на +10, поэтому пользователь получает +10 карму (для будущих голосов). Недостатком этой идеи является то, что пользователи с высокой кармой очень быстро получают новую карму, поэтому вам, вероятно, следует также добавить некоторые ограничивающие факторы (например, логарифм), чтобы масштабировать ее должным образом. Поскольку вы также хотите учитывать возраст предмета, вы можете умножить полученные очки кармы на коэффициент, зависящий от возраста (например, если предмет старше 5 дней, пользователь вообще не получает никакой кармы : 5 дней - временной интервал для голосования, умноженный на измененное значение кармы).

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

...