可以处理负面排名的 Reddit/Hacker News 风格的流行时间衰减算法

Posted

技术标签:

【中文标题】可以处理负面排名的 Reddit/Hacker News 风格的流行时间衰减算法【英文标题】:Reddit/Hacker News style popularity time decay algorithm that can deal with negative rankings 【发布时间】: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. 【参考方案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 上写了一篇更详细地描述它的文章

【讨论】:

以上是关于可以处理负面排名的 Reddit/Hacker News 风格的流行时间衰减算法的主要内容,如果未能解决你的问题,请参考以下文章

Java提取网站后台数据进行处理并排名

301重定向的两种实现方法

怎样处理百度快照百度知道百度问答

题目1014:排名(结构体排序)

行情安卓机故障率排名 前三意外 苹果故障率第一是台老机

unordered_map<int,int> 如何处理负面元素?