好久不来博客园了,前几天更新个人状态时,也把“技术博客”四个字改成了“荒废已久的博客”。

好久不总结自己的工作和学习了,怎么说也过不去,就来这写一篇浅显的文章,没什么新鲜的内容,算是一篇经验的汇总把。

1. 关于排行榜

各大网站一般来说都少不了排行榜这个东西,一者是提供给商业合作方的数据排行榜,另一者是提供给用户的榜单。

例如豆瓣的新书榜:

2. 打造一个最简单的排行榜

我们先用豆瓣的新书榜为例,看看我们如何来一步步完善我们的榜单。

其实最初的版本很简单,既然是新书,那么我们只需要先得到最近出版的读书,例如:

select * from book where create_datetime > xxxx limit 0,10;

这样其实我们的排行榜就是可用的了。

3. 排行榜的演化

这个榜单我们应该很快就可以发现一些问题:

A. 有很多书其实质量很低,包括《21天精通ASP.NET》这样的书都能够上榜。

B. 一些书得到的关注很少,那么其实它就不值得推出来。

综上所述,我们应该在排行榜中增加两个元素:分数和收藏人数。这个时候解决方案仍然很简单:

我们其实只是加了两层过滤而已。

但是我们仍然发现了很多问题,对于一本刚刚出版的书来说,很少有人关注,一本书的“绽放期”应该在他出版的两三个月左右,那么这个时候我们就不能这样暴力地利用时间来排序了,此外我们依然需要书条目的Rank问题,现在我们的Rank完全是依赖于时间。

4. 半衰期的引入

我们来重新设计一下整个排行榜的算法,首先,我们整理一下思路,既然是新书榜,无疑我们需要要把时间的概念放大化,但是我们却不能让时间占据过大的因素,而只应该让他成为各种因素的一部分,分配给其较大的权重。

另外一点,我们并非认为昨天和今天出版的书有什么差别,而是涉及到一个逐渐衰减的过程。那么我们第一个想到的应该是高中物理一个基本的概念:半衰期。让我们来复习一下下半衰期的公式:

m = M * (1/2) ^ (t/T)

我们来解释下该公式的含义:M 为初始值,m为反应后的值,t为反应的时间,T为半衰期。

我们把该公式作用于出版时间上,以天作为单位,以一周作为半衰期,从而得到这样的一条函数曲线:

接下来我们考虑分数的因素,其实有两种方案可选择,第一是把分数的因素和之前得到的分数相乘,第二是采用指数的方式。可是由于之前的时间标准<1,函数是一个递减的曲线,所以如果我们需要让分数的评价正作用于之前的函数曲线,我们则需要将分数取反。由于之前我们过滤掉了3分以下的图书,所以我们将分数的参数也归一。(这里我采用第二种,全凭拍脑袋的喜好)从而会这样定义我们的算法:

最后一个因素是收藏人数的因素,我们只是归一然后简单相乘即可。

这样我们便出来了一个相对完善排行榜。

5. 排行榜面临的主要问题

其实排行榜更多的是业务问题,而不是算法问题,当我们面对着一个排行榜需求时,我们需要的是先来整理,这个排行榜,我们需要综合哪些因素,这些因素在整个排行榜的Rank中究竟占据多大的比重。然后,我们只需要一个简单的乘法,或者对数即可解决大多数的问题。

那么对于大多数网站的排行榜来说,无外乎这样几个因素,条目的质量,条目的点击率,条目的收藏率等等。而条目的排行榜又往往出现在网站的首页,例如百度听:

如果我们不做任何的优化,则会出现排行榜面临的最大的问题:马太效应。

6. 马太效应

什么是马太效应,我们可以先来看下网上的解释:

马太效应(Matthew Effect),指强者愈强,弱者愈弱的现象,广泛应用于社会心里学,教育,金融等领域。

