什么是计算最高分项的最佳算法?

15

我有一些音乐项目,由用户评分,评分范围在1到5之间,我需要一个公式来获取得分最高的五个项目。

显然,从1000个不同用户那里得到3.5平均分数的项目比仅从5个用户那里得到4.9平均分数的项目得分更高...换句话说,我认为,如果一个项目吸引了人们评分,这表明该项目很有趣。因此,在计算中,votesCount参数需要有一个幂指数。(幂指数是多少?我不确定,所以我请你提供想法)。

我认为我们需要在函数中使用以下参数:votesAverage,votesCount。


1
一个开始阅读这些类型问题的好地方是Netflix挑战。有大量有用和有趣的网络文章和算法示例,处理正是这种情况。 - wheaties
1
你需要更好地定义“最高得分”的概念 - 如果你不能,告诉我们你希望通过这个得分实现什么;这可能会让我们更清楚你在谈论什么。 - Jacob
仅仅对分数求和有什么问题吗?在你的例子中,一个项目得到了3,500的总分,而另一个只有24.5。 - Carlos Gutiérrez
@Carlos Gutiérrez,我的例子只是为了说明问题。如果一个人从1000个中得到1个平均值,而另一个人从150个中得到5个平均值,那么第二个人需要获胜,而不是第一个人。 - Fitzchak Yitzchaki
1
Carlos:一个有1000个1票的项目比一个有100个5票的项目更好吗? :) - Thomas
显示剩余2条评论
5个回答

29

对于投票数众多的5星级系统进行加权投票

您可以使用贝叶斯估算来计算加权投票。

IMDb(互联网电影数据库)使用这个计算方法来确定它的IMDb Top 250。 (注意:IMDb使用10星,但使用5星公式相同)。

计算Top Rated 250 Titles的公式提供了一个真正的贝叶斯估算:

加权评分(WR) = (v ÷ (v+m)) × R + (m ÷ (v+m)) × C

其中:

  • R = 电影的平均分(均值)= (评分)
  • v = 电影的投票数 = (票数)
  • m = 列入Top 250所需的最低投票数(目前为3000)
  • C = 整个报告中的平均投票数(目前为6.9)

IMDb参考资料

维基百科参考资料


1
对我来说,这听起来像是一个理想的匹配。使用一些示例(或真实)数据尝试一下,看看结果是否符合您的要求。 - Robert Cartaino
2
只是为了完整性而提醒一下,在这里 WR = (Rv + Cm) / (v+m),当你设置 H=m 时,这也正是我的解决方案(如下)。 - Antti Huima
1
c(整份报告的平均值)是什么意思?你能解释一下吗? - vivek_jonam
有人能解释一下这个公式中的C是什么吗? - Wearybands
使用上述公式,每当我将m设置为除零以外的任何值时,所有WR值都会降至零。@antti-huima提供的公式有效,并且现在也是上面链接维基页面上列出的公式。 - FirstDivision
显示剩余2条评论

9
Reddit评分算法可能是最好的选择,如果你真的想以正确的方式进行评分。详细解释可以在这里xkcd作者Randall的这篇文章中找到。
问题是它并不适用于五星评级,这正是你所要的。你应该能够将Reddit的排序系统推广到使用评级。实际上,可能已经有人做过了。我会去找一下。

由于Robert提供了一个很好的五星评级排序系统的例子(而且我找不到基于统计置信度的例子),所以我只是把它放在这里。最坏的情况下,您可以将3分及以上的评级视为积极评价,2分及以下的评级视为负面评价,并将这些结果用作您输入到威尔逊得分区间中的数据。 - Welbog
Reddit算法的目的是找到实际评分的下限90%置信区间。从是/否评级到5星评级系统,这应该很容易推广。 - Nick Johnson

6

平衡系统的简单方法是添加一定数量的虚拟用户(假设数量为H),他们都会投票给所有文章的长期平均值A。 假设平均值为3,则公式变为:

得分=(投票数x投票平均值+ H x A)/(投票数+ H)

现在,当投票数增加时,虚构的平均投票者的相对影响会减少。

您可以通过实验或思考来设置H。例如,如果您认为20票足以建立相对较强的评级,则可以将H设置为5。说。


+1 对非常有趣的回答表示赞赏。我认为对我的情况并不适用,因为我不需要显示评级,我需要做的是获取需要获胜的5个。 - Fitzchak Yitzchaki
你可以根据这个修改后的分数进行排序,并显示前5个最高的。 - Antti Huima

0
我用以下方法来管理我的音乐文件: 评分以百分数(0-100)表示 未评级的歌曲获得50%的礼物 每当有人为一首歌投票,它的评分就会增加 每当有人反对这首歌时,它的评分就会下降 如果歌曲评分超过最高值 MAX(即100),则将 MAX 设置为当前歌曲评分 如果歌曲评分低于最低值,则将最低值设置为歌曲评分 在每次更改最小或最大值的投票后,我都会对列表中的每首歌曲进行归一化处理,方法如下: NewRating =(CurrentRating-MIN)* 100 /(MAX-MIN),然后我将MIN设置为0,MAX设置为100。 这种方法给予新旧歌曲同等快速地获得正确评级的机会。此外,对最佳和最差歌曲的每个投票都会影响其他歌曲,我也认为这是正确的做法。 在选择要播放(或投票)的歌曲时,我会在0-100范围内生成一个随机数,并搜索下一首评分等于或高于该数字的歌曲。 糟糕的歌曲得到下降并且很少被选择,好的歌曲得到上升并且更频繁地被选择,但我还是留给甚至最差的歌曲在未来有机会被播放(投票)的机会。

-1

这个术语被称为贝叶斯估计

一个常见的例子:

贝叶斯评分 = (v*R + m*C)/(v+m)
其中:
R = 歌曲的平均评分
v = 对该歌曲的投票次数
m = 列出歌曲所需的最低投票次数(例如10)
C = 所有歌曲的平均投票


但是当 m=0 时 => 贝叶斯评分 = R。我想在函数中保留 v - Fitzchak Yitzchaki
@Mendy...所以不要将m设为0。整个重点是要列出前10首评分最高的歌曲;只有5或6票的歌曲没有足够的投票来决定(统计学上)它是否比拥有1000票的歌曲更好或更差,即使后者的平均评分为3.0星,而前者全部都是5星。 - BlueRaja - Danny Pflughoeft

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