2009-09-16 1 views
4

Итак, я только что построил систему рейтинга звезд и попытался придумать алгоритм для перечисления пунктов «Лучшие». Для простоты здесь столбцы:PHP/MySQL - алгоритм для «Top Rated»

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 играет фактор в том, что это «Top».

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

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

ответ

9

вот другой, статистически звук хороший способ: http://www.thebroth.com/blog/118/bayesian-rating

+2

В дополнение к этому, есть и этот вариант, это немного более интенсивно: http://www.evanmiller.org/how-not-to-sort-by-average-rating.html Байесовский рейтинг, вероятно, намного лучше, хотя , Однако это интересный другой подход. – brianreavis

+0

Это решение хорошее, но у него есть тот недостаток, что вам нужно знать среднее число голосов и рейтингов! Это означает больше [!] Запросов MySQL для каждого расчета рейтинга. – tuergeist

+0

, что страница evanmiller.org - это та, которую я действительно искал, поскольку это также отличный алгоритм. я не мог найти его на работе, потому что по какой-то причине он заблокирован фильтром содержимого. – longneck

3

Вопрос заключается в том, насколько выше 4,6/20 должен быть оценен, чем 5,0/2 ...

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

Другая идея - заполнить «средние» голоса. Решите, что 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) 
+0

насчет 4/20 и 4/1000. Не будет 4/20 = 0.2 и 4/1000 = 0.004 – andho

+0

4/1000 означает avg vote of 4 with 1000 votes not 4 разделено на 1000: | – tuergeist

2

Как насчет дать каждому 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