打分排序系统漫谈1 - 时间衰减

打分排序系统的应用非常普遍,比如电影的评分,知乎帖子的热度,和新闻文章的排序。让我们从最简单直观的平均打分开始, 聊聊各种打分方法的利弊和使用场景。

最简单的打分方法当然是一段时间的点赞量综述。显而易见的缺点就是越老的帖子容易拿到更多的赞而长期霸榜,HN用了一种简单的时间方法来考虑时间衰减。

Hacker News Algo - 只有点赞

\[
\begin{align}
score & = \frac{(v-1)}{(t+2)^G} * pen \ where & v-1 剔除只有一个用户点赞的情况 \ & t+2 保证除数永远大于1 \\
& G:衡量打分随时间的衰减程度 \\
&pen: 争议,过短,没有跳转的文章打分会打折\\end{align}
\]

def hacker_news_ranking(votes, item_age, gravity = 1.8, penalties):
    score = (votes-1)/(item_age +2)**gravity * penalties
    return score 

Hacker News 的打分方式,主要考虑到了时间衰减。保证老的新闻不会因为累计更多的点赞而始终在排在前面。并且点赞数和帖子新旧程度的权衡可以通过G的大小来调整。但仍然有几个未解问题:

  1. 时间衰减过快,对于一些有长实效性的打分并不适用。能否在打分上加入指数?
  2. 如何考虑时间衰减和当前时段的关系。不同时段浏览量不同,如果一篇很好的文章在凌晨发布,因为当时浏览量低,文章可能永远没有置顶机会。能否对时间进行加权?
  3. 没有考虑到点赞量和文章热度的非线性关系。简单说就是点赞量可以接近无限大,但文章热度是有限的。能否对打分进行非线性压缩?
  4. 不同类型文章热度是否可比,例如有的文章质量高但是相对小众。能否做组内排序?或者用点赞率来衡量
  5. 同理也应该考虑到浏览量(PV)和点赞量的关系。点赞率高的应该考虑排在前面,但同样浏览量过小的点赞率也要考虑置信度的问题

Reddit Hot Formula - 包括点赞和拍砖

同时考虑点赞和拍砖,Reddit 的 Hot Formula采用了和Hacker News相似的打分方式,来推荐优质高热度的文章。并针对上述问题(1)和(3)给出了不同的处理。公式如下:

\[
\begin{align}
score & = up - down \score_{adj} & = \log_{10}{(max(score,1))}\sign &= \begin{cases}
1 & if score > 0 \ 0 & if score = 0 \ -1& if score <0 \ \end{cases}\score &= score_{adj} * sign + \frac{seconds}{45000} \where \, seconds & =发帖时间 - 2015年12月8日
\end{align}
\]

和Hacker News相比, Reddt Hot Formula有几个不同点:

  • 用取Log的方式解决了上述提出的第三个问题就是文章热度和点赞量之间的非线性关系,文章热度不会随着点赞量的增加无限线性增长。而压缩的强度可以通过改变log的底数来调整,底数越大点赞量对文章的影响
  • 处理时间递减上,Hot Formula采用了线性递减处理。新的帖子因为距历史时点更远会拿到更高的时间加分项\(\frac{seconds}{45000}\)。和上述指数衰减相比,线性不会过度惩罚老文章。

思考:时间衰减

比较Hacker News,和Reddit Hot Formula, 主要的两点区别在于对点赞量(拍砖)取log进行压缩,以及不同的时间衰减项。 log运算单调所以如果只用排序不用分数的话并不会对最终排序产生影响,所以让我们再来深入讨论一下时间衰减项的选取。

简单来说时间衰减的意义就是为了让新老文章的热度具有可比性,否则老的帖子会因为在更长的时间累计了更多的帖子而始终置顶。一种直观的解决办法就是给老的帖子增加时间惩罚项。几种常见的时间衰减项包括:

  • 线性衰减

    \[
    score_t = score_0 - T/G
    \]

  • 幂指数衰减

    \[
    score_t = score_0 / (T + 2)^G
    \]

    幂指数衰减的衰减速度会随着时间加速,加速时间惩罚项对打分的影响。如果觉得幂指数的表达形式不够直观,我们可以对等式左右取个对数,会发现对数打分的变化是对数时间的线性函数,可以用这个方式来判断幂指数打分是否适用,如下:

    \[
    log(score_t) = log(score_0) - G * log(T+2)
    \]

  • 指数衰减

    \[
    score_t = score_0 * exp( - \lambda * T )
    \]

    指数衰减可以由牛顿冷却定律的一阶微分方程得到,\(\lambda\)是衰减速率,速率恒定,经过t时间衰减的量和N当前的值正相关

\[
\frac{dN(t)}{dt} = - \lambda N(t) \\
\frac{dN(t)}{N(t)} = -\lambda dt \log(\frac{N(t)}{N_0}) = - \lambda t \\
\]

也可以从指数分布的角度来理解,\(N_0\)是集合初始的元素数量,其中每个元素都在衰减,在t时刻依旧存在的元素数量期望是\(N(t)\)。元素的生命长度符合指数分布:

\[
f(t) \sim \lambda e^{-\lambda t} \P(x>t) = 1 - F(x<t) = e^{-\lambda t } \\
N(t) = N_0 * P(x>t)
\]

下一节我们接着就上述提出的几个问题中还没有解决的如何综合考虑浏览量和点赞量来打分的问题进行讨论。

To be continue



Reference

  1. http://www.evanmiller.org/rank-hotness-with-newtons-law-of-cooling.html
  2. http://www.ruanyifeng.com/blog/2012/02/ranking_algorithm_hacker_news.html
  3. https://medium.com/hacking-and-gonzo/how-reddit-ranking-algorithms-work-ef111e33d0d9

