Как реализовать алгоритм байесовского среднего для бинарной рейтинговой системы - PullRequest
9 голосов
/ 01 июля 2010

У меня есть система, в которой люди могут голосовать «за» или «против», и я хочу отобразить результаты этого процесса в виде 5-звездочного рейтинга.

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

Например: у меня есть три элемента (A, B и C) в моей базе данных:

A = 500 голосов "за" и 500 голосов "за" B = 0 UP и 1000 голосов вниз C = 0 UP и 1000 отрицательных голосов

Как рассчитать средний байесовский рейтинг для каждого предмета, чтобы он имел оценку по шкале от 1 до 5?

Ответы [ 2 ]

7 голосов
/ 01 июля 2010

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

3 голосов
/ 01 июля 2010

Простая алгебра:

AvgVotes = Сумма всех голосов / Сумма всех элементов

AvgRating = Сумма голосов за все элементы * 5 / Сумма всех голосов

CurVotes = Количество голосов по текущему элементу

CurRating = Сумма голосов по текущему элементу * 5 / Количество голосов по текущему элементу

TotalVotes = Сумма всех голосов + Сумма голосов потекущий элемент

((AvgVotes * AvgRating) + (CurVotes * CurRating)) * 5 / TotalVotes

Поэтому добавьте свои числа, оценивая вес для A ...

AvgVotes = 1000

AvgRating = 0 (Помните, не включайте числа для элемента, который вы оцениваете в этом расчете)

CurVotes = 1000

CurRating = 500 * 5/1000= 2,5

Всего голосов = 2000 + 1000 = 3000

((1000 * 0) + (1000 * 2,5)) * 5/3000 = 4,166

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

EDIT - Упрощенное решение:

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

Определения:

SET = Все, что не связано с текущей целью оценки, где число голосов больше нуля.

TARGET = Элемент, которым вы в данный момент являетесьпытается оценить

25 * (((Сумма положительных голосов SET) / (Сумма положительных голосов SET)) + (Сумма положительных голосов TARGET)) / (Сумма голосов TARGET + Сумма голосов SET)

Снова подключите свои номера, оценивая «А» для уточнения и доказательства:

(25 * ((0/2) +500)) / (1000 + 2000) = 4,166

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