Я создаю новостной сайт, на котором пользователь может голосовать за или против статей. Статьи связаны с разными сущностями: человек, место, компания, ... У сущностей есть глобальная оценка и оценка для каждого пользователя.
Таким образом, когда пользователь голосует за или против в статье, глобальная оценка связанных сущностей и оценка каждого пользователя меняются.
Например: есть статья, в которой упоминаются Google и Microsoft. Пользователю А понравилась статья, и он проголосовал за нее. Глобальные и пользовательские оценки A организаций Google и Microsoft увеличиваются.
Я бы хотел, чтобы пользователь А больше влиял на свои личные баллы и меньше влиял на общий балл.
Также сущностям придется начинать с некоторой оценки, чтобы первые пользователи сайта не могли ее слишком сильно уменьшить.
Я думаю о ранжировании объекта от 0 до 1. Голоса двоичные: нравится (1), не нравится (0).
Я рассматриваю метод байесовского среднего, упомянутый в этот пост в блоге с C=0,7 и с разными значениями m (я использую am для личный балл и еще один для общего балла). Тесты, которые я провел, не показали почти никакой разницы между личными и общими оценками. Кажется, я не мог найти правильные значения.
Редактировать:
Это код (python), который я использую для вычисления байесовского. С этой формулой результаты лучше:
def bayesian_average(votes, C=100, m=0.7): #C higher for global
#votes = [1,0,1,0,0,1,1,1]
avg_votes = C
avg_rating = m
ent_votes = len(votes) #entity votes
ent_rating = sum(votes) / float(ent_votes)
ba = ( (avg_votes * avg_rating) + (ent_votes * ent_rating) ) / (avg_votes + ent_votes)
return ba