可以处理负面排名的 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 风格的流行时间衰减算法的主要内容,如果未能解决你的问题,请参考以下文章