原文地址:https://www.cnblogs.com/gogoSandy/p/10354592.html

时间: 2024-08-30 11:17:43

打分排序系统漫谈1 - 时间衰减的相关文章

打分排序系统漫谈3 - 贝叶斯更新/平均

打分排序系统漫谈3 - 贝叶斯更新/平均 标签(空格分隔): 博客园 统计 打分系统 待完成 上一节我们聊了聊用Wilson区间估计来处理小样本估计,但从原理上来说这种方法更像是一种Trick,它没有从本质上解决样本量小的时候估计不置信的问题,而是给估计加上一个和样本量相关的置信下界,然后用这个下界替代估计进行打分. 想要从本质上解决小样本估计不置信的问题,一个更符合思维逻辑的方法是我们先基于经验给出一个预期估计,然后不断用收集到的样本来对我们的预期进行更新,这样在样本量小的时候,样本不会对我们

打分排序系统漫谈2 - 点赞量?点赞率?! 置信区间!

在第一篇打分系统漫谈1 - 时间衰减我们聊了两种相对简单的打分算法Hacker News和Reddit Hot Formula,也提出了几个这两种算法可能存在的问题,这一篇我们就其中的两一个问题进一步讨论: 如何综合浏览量和点赞量对文章进行打分[期望效用函数->点赞率] 如何解决浏览量较小时,点赞率不置信的问题[wald Interval -> wilson] Reddit Hot Formula? 期望效用函数! 让我们从上一篇我们提到的Reddit Hot Formula来说起,抛开文章质

Java实现一个排序系统

package com.sortsystem; /** * @ClassName User * @Description 排队的人 * @Author Administrator * @Date 2019/5/30 21:10 * @Version 1.0 **/ public class User { private int Id; String name; int seq; // 排队的序号 public User(int id, String name) { Id = id; this.n

solr特点三: boost(改变默认打分排序)

有时候默认的字段打分不能满足我们的需要,如我们想把关键词出现在标题中的优先显示. 测试于:Solr 4.5.1, Jdk 1.6.0_45, Tomcat 6.0.37 | CentOS 5.7 实现方法有3个: 在建索引的时候设置boost,这个值会写入文件,建索引时有额外的性能开销: 在查询的时候指定boost,这个值不会写入文件,查询时指定任意字段的boost值,适用与一个索引库的多种查询场景,但查询时有额外性能开销: (推想)前两者结合使用,如绝大多数都需要标题优先,那么建索引时可指定标

深入浅出排序学习:写给程序员的算法系统开发实践

引言 我们正处在一个知识爆炸的时代,伴随着信息量的剧增和人工智能的蓬勃发展,互联网公司越发具有强烈的个性化.智能化信息展示的需求.而信息展示个性化的典型应用主要包括搜索列表.推荐列表.广告展示等等. 很多人不知道的是,看似简单的个性化信息展示背后,涉及大量的数据.算法以及工程架构技术,这些足以让大部分互联网公司望而却步.究其根本原因,个性化信息展示背后的技术是排序学习问题(Learning to Rank).市面上大部分关于排序学习的文章,要么偏算法.要么偏工程.虽然算法方面有一些系统性的介绍文

【学习ios之路:Objective-C】OC中常用的系统排序方法

①.OC中常用排序方法: 1).不可变数组 - (NSArray *)sortedArrayUsingSelector:(SEL)comparator; - (NSArray *)sortedArrayUsingComparator:(NSComparator)cmptr; 2)可变数组 - (void)sortUsingSelector:(SEL)comparator; - (void)sortUsingComparator:(NSComparator)cmptr; 3).字典排序 - (NS

达观数据搜索引擎排序实践

前言 随着互联网的深入发展,人类已然进入大数据时代.如何在浩瀚的数据海洋里高速有效的获取有价值的信息,正是促使大数据技术具备走向众多企业的潜力.搜索引擎作为获取信息的有效入口,已然经历了20多年的发展,并一直试图理解用户搜索意图以及提升搜索的精准性. Google是全球性的搜索引擎,看似简单的搜索框背后隐藏的是极其复杂的系统架构和搜索算法,其中排序(以下统称Ranking)的架构和算法更是关键部分.Google正是通过PageRank算法深刻改变搜索排序而一举击败众多竞争对手. Ranking是

【学习排序】Learning to Rank中Pointwise关于PRank算法源码实现

最近终于忙完了Learning to Rank的作业,同时也学到了很多东西.我准备写几篇相关的文章简单讲述自己对它的理解和认识.第一篇准备讲述的就是Learning to Rank中Pointwise的认识及PRank算法的实现.主要从以下四个方面进行讲述: 1.学习排序(Learning to Rank)概念 2.基于点的排序算法(Pointwise)介绍 3.基于顺序回归(Ordinal Regression-based)的PRank排序算法 4.PRank算法Java\C++实现及总结 一

深度学习在美团点评推荐平台排序中的应用--学习笔记

写在前面:据说下周就要xxxxxxxx, 吓得本宝宝赶紧找些广告的东西看看 gbdt+lr的模型之前是知道怎么搞的,dnn+lr的模型也是知道的,但是都没有试验过 深度学习在美团点评推荐平台排序中的运用 原创 2017-07-28 潘晖 美团点评技术团队 美团点评作为国内最大的生活服务平台,业务种类涉及食.住.行.玩.乐等领域,致力于让大家吃得更好,活得更好,有数亿用户以及丰富的用户行为.随着业务的飞速发展,美团点评的用户和商户数在快速增长.在这样的背景下,通过对推荐算法的优化,可以更好的给用户