那么换到我们的排行榜上也就是,越放到排行榜上,他的收听就越多,收听越多,他就越在排行榜上,这样的一个循环。

对于解决马太效应,工程界提出了很多算法,最著名的包括Reddit,Hacker News的Ranking算法,以及我之前提出过的半衰期算法。

我们接下来来逐个介绍一下,并且比较他们的优缺点。

7. Reddit算法

我们先来看下Reddit算法的公式:

其实Reddit的原理很简单,用发表时间减去固定时间来表示某帖子的新鲜程度,x则表示某帖子的受欢迎程序,然后讲这个参数取对数则是因为该参数的受热度影响较大,产生的值会和另外的时间结果不在同一个数量级上。

而至于10和45000,则属于一个trial-and-error,是算法工程师最头疼的地方,因为该参数并说不出太多的理论道理,只能根据人眼的结果来微调。

8. Hacker New的Ranking算法

这个算法就更为简单:

(p – 1) / (t + 2)^1.5

p来代表这个帖子被推荐的次数,-1则是去掉作者自己的推荐,然后除以时间的一个指数。其中的2和1.5也是一个trial-and-error。

9. 以上算法的优劣

首先是Hacker News的算法,我们从公式即可看出,这个算法的设计是比较简陋的,时间占据了很大的因素,即便是推荐较多的文章,也会被很快的沉没:

相对来说:Reddit的算法设计较为巧妙,但是Reddit的局限性是对负反馈的要求也比较高,在之前的一个项目中,我尝试过使用Reddit的算法,但是发现如果没有了负反馈,其实消减的效果也比较差。

最后是半衰期的算法,半衰期的算法是我最为推崇的算法,他不依赖于负反馈,而且它的职责很单一,他很专一地来解决时间衰减的问题,然后我们则可以把其他的因素来用单独的方式来计算。最重要的一点是,他的参数是可解释的,Half-life的值,我们是可以根据业务逻辑来解释,比如我们认为一部电影的热门期就应该是一个星期,那么我们则可以把半衰期设置为7,7天后,这个电影的分值则会发生一个较大程度的衰减。这一点是之前的两个算法所无法比拟的。

作为算法工程师, trial-and-error是需要极力避免的,也就是说我们可以从学术界中去得到算法的框架,但是我们要竭力来保持参数的可解释性。

10. 综述

排行榜是一个重业务而轻算法的需求,而且是一个几乎所有网站都会通用的需求,这个需求说简单也简单,说复杂更复杂。

也有例如近日很火爆的AppStore,也包括豆瓣电影等很多Spammer来刷排名的现象,这就不仅仅需要考虑到马太效应,也包括Anti-spammer的领域。

如果我们把推荐系统这个领域给分成个性化推荐和非个性化推荐,那么排行榜一定是非个性化推荐中最重要的一部分了。

java 排名算法_排行榜的算法相关推荐

  1. 【Matlab】智能优化算法_蜻蜓优化算法DA

    [Matlab]智能优化算法_蜻蜓优化算法DA 1.背景介绍 2.灵感 3.公式推导 3.1 勘探和开发操作 4.算法流程图 5.文件结构 6.伪代码 7.详细代码及注释 7.1 DA.m 7.2 d ...

  2. 【Matlab】智能优化算法_蚁狮优化算法ALO

    [Matlab]智能优化算法_蚁狮优化算法ALO 1.背景介绍 2.基本思想 3.公式推导 3.1 ALO算法的运算符 3.2 蚂蚁的随机游动 3.3 困在蚂蚁坑里 3.4 修建陷阱 3.5 蚂蚁划向 ...

  3. 【Matlab】智能优化算法_灰狼优化算法GWO

    [Matlab]智能优化算法_灰狼优化算法GWO 1.背景介绍 2.基本思想 2.1 等级制度 2.2 狩猎方式 3.公式推导 3.1 社会等级制度 3.2 包围猎物 3.3 包围猎物 3.4 攻击猎 ...

  4. java红包记录_微信红包算法(java)

    package com.example.ant.common.tools; import java.util.LinkedList; import java.util.List; /** * 描述:红 ...

  5. java 最少使用(lru)置换算法_缓存置换算法 - LRU算法

    LRU算法 1 原理 对于在内存中并且不被使用的数据块就是LRU,这类数据需要从内存中删除,以腾出空间来存储常用的数据. LRU算法(Least Recently Used,最近最少使用),是内存管理 ...

  6. ec java sm2证书_国密算法SM2证书制作

    前段时间将系统的RSA算法全部升级为SM2国密算法,密码机和UKey硬件设备大都同时支持RSA和SM2算法,只是应用系统的加解密签名验证需要修改,这个更改底层调用的加密动态库来,原来RSA用的对称加密 ...

  7. 国密算法java源码_国密算法SM2证书制作

    前段时间将系统的RSA算法全部升级为SM2国密算法,密码机和UKey硬件设备大都同时支持RSA和SM2算法,只是应用系统的加解密签名验证需要修改,这个更改底层调用的加密动态库来,原来RSA用的对称加密 ...

  8. java红包金额随机数算法_实时随机数算法(微信红包分配算法)

    微信红包算法在知乎上面有个专题讨论,其实红包的发放的随机算法,有两种作法:java 一.预生产: 算法 无外乎是在发红包的时候,随机去把金额生成到某个容器当中,而后要用的时候,一个一个的POP:微信 ...

  9. java 投票算法_摩尔投票算法 - woshixin的个人空间 - OSCHINA - 中文开源技术交流社区...

    摩尔投票算法(Moore majority vote algorithm) 这个在wiki的介绍在https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_m ...

最新文章

  1. 5G + 边缘计算系列文章
  2. 零序电流计算软件_低压零序电流互感器的选择配置
  3. 蔡先生论道大数据十九:王羲之与大数据
  4. vue cli 项目在打包时候报错 API fatal error handler returned after process out of memory
  5. 【Paper】2011_Distributed fault detection for interconnected second-order systems
  6. 计算机主机安装系统安装系统,系统重装
  7. python多个main方法_Python,main方法未运行(同一文件中有多个类)
  8. 流程制造项目中关于销售订单数量与实际产生数量不同时的解决方案
  9. AllenAI 发布万能问答系统 MACAW!各类题型样样精通,性能大幅超越 GPT-3!
  10. 华为P40系列发布!新机皇临世,售价首次过万!
  11. php-5.4 升级到 php7.2
  12. 图文详解YUV420数据格式
  13. 如何设计测试用例?为什么要设计测试用例?
  14. Mac怎么方便看节假日安排,添加中国法定节假日安排
  15. Windows7桌面图标蓝底阴影怎么解决?
  16. 网站卡死服务器2008,winserver2008r2频繁卡死?
  17. 俞敏洪-精彩绝伦的人生
  18. 计算机网络连接黄感叹号,电脑网络图标上出现黄色感叹号不能上网解决方法
  19. 安卓android记单词软件
  20. 【win技巧】Windows10支持快捷键右键菜单新建文本文档

热门文章

  1. stm32f103c8串口USART1发送多一字节
  2. Java就业方向和自学提升方法总结黑马就业班资源分享
  3. Jupyter notebook文字排版笔记
  4. 杭州随笔之欲把西湖比西子
  5. css实现旋转的小箭头
  6. 数字化的下一个目标,就是产业链|数字思考者50人
  7. 小米平板1刷独角兽系统、救砖-玩机技巧软件-刷los系统
  8. 用8051单片机编程由P1.0和P1.1引脚分别输出周期为1ms和500us的方波
  9. 像素生存显示服务器不可用,生存游戏3无法连接服务器是什么原因
  10. istqb纸质证书_高大上但含金量极高的ISTQB认证考试容易过吗