最近我在查看Reddit的算法,以确定哪些帖子是“热门”主题,哪些内容适合reddit主页。
我正在阅读的文章在这里: http://amix.dk/blog/post/19588
我注意到他们有数学逻辑,并创建了某种数学函数来确定帖子的热度/相关性。
在使用的公式中,每个数学组件的来源是什么?他们如何知道使用它们?
谢谢你!- Bakz
编辑:只是为了澄清,我刚刚高中毕业并道歉,如果这个问题的答案看起来很明显。再次感谢!答案 0 :(得分:22)
我将解决第一个公式,即帖子的“热度”。像这样的公式来自要求。 Reddit的设计师已经考虑了他们想要实现的目标,并相应地设计了公式。我无法确切地告诉你他们想到了什么要求,但我可以看看实现并猜测他们想要一个系统:
除非投票数改变,否则不需要重新计算分数。这减少了对数据库的更改次数,并且在复制数据时更容易实现一致性。 (因此,任何基于分数越低的评分系统随着文章的老化而变得不好)。
如果两个故事同样陈旧,那么赞成更多的故事应该更高。 (所以需要得到投票的贡献。)
故事得到的支持越多,它应该保持在排名靠前的时间越长。
老故事不应该永远保持在排名的前列,即使他们有很多赞成票。相当快(一两天之后),新故事需要超越它们。 (因此,需要从日期开始做出贡献,并且由于投票很快就会超过分数,无论得到多少票。)
有更多downvotes而不是upvotes的故事根本不应出现在排名中。
现在让我们看一下公式:log z + yt / 45000,看看它是如何满足这些要求的。
如果投票数没有变化,那么 z , y 和 t 都不变。所以得分没有变化。这满足要求(1)。
如果两个故事的年龄相同,则 t 的值相同。但是有更多upvotes的那个具有更高的 z 值,并且由于log是单调的,所以它具有更高的分数。这满足要求(2)。
故事越多, z 越高,所以在 t 更高的另一个故事可以超越它之前的时间越长。这满足要求(3)。
对数是一个随着变大(take a look at its graph)而变得越来越慢的函数。因此,随着时间的推移,一个故事需要越来越多的关注以跟上新故事。这符合要求(4)。
如果故事有更多的downvotes而不是upvotes,则 z = 1且 y = -1,因此得分为负。这满足要求(5)。
常数45,000是一个比例因子,可以使投票和年龄达到平衡。一天有86,400秒,因此 t 每天都会增加这个数量。将 t 除以45,000给出1.92,这意味着一天的相对新价值是10 1.92 = 83票,两天的相对新价值约为7,000票。
答案 1 :(得分:2)
他们不是来自任何地方。他们没有绝对的真理,也没有什么可以证明的。它只是一种量化属性的方法,它是开发团队看来最明智的方式。
当你想要一些因素时,你会使用日志,虽然不太重要(因为大的值确实增长,但速度很慢)。但出于同样的原因,他们可以选择立方根。
这些公式只是我们可以假设那些特征属于“热”的因素的代表,以及它们的组合,以适当的比例考虑每一个(例如,我们将对那些具有重要意义的值进行平方,并记录那些较少的值。
一旦他们提出了这个公式,他们可能会想出10或15种不同类型的帖子并插入数字,并且看到它在整个过程中都很有意义,所以坚持下去。事实上,最初几次尝试可能没有那么好,并且在对这些数字进行了一些调整之后就达到了这个公式。