Эван Миллер показывает байесовский подход к ранжированию 5-звездочных рейтингов:
![enter image description here](https://i.stack.imgur.com/kjDiP.gif)
где
nk
- это число k
-звездных рейтингов,
sk
- это «ценность» (в баллах) k
звезд,
N
- общее количество голосов
K
- максимальное количество звезд (например, K = 5 в 5-звездочной рейтинговой системе)
z_alpha/2
- это 1 - alpha/2
квантиль нормального распределения. Если вы хотите на 95% уверенности (основываясь на байесовском апостериорном распределении), что фактический критерий сортировки, по крайней мере, такой же большой, как вычисленный критерий сортировки, выберите z_alpha/2
= 1.65.
В Python критерий сортировки можно вычислить с помощью
def starsort(ns):
"""
http://www.evanmiller.org/ranking-items-with-star-ratings.html
"""
N = sum(ns)
K = len(ns)
s = list(range(K,0,-1))
s2 = [sk**2 for sk in s]
z = 1.65
def f(s, ns):
N = sum(ns)
K = len(ns)
return sum(sk*(nk+1) for sk, nk in zip(s,ns)) / (N+K)
fsns = f(s, ns)
return fsns - z*math.sqrt((f(s2, ns)- fsns**2)/(N+K+1))
Например, если предмет имеет 60 пятизвездочных, 80 четырехзвездочных, 75 трехзвездных, 20 двухзвездных и 25 однозвездных, тогда его общий рейтинг будет примерно 3,4:
x = (60, 80, 75, 20, 25)
starsort(x)
# 3.3686975120774694
и вы можете отсортировать список 5-звездочных рейтингов с
sorted([(60, 80, 75, 20, 25), (10,0,0,0,0), (5,0,0,0,0)], key=starsort, reverse=True)
# [(10, 0, 0, 0, 0), (60, 80, 75, 20, 25), (5, 0, 0, 0, 0)]
Показывает влияние, которое большее количество оценок может оказать на общее звездное значение.
Вы обнаружите, что эта формула имеет тенденцию давать общий рейтинг, который немного
ниже, чем общий рейтинг, сообщаемый такими сайтами, как Amazon, Ebay или Wal-mart
особенно когда голосов мало (скажем, меньше 300). Это отражает
более высокая неопределенность, которая приходит с меньшим количеством голосов. По мере увеличения количества голосов
(в тысячах) все в целом эти рейтинговые формулы должны стремиться к
(взвешенный) средний рейтинг.
Поскольку формула зависит только от частотного распределения 5-звездочных рейтингов
для самого элемента легко объединить рецензии из нескольких источников (или,
обновление общий рейтинг в свете новых голосов) путем простого добавления частоты
распределения вместе.
В отличие от формулы IMDb, эта формула не зависит от средней оценки
по всем пунктам, ни искусственное минимальное количество отсечения голосов.
Более того, эта формула использует полное распределение частот, а не только
среднее количество звезд и количество голосов. И имеет смысл, что это
следует, так как элемент с десятью 5-звездочными и десятью 1-звездочными должен рассматриваться как
иметь большую неопределенность, чем (и, следовательно, не оценивается так высоко, как) предмет с
двадцать 3-звездочных оценок:
In [78]: starsort((10,0,0,0,10))
Out[78]: 2.386028063783418
In [79]: starsort((0,0,20,0,0))
Out[79]: 2.795342687927806
В формуле IMDb это не учитывается.