2

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

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

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

score=rating_sum/(age^gravity)

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

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

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

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

4

2 回答 2

0

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

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

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

这样,如果 lambda 为负,则分数将向 0 下降;

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

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

于 2014-08-22T17:13:03.010 回答
0

这看起来很像 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上写了一篇更详细地描述它的文章

于 2017-05-04T17:09:51.930 回答