Reddit排名的数学算法是从哪里来的?

5
最近我在研究Reddit的算法,以确定哪些帖子是“热门”话题,哪些内容适合Reddit首页。我阅读的文章在这里:http://amix.dk/blog/post/19588。我注意到他们有数学算法,并创建了某种数学函数来确定帖子的热度/相关性。在使用的公式中,每个数学组件都来自哪里,他们如何知道要使用它们?谢谢!-- Bakz。编辑:只是为了澄清,我刚刚高中毕业,如果这个问题的答案似乎非常明显,请原谅。再次感谢!

1
看起来你发布的链接详细说明了问题。有没有具体的公式让你感到困惑?此外,你也可以考虑在math.stackexchange.com上提问。 - Tyler
似乎你已经发现了这个算法;你想知道它来自哪里吗?找到一个问题和解决方案。这与编程技能并没有太大的区别。Randall Munroe在他的一篇文章中介绍了Reddit如何对评论进行排序:http://blog.reddit.com/2009/10/reddits-new-comment-sorting-system.html - vcsjones
该图片中的最后一个公式应该可以。 - bakz
2
“他们是怎么知道使用它们的?”-- 人们对数学有很好的理解,并将其应用于各种情况中,算法创作是数学和编程中的一项主要技能。这就像问厨师如何知道使用哪些配料,或者医生如何知道你身体出了什么问题一样。 - Orbling
2个回答

22
我来处理第一个公式,关于“热门帖子”的。这样的公式是来自需求的。Reddit 的设计者思考了他们想要实现什么,并相应地设计了公式。我不能告诉你他们想到了什么需求,但我可以看看实现并猜测他们希望有这样一个系统:

  1. 只有投票数发生变化时才需要重新计算得分。这减少了对数据库的更改次数,并使在数据被复制时容易实现一致性。(所以任何基于文章年龄越久得分越低的评分系统都不好)。

  2. 如果两个故事的年龄相等,则获得更多赞成票的那个更高。(所以需要从投票中得出贡献)。

  3. 故事获得的赞成票越多,它就越长时间地保持在排名前列。

  4. 即使旧故事得到很多赞成票,也不能永远停留在排名前列。很快(一两天后),新故事就需要超过它们。 (因此需要根据日期计算贡献,这必须在很短的时间内比由于投票而导致的得分大,无论某个事物得到多少票)。

  5. 得到的反对票比赞成票多的故事根本不应出现在排名中。

现在让我们看看公式:log z + yt/45000 如何满足这些要求。

  1. 如果投票数没有改变,则 z 、 y 和 t 都未更改。所以得分没有变化。这满足了需求(1)。

  2. 如果两个故事的年龄相同,则它们具有 t 的相同值。但是获得更多赞成票的故事具有更高的 z 值,并且由于对数单调性,它具有更高的得分。这满足需求(2)。

  3. 故事得到的赞成票越多,其 z 值就越高,因此它需要更长的时间才能被具有较高 t 的其他故事超越。这满足了需求(3)。

  4. 对数是一种随着其变大而增长得更慢的函数(看看它的图形)。因此,故事需要随着时间的推移获得越来越多的赞成票才能跟上更新的故事。这满足了需求(4)。

  5. 如果故事获得的反对票比赞成票多,则 z = 1, y = -1,因此得分为负数。这满足了需求(5)。

常数45,000是一个比例因子,用于平衡赞成票和年龄。一天有86,400秒,所以每天t会增加这么多。将t除以45,000得到1.92,这意味着一天的相对新度价值为101.92 = 83票,而两天的相对新度大约价值7,000票。


2

这些并非来自某个绝对真理或需要证明的东西,只是一种以最合理方式量化某个属性的方式,由开发团队决定。

当您想让某个因素成为次要因素(尽管较大的值确实在增长,但增长速度非常缓慢)时,可以使用对数。但同样道理,他们也可以选择立方根。

这些公式只是表征那些我们可以假定属于“热点”的因素,并将它们以适当的比例组合起来的一种表示方法(例如,我们会平方那些非常重要的值,并对那些不太重要的值取对数)。

一旦他们得出了公式,他们可能会尝试用10或15种不同类型的帖子插入数字,并发现这在各方面都很有意义,所以坚持使用该公式。事实上,他们最初的几次尝试可能效果不佳,经过一些调整数字后才得到该公式。


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