【问题标题】:Reddit/Hacker News style popularity time decay algorithm that can deal with negative rankings可以处理负面排名的 Reddit/Hacker News 风格的流行时间衰减算法
【发布时间】:2014-10-16 11:45:18
【问题描述】:

我有一个排名系统,用户可以在其中支持/反对(+1/-1)个对象,每个对象都有一个累积的rating_sum,它可以是负数、零或正数。我还记录了在rating_count 中对对象进行评级的总次数。因此,我可以通过一些代数得到赞成票和反对票的数量。

我想实现一个评分算法,它考虑到对象的评分,但也意味着较旧的对象会受到惩罚并获得较低的分数。

到目前为止,我发现了以下内容:

score=rating_sum/(age^gravity)

其中gravity 是一些常数(我一直在使用gravity=2)。

这可以正常工作,除了带有负值的评级,在这种情况下,对象越老,它的分数就越高(负值越小)。这意味着给定两个具有相同负评分的对象,例如 -2,较旧的对象得分高于较年轻的对象,并且浮动更高。

有没有我可以使用的评分算法也适用于负面评分?

(出于技术原因(我正在尝试使用 django ORM 进行优化),我想要一个相当简单的算法,我可以放入 SQL 查询语句,所以只需 POW , LOG 最好)

【问题讨论】:

  • 为什么不score = rating_sum - age^gravity?将rating_sum 视为“人气”,将-1 * age^gravity 视为“新鲜度”。然后score = popularity + freshness.

标签: algorithm sorting rating-system popularity


【解决方案1】:

您可以使用指数衰减模型。

http://en.wikipedia.org/wiki/Exponential_decay

让您的 lambda 基于您当前的评级。类似于 (lambda = - rating/constant)

如果 lambda 为负数,则分数将向 0 递减;

如果 lambda 为正,则分数将负向负无穷增加;

然而,这意味着负分只是更多的负分,而正分永远不会变成负分。

【讨论】:

    【解决方案2】:

    这看起来很像 Reddit 使用的“热度”排名。它对用户评分加上年龄的 LOG10 进行排序(降序)。这个 SQL 是一个粗略的例子:

    SELECT *
    FROM ratings
    ORDER BY 
        LOG10(ABS(rating_sum)) * SIGN(rating_sum)   
        + (UNIX_TIMESTAMP(created_at) / 300000) DESC
    LIMIT 50
    

    当你的 rating_sum = 0 时要小心,因为取零的日志并不酷。

    我在我的一个网站Reddit Hotness Algorithm in SQL 上写了一篇更详细地描述它的文章

    【讨论】:

      猜你喜欢
      • 2010-12-14
      • 1970-01-01
      • 1970-01-01
      • 2013-10-13
      • 2015-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-08
      相关资源
      最近更新 更多