如何评价或排名投票

时间:2011-02-07 18:41:11

标签: php

我真的很抱歉,如果我错了我的问题,但我想要一些想法...我希望有一个排名算法的想法,包括他们提交投票的时间。

2 个答案:

答案 0 :(得分:3)

好问题!

好吧,让我们开启吧!

首先,在计算好的评分时,你不能做的一件事是Bayesianaverage

你已经阅读了它,但非常简化,它负责以下事项:

  • 投票数不多的参赛作品并不是他们投票的真实意思,而是在整个数据集中具有平均评分的成分。例如,在IMDB上,默认评级为6.4。因此,一张只有2票,每张10星的电影可能仍然有6到7之间的东西。投票越多,它们的共同意义越大,评级就会从默认值中“拉开”。 Imdb还为他们的电影实现了最低票数以显示在列表中。

我觉得另一件令人困惑的事情是:为什么投票时间很重要?你不是指投票的时间吗?那么在我们的电影示例中,刚发布的电影更重要吗?

但无论如何!在这两种情况下,通常通过应用对数函数来获得良好的结果。

对于我们的电影示例电影,相关性可以乘以

1 + 1/SQRT(1 + CURRENT_YEAR - RELEASE_YEAR )

所以1是每部电影获得的套接字评级。 当前年度的电影将提升100%(200%相关性),因为上述情况将恢复正常。去年170%,2岁157%和儿子。

但是1954年或1963年的电影差异并不是那么大。

请记住:

  • 您在计算中使用的所有内容。它真的是线性的吗?可能会歪曲你的收视率吗?整个数据集中的关系是否合理?

如果你想让最近的选票投得更多,你可以用同样的方式做到这一点,但加权你的选票。如果你想让最近投票的东西“热身”,那也是有道理的......因为它目前很热,并在你的社区中讨论过。

有人说这仍然是一项艰苦的工作。很多游戏等。

让我再说一遍。

在我工作的公司,我们计算电影的相关性。

我们有一个配置数组,我们在最终相关性中存储了几个因素的“权重”。

看起来像这样:

        $weights = array(
                "year" => 2, // release year
                "rating" =>13, // rating 0-100
                "cover" => 4,  // cover available?
                "shortdescription" => 4, // short descr available?
                "trailer" => 3, // trailer available?
                "imdbpr" => 13, // google pagerank of imdb site
        );

然后我们为每个指标计算0到1之间的值。有不同的方法。但是,让我向您展示我们的评级示例(这本身就是我们抓取的几个平台的聚合评级,并且具有不同的权重等等。)

        $yearDiff = $data["year"] - date('Y');
        //year
        if (!$data["year"]){
                $values['year'] = 0;
        } else if($yearDiff==0) {   
                $values['year'] = 1;
        } else if($yearDiff < 3) {
                $values['year'] = 0.8;
        } else if($yearDiff < 10) {   
                $values['year'] = 0.6;
        } else {
                $values['year'] = 1/sqrt(abs($yearDiff));
        }

所以你看到我们硬编码了一些“年龄间隔”,并且仅仅针对较旧的电影依赖于sqrt功能。实际上差异很小所以这里的SQRT例子非常差。 但数学函数通常很有用!

例如,你可以使用像窦曲线等周期函数来计算季节性相关性!例如,你的年份范围从0到1,那么你可以使用窦功能来衡量一年中当前时间的夏季热门/冬季热门/秋季热门歌曲!

IMDB pagerank的最后一个例子。它是完全硬编码的,因为只有10个不同的值可能,并且它们不以统计同质的方式分布(pagerank 1或2甚至比没有更糟糕):

        if($imdbpr >= 7) { 
                $values['imdbpr'] = 1;
        } else if($imdbpr >= 6) {
                $values['imdbpr'] = 0.9;
        } else if($imdbpr >= 5) {
                $values['imdbpr'] = 0.8;
        } else if($imdbpr >= 4) {
                $values['imdbpr'] = 0.6;
        } else if($imdbpr >= 3) {
                $values['imdbpr'] = 0.5;
        } else if($imdbpr >= 2) {
                $values['imdbpr'] = 0.3;
        } else if($imdbpr >= 1) {
                $values['imdbpr'] = 0.1;
        } else if($imdbpr >= 0) {
                $values['imdbpr'] = 0.0;
        } else {
                $values['imdbpr'] = 0.4; // no pagerank available. probably new
        }

然后我们总结如下:

        foreach($values as $field=>$value) {
                $malus += ($value*$weights[$field]) / array_sum($weights);
        }

这可能不是你的问题的确切答案,但更广泛,但我希望我指出你正确的方向,并给你一些你的想法可以拿起的点!

使用您的应用程序获得乐趣并取得成功!

答案 1 :(得分:1)

Reddit的代码是开源的。这里对他们的排名算法进行了很好的讨论,代码为:http://amix.dk/blog/post/19588