数学之美:Hacker News的热门排名算法

    Hacker News 是一家关于计算机黑客和创业公司的社会化新闻网站,由 Paul Graham 的创业孵化器 Y Combinator 建立。与其它社会化新闻网站不一样的是 Hacker News 没有踩或反对一条提交新闻的选项(不过评论仍是能够被有足够 Karma 的用户投反对票,或是投支持票);只能够赞或是彻底不投票。简而言之,Hacker News 容许提交任何能够被理解为“任何知足人们求知欲”的新闻。html

    

    每一个新闻标题前面有一个向上的三角形,若是你以为这个内容很好,就点击一下,投上一票。根据得票数,系统自动统计出热门文章排行榜。可是,并不是得票最多的文章排在第一位,还要考虑时间因素,新文章应该比旧文章更容易获得好的排名。算法

    Hacker News 采用公式 (p - 1) / (t + 2)^1.5 作为排行依据(Hacker News使用Paul Graham开发的Arc语言编写,源码能够从arclanguage.org下载),其中P是投票数量,t是发表以来的时间,小时计。后来AMIX.DK 给出公式 Score = (P-1) / (T+2)^G 推广了上面的公式,Hacker News的公式变成了一个特例,其在G=1.5时的应用。历史上Hacker News有用G=1.8。网络

    第一个因素是得票数Ppost

    在其余条件不变的状况下,得票越多,排名越高。从下图能够看到,有三个同时发表的帖子,得票分别为200票、60票和30票(减1后为19九、59和29),分别以黄色、紫色和蓝色表示。在任一个时间点上,都是黄色曲线在最上方,蓝色曲线在最下方。网站

    

    为何是P-1?网络上的一种解释是,不少文章做者在提交的时候会给本身投上一票。其实更重要的缘由是文章发布初期的投票数对排名影响很是的,仅仅是本身给本身投的一票,也占很是大的做用。htm

    假设P不去减去1,那公式为: p / (t + 2)^1.5blog

    若是一个做者发布完就给本身投票,那么文章的得分为1/(0+2)^1.5=0.3535 。假设另一篇文章发布了8小时,那么须要多少的投票呢?x/(8+2)^1.5>0.3535 X>11.17~ 即一天前的帖子要有12票才能超过新提交的文章,这显然不合理。开发

    这个具体减多少还要视网络环境而定,要是换在国内,估计P-100还不够。另外若是你不指望“高投票文章”与“低投票文章差距过大,能够在得票数上加一个小于1的指数,好比(P-1)^0.8。get

    第二个因素是距离发帖时间T源码

    在其余条件不变的状况下,越是新发表的帖子,排名越高。或者说,一个帖子的排名,会随着时间不断降低。

    从前一张图能够看到,通过24小时以后,全部帖子的得分基本上都小于1,这意味着它们都将跌到排行榜的末尾,保证了排名前列的都将是较新的内容。

    若是,用户的第一个投票是在当前,1小时,2小时得到时,这个曲线的变化是什么呢?以下图,曲线斜率从大到小分别是当前、1小时、2小时。能够看到第一个投票的做用不断弱化,其权重不断下降。

    

    第三个因素是重力因子G

    它的数值大小决定了排名随时间降低的速度。从下图能够看到,三根曲线的其余参数都同样,G的值分别为1.五、1.8和2.0。G值越大,曲线越陡峭,排名降低得越快。

    

    为何G=1.5,首先,G是干吗的。毫无疑问,G这个数字既非时间,也非评价,其实它的主要目的是控制更新频率。G的值越大,score的衰减速度越快,排行的更新越频繁。因此,肯定G值须要观察系统内部投票数在时间上的分布,而后根据须要的更新频次肯定G的合理取值。越火爆、用户互动越频繁的社区,为了保证排行的稳定性(不要频繁大量的刷新),G值趋向于比较低。这就是为何Hacker News从一开始的1.8修改为1.5,过段时间可能就变成1.2了。

    拓展阅读:基于贝叶斯算法的IMDB排名

    参考文章:http://amix.dk/blog/post/19574