如何制作一个随时间递减的威尔逊得分置信区间

10

我正在开发一个Wilson得分区间来对我的网站上的热门内容进行排序,但目前它只是静态的。我的意思是,它将一直保持相同的得分,直到有人点赞或踩它。

这就是为什么我想要实现随时间降低得分的功能,就像在这篇文章中一样。Reddit排名算法如何工作。在那篇文章中,他们解释了Reddit内容得分随时间降低的原因。

就目前而言,我有这个PHP函数,它根据赞和踩给出一个得分:

function wilsonScore($up, $down)
{

    $score = (($up + 1.9208) / ($up + $down) - 1.96 * sqrt(($up * $down) / 
             ($up + $down) + 0.9604) / ($up + $down)) / (1 + 3.8416 / ($up + $down)) ;

    return $score;
}

我希望分数保持不变,但在排序时添加一些SQL代码。

SQL代码如下:

SELECT *
FROM photos
WHERE   status = 0 
    AND net_votes > 0          // display only picture that got rated over 0
ORDER BY score DESC

我有一个想法,就是得出一个能对分数进行对数下降的算法,在帖子发布的头1-2-3天里时间不会对分数产生太大影响,之后分数开始下降。

编辑

理论上是否可行将某些内容添加到分数中,以便用户在网站上获得更多声望(如SO)时,其评分更有价值?类似的东西在互联网上是否已经存在?

这里有人使用过类似的东西吗?


你可以查看OSQA的源代码。它是stackoverflow的开源克隆。http://www.osqa.net/ - Patrick Savalle
2个回答

2
您可以直接在SQL中完成此操作:
$sql = "SELECT  `up`,
                `down`, 
                `date`, 
                (((`up` + 1.9208) / (`up` + `down`) - 1.96 * SQRT((`up` * `down`) / (`up` + `down`) + 0.9604) / (`up` + `down`)) / (1 + 3.8416 / (`up` + `down`))) AS `wilson`, 
                ((((`up` + 1.9208) / (`up` + `down`) - 1.96 * SQRT((`up` * `down`) / (`up` + `down`) + 0.9604) / (`up` + `down`)) / (1 + 3.8416 / (`up` + `down`))) / LN(DATEDIFF(NOW(), `date`) + EXP(1))) AS `weighted_wilson` 

    FROM        `photos`

    ORDER BY    `weighted_wilson` DESC
    ";

使用自然对数衰减(调整后从原始威尔逊得分开始)。显然,您可以与值玩耍。

当然,您可以根据每个用户进行投票数量的调整(即经验丰富的用户授予更大的向上/向下运动)。


0

所以基本上每次调用该函数时,您都会生成该分数,并在每次显示它时调用该函数?那么我会创建一个得分对象,其中包含反映数据库中某些行的以下成员

$score->id; //int
$score->score; //float
$score->up; //int
$score->down; //int
$score->last_vote; //timestamp

从那里开始,每当有人投票赞成或反对,您都会处理一个新的分数。除非您也想将其考虑在内,否则您不必每次查看它时重新处理它。您还可以每天运行一次cron作业,以惩罚长时间未更新的分数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接