【问题标题】:Popularity ranking algorithm based on votes from 1 to 5基于 1 到 5 票的人气排名算法
【发布时间】:2018-01-11 16:43:19
【问题描述】:

我正在开发一个新网站,其中有一些“实体”可以投票。

每个投票都可以是 1 到 5 之间的数字,其中 1 是最差的投票,5 是最好的投票。

现在,在同一个网站上,我有一个“热门实体图表”,其中我根据他们的投票列出了最受欢迎的“实体”。

现在,我不能做简单的算术平均,因为一票 5 票的“实体”可能与 100 票 5 票的“实体”具有相同的排名。

我考虑过为每个“实体”存储算术平均值和票数,并进行 SQL 查询,按票数和算术平均值排序,但似乎在此之后,一个拥有很多票数的实体1 可能会流行(当它不流行时)。

我可以使用什么算法?

【问题讨论】:

  • 我已经提出了我的想法,即如何实现我想要的“执行 SQL 查询,按票数和算术平均值排序”。简单地说,如果我在这里搜索是因为我没有任何更好的主意,所以我在这里搜索一些对抗。我想 StackOverflow 不仅仅是一个发布需要修复的错误语法的代码的地方。你有点太迂腐了。
  • Bayes_estimator 开头。如上所述:这是一个必须做出的设计决策,尽可能多地提供先验信息。
  • 一种比直接取平均值更好的简单方法是考虑每个实体以一定数量的“3”票开始(例如 100票),并且然后通过包括这些默认投票以及实际投票来取平均值。

标签: mysql algorithm ranking


【解决方案1】:

对于基本解决方案,请尝试order by [average vote] desc, [vote count] desc 这种方式从具有相同平均值的两个实体中选出,具有 100 票的实体将超过具有 1 票的实体,但平均为 4.5 的实体永远不会超过平均为 1 的实体5.

编辑 1

如果您想要 100 票平均 4.5 以赢得 10 票平均 5,为什么不计票忽略 1、2 和 3,或 [计票 4 和 5] - [计票票数 1 和 2]?这样,积极票的计数将提高实体的排名。

编辑 2

您可能希望特别重视最近的投票。某个实体可能发生了一些变化,从而改变了用户对其的看法。可以建立上个月的另一个平均票数,并根据它调整最终排名。

编辑 3

如何计算 [popularityScore] 列并按它排序?

-- sum instead of average
-- square root of sum will reduce importance of vote count a bit
select
    entity,
    sqrt(sum(vote - 3)) as popularityScore
from Votes
group by entity
order by rank desc

-- 50 votes of 5 -> popularityScore = 12.25
-- 100 votes of 4 -> popularityScore = 10
-- 200 votes of 4 -> popularityScore = 14.14
-- 2000 votes of 4 -> popularityScore = 44.72
-- 2000 votes of 5 -> popularityScore = 63.25
-- 100000000 votes of 3 -> popularityScore = 0

可以计算上个月的相同分数并将其添加到该值中。

【讨论】:

  • 这不是让一个拥有 1000 票 1 的实体比拥有 500 票 5 的服务器更上一层楼吗?
  • 您回复的编辑还不错,一个好的方法可能是考虑组 {1, 2, 3} = DOWN 和 {4, 5} = UP
  • order by [average vote] desc, [vote count] desc 将按平均排序,然后按计数进行子排序。这不可能有很多 1 的投票高于单票 5,就像 1000 票 4 将低于 1 票 5。
  • “1000 票 4 将低于一票 5”是我想要避免的。在这一点上,我认为最好先按[票数],然后按[平均票]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多