PHP/MySQL - “最受欢迎”算法

5

我刚刚建立了一个星级评分系统,并试图想出一种算法来列出“最高评分”的项目。为了简单起见,这里是列:

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”中起到了作用。
有没有人知道一个算法,可以相当不错地确定这个“最佳平衡点”呢?
预先感谢你。
3个回答

10

2
为了补充这一点,还有另一个选项,稍微有些复杂: http://www.evanmiller.org/how-not-to-sort-by-average-rating.html 贝叶斯评分可能更好。不过,这是另一种有趣的方法。 - brianreavis
这个解决方案很好,但它的缺点是你需要知道平均投票和评分的数量!这意味着每次评分计算需要更多 MySQL 查询。 - tuergeist
那个evanmiller.org页面是我实际上正在寻找的,因为那也是一个很棒的算法。我无法在工作中查找它,因为由于某种原因,它被内容过滤器阻止了。 - longneck

3
问题是,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)

4/20和4/1000怎么样?4/20不是等于0.2,4/1000不是等于0.004吗? - andho
4/1000 意味着平均得分为4,共有1000个投票,而不是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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接