PHP / MySQL - алгоритм для «лучших» - PullRequest
5 голосов
/ 16 сентября 2009

Так что я только что построил систему звездного рейтинга и пытаюсь придумать алгоритм для перечисления элементов с самым высоким рейтингом. Для простоты вот столбцы:

item_name
average_rating (a decimal from 1 to 5)
num_votes

Я пытаюсь определить «точку отсчета» между количеством голосов и рейтингом. Например ...

  • Элемент, получивший оценку (4,6 / 20 голосов), должен быть выше в списке, чем элемент, имеющий (5,0 / 2 голоса)
  • Элемент, получивший оценку (2,5 / 100 голосов), должен быть ниже элемента (4,5 / 2 голоса)

Другими словами, num_votes играет важную роль в том, что является «вершиной».

Кто-нибудь знает алгоритм, который достаточно хорош при определении этого "сладкого пятна"?

Заранее спасибо.

Ответы [ 3 ]

11 голосов
/ 16 сентября 2009

вот еще один, статистически обоснованный способ: http://www.thebroth.com/blog/118/bayesian-rating

3 голосов
/ 16 сентября 2009

Вопрос в том, насколько выше рейтинг 4,6 / 20, чем 5,0 / 2 ...

Идея не принимать во внимание пункты, которые не имеют хотя бы x голосов.

Другая идея - заполнить «средние» голоса. Решите, что 10 голосов должны быть минимальными. 5,0 / 2 должны быть заполнены 8 виртуальными голосами 2,5

5,0 / 2 означает 2 голоса с 5,0, добавив 8 с 2,5, вы получите 30/10 -> 3,0;)

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

4.5/20 > 4.4/100
5.0/2  < 3.1/20  (as 5.0/2 is, as we calculated, 3.0/10)
2 голосов
/ 16 сентября 2009

Как насчет того, чтобы вы дали каждые 10 голосов вес 1, так что 20 голосов дают вес пункта 2. Тогда, если предмет имеет вес 0, он потеряет 0,5 от среднего

4.6/20 = 20/10: 2 weight
5.0/2 = 2/10: 0 weight

(4.6 * 0.02) + 4.6 = 4.692
(5.0 * 0.00) + 5.0 = 5 - 0.5 = 4.5

2.5/100 = 100/10: 10 weight
4.5/2 = 2/10: 0 weight

(2.5 * 0.1) + 2.5 = 2.75
(4.5 * 0.0) + 4.5 = 4.5 - 0.5 = 4
...