Система взвешенного голосования с кармой

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

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

Необходимо учитывать несколько критериев.

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

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


person RichW    schedule 22.10.2010    source источник
comment
что-то вроде сети доверия / PGP?   -  person yadab    schedule 22.10.2010


Ответы (2)


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

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

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

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

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

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

person Edward    schedule 22.10.2010

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

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

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

person Fge    schedule 22.10.2010