关于热度算法

本站的热度算法采用的是Reddit给出的hot ranking算法. 其基本假设是

  • 书籍的上传时间对热度排名有较大影响: 新上传书籍会比旧书籍排名靠前
  • 书籍的下载/推送热度不会随时间的流逝而减少

算法原理

假设$t_0$是书籍上传时间, $t$是当前时间, $d$是该时间段内书籍下载量, 则我们的热度是$t,d$的一个函数:

$$ f(t,d)=\log_{10}d+\frac{t-t_0}{45000}. $$

这里, 45000表示12.5小时.

算法分析

我们称每12.5小时为一个周期. 假设在第一个周期开始时上传书籍$A$, 在第二个周期开始时上传书籍$B$. 则我们发现, 新上传的书籍$B$, 在随后的12.5小时内, 要使得热度为2, 则只需书籍的下载量是10. 但作为对比, 要使得书籍$A$在第二周期内的热度增加2, 则要求该书在第二个周期的下载量为90. 可见的确新上传的书更有优势.

关于评论算法

本站的评论算法采用的是Randall Munroe给出的. 其基本假设是

  • 每个用户的投票是独立事件; 用户只有两个选择:点赞/踩; $好评率=\frac{点赞数}{(点踩数+点赞数)}$
  • 好评率有置信区间(置信水平$1-\alpha$设为80%); 根据置信区间的下界排序; 最终的结果与评论时间无关

算法原理

根据第一条假设, 好评率$p$服从二项分布, 如果直接利用$p$作为排序依据, 那么会出现投票数少时, $p$不能真实的反映该评论的价值. 第二条改进就是引入二项分布的置信区间这个量(例如某条评论好评率是90%, 而根据统计学原理, 我们只能认为有80%的把握确实如此), 然后根据该区间的下界大小进行排序.

这里并没有采用通常的正态区间作为计算依据, 原因是它只适用于样本$n$较大的情形( $np > 5, n(1 − p) > 5$). 这里采用的是E. B. Wilson提出的修正Wilson得分区间, 其计算公式为

$$ \frac{1}{1+\frac{z^2}{n}}\left(p+\frac{z^2}{2n}\pm z\sqrt{\frac{p(1-p)}{n}+\frac{z^2}{4n^2}}\right), $$

其中$z$是$1-\alpha/2=0.9$的标准正态分布分位数, 在线计算得到$z=1.28155$. 而$n$是总投票数, $p$如前是好评率.