工业界完整推荐系统的设计。结论是: 没有某种算法能够完全解决问题, 多重算法+交互设计, 才能解决特定场景的需求。下文也对之前的一些博文进行梳理,构成一个完整工业界推荐系统所具有的方方面面(主要以百度关键词搜索推荐系统为例)

完整的推荐系统肯定不会只用一种推荐算法

在学术界, 一般说到推荐引擎, 我们都是围绕着某一种单独的算法的效果优化进行的, 例如按内容推荐, 协同过滤(包括item-based, user-based, SVD分解等),上下文推荐,Constraint-based推荐,图关系挖掘等。 很多比较牛的单个算法, 就能在某个指标上取得较好效果, 例如MAE,RMSE。。。不过有自己的优点, 每种算法也有自己的缺点, 例如按内容推荐主要推荐和用户历史结果相似的item,一般的item-based容易推荐热门item(被更多人投票过)。。。。   所以在工业界,例如各互联网公司, 都会使用多种算法进行互相配合, 取长补短, 配合产品提升效果。而且在完整的推荐系统中,不仅有传统的Rating推荐, 还需要辅以非常多的挖掘, Ranking来达到预期效果

推荐系统3大件:User Profile、基础挖掘推荐、Ranking

在实践中, 一个完整的推荐系统会主要由3部分组成:

  1. User Profile
  2. 基础推荐挖掘算法
  3. Ranking

User Profile

A user profile is a representation of information about an individual user that is essential for the (intelligent) application we are considering user profile主要是用户(注册)信息,以及对用户反馈的信息进行处理,聚合,用于描述用户的特征; 是后续推荐和排序的基石。 一般情况下,user profile会包含以下具体内容:

  1. 用户兴趣数据
  2. 用户的基础注册信息,背景信息:例如用户出生地,年龄,性别,星座,职业等。这些信息一般从用户注册信息中获取;例如高德,百度地图注册用户,淘宝注册用户等
  3. 用户行为反馈:包括显示的反馈(explicit)和隐藏(implicit)的反馈,显示的反馈包括用户的评分,点赞等操作,百度关键词搜索推荐工具上的点赞(正向显示反馈)和垃圾桶(负向显示反馈),淘宝上的评分;隐式反馈包括用户的浏览行为,例如在百度关键词搜索推荐上搜过那些词,淘宝上点击了那些页面,在高德上点击了那些POI等
  4. 用户交互偏好例如用户喜欢使用哪些入口,喜欢哪些操作,以及从这些操作中分析出来的偏好,比如在高德地图上根据用户行为反馈分析出来的用户对美食的偏好:更喜欢火锅,粤菜,还是快餐
  5. 用户上下文信息:这些信息有些是分析出来的,例如在LBS中分析出来的用户的家在哪儿,公司在哪儿,经常活动的商圈,经常使用的路线等

user profile经常是一份维护好的数据,在使用的时候,会直接使用该数据,或是将该数据存储在KV系统中,供Online系统实时使用。 在搜索或是推荐的场景下,每次请求一般只会涉及到一次user profile的KV请求,所以online使用的时候,主要的实现困难是存储,以及快速KV的快速响应。

基础挖掘推荐算法

基础挖掘推荐算法, 主要使用传统推荐算法, 结合分析的item profile和user profile, 建立user和item的关系,此时并不会过多考虑其他因素,例如是否冷门/热门,最主要的就是建立user和item的关系。 在各种论文中狭义的推荐,主要就是指该部分内容。 主要围绕着Rating,以及Top N进行该处的Top N(更像是直接Rating值最高的Top N) 传统的推荐算法研究主要围着这块工作进行,现在已经有很多比较成熟的算法,这些算法相关的研究可参见博文:《推荐系统经典论文文献及资料》;其中也能找到到业界较多成功推荐系统的实践分享 主要包含以下几类:

  1. Content Based推荐: 按内容推荐,主要的工作是user profile, item profile的提取和维护,然后研究各种相似度度量方法(具体相似度度量参见博文:《推荐系统中的相似度度量》)
  2. 协同过滤:相当于应用了用户的行为进行推荐(区别于Content based算法),比较经典的算法包括传统的item-based/user-based算法(参见博文:《协同过滤中item-based与user-based选择依据》,《collaborative-filtering根据近邻推荐时需要考虑的3要素》),SVD,SVD++(具体原理及源码参见博文:《SVD因式分解实现协同过滤-及源码实现》)
  3. 上下文相关推荐:和传统推荐相比, 考虑更多上下文因素,LBS, 移动场景下使用比较多(具体参见博文:《context-aware-recommendation》)
  4. 基于图的关系挖掘推荐:主要是利用图论原理,根据item,user之间的数据,反馈关联关系,挖掘更深层次的关系进行推荐,该类方法一般效果都不错,当然资源要求也较高。具体参见博文:《级联二步图关系挖掘关键词推荐系统》,《频繁二项集合的hadoop实现》《itemrankrandom-walk-based-scoring-algorithm-for-recommener-system》
  5. Constrainted-based推荐:根据限制性条件进行演绎推荐

在实际应用时,我们经常使用按内容推荐,item-based寻找从感知的角度比较靠谱的结果,使用SVD,SVD++,图关系寻找更深层次的联系结果。同时在推荐时,会结合很多因素来进行综合排序,例如关键词, 或是LBS中POI的热度等。具体可参见下文ranking部分。

算法效果衡量

以上这些算法, 我们在离线的时候,使用Cross-Validation方式,就可以分析出其效果,而且离线分析的时候,代价比较小,比较容易操作。当然,对于不同的问题会使用对应的指标进行衡量。 对于预测Rating准确性主要是用RMSE,或是MAE;具体可参见博文:《关键词搜索推荐系统中的推荐准确性度量》 如果是排序, 则更多使用NDCG,MAP,  MRR等指标;具体可参见博文:《使用ndcg评估关键词推荐系统的相关性》 在具体应用场景中,对于特定推荐问题,会涉及到选用哪种算法的问题。推荐不像CTR预估这样的问题,目标比较单一,经常我们需要考虑多个指标,而且这些指标可能此消彼长,需要做权衡,例如需要考虑算法的准确性(accuracy),同时也需要考虑算法的覆盖(coverage),置信度(confidence),新鲜度(novelty)和惊喜度(Serendipity),同时还需要考虑推荐为系统带来的收益和效用(utility)。 这些指标经常需要权衡,而且经常提升某一个的时候会导致其它下降,所以有时候存在一定的主观性:我们到底看中哪一个指标?  而且这个问题可能随着系统,平台所处的阶段而不同。 例如在建立口碑的时候,我们可能不太关注coverage,而更关注accuracy,因为要让用户建立一种:该系统很准的认知;如果在系统已经比较成熟了,此时可能需要考虑novelty, serendipity的同时,还需要考虑utility:该推荐能为系统带来什么收益,例如对百度的变现有多大收益? 对淘宝的销售有多少收益等 具体这些指标的选择可参见博文:《选择推荐算法时需要考虑得因素》

Ranking

此部分是成熟的搜索、推荐系统具有的核心逻辑

比较简单的实现方法, 是直接对各种特征拍阈值进行线性加权,比较成熟的系统一般会使用机器学习的方式和综合个维特征, 学习出模型后进行排序, 例如使用Learning to rank技术。 该部分需要考虑的因素较多较为复杂。 和传统的推荐相比, 此处单独将Ranking拿出来。 基础推荐挖掘, 和传统的推荐部分比较类似,主要结合user profile, 挖掘哪些item适合推给哪些user。 但仅根据这些挖掘就直接进行推荐是不够的。 真实online推荐场景中, 需要考虑更多其他因素, 例如:相关性,推荐的上下文,CTR预估,以及商业业务规则。

  1. 相关性: item与用户的相关性,这是大多数搜索和推荐任务的基石,例如在搜索中判定一个query和一个document的相关性,或是一个query 和 另一个query的相关性,或是在特征比较多的情况下, 一个user 和一个item 记录的相关性;实现方式可以很简单,例如传统的相似度度量方式(参见博文:《推荐系统中的相似度度量》),对于文本,业界使用简单的TF*IDF,或是BM25; 不过很多时候我们需要增加更多维度特征,包括推荐item本身的重要性,例如IDF,Pagerank(具体参见博文:《pagerank的经济学效用解释》),同时使用模型来提升相关性判断的准确性。使用模型的方式会更加复杂,但效果提升也非常明显。具体可参见博文:《集成树类模型及其在搜索推荐系统中的应用》,《分类模型在关键词推荐系统中的应用》,《adaboost》
  2. 推荐的上下文:例如推荐产品的入口,交互方式, 不同的入口,甚至同一入口的不同交互方式, 推荐的结果有可能都需要不一样; 在LBS生活服务中, 请求发生的时间, 地点也是推荐需要重点考虑的上下文因素,例如饭点对餐饮item的提权; 异地情况下对酒店等结果的加权等
  3. CTR预估:成熟的商业系统都会使用模型来完成CTR预估,或是转化预估
  4. 以及商业业务规则:例如黑白名单,或者强制调权。例如在百度关键词搜索推荐中,某些有比较高变现潜力的词, 就应该加权往前排; 比如在高德LBS服务中,有些海底捞的店点评评分较低, 但我们也应该往前排;或是在搜索引擎中,搜国家领导人的名字, 有些最相关的结果可能因为法律因素是需要屏蔽的

本文转自http://semocean.com

一个完整推荐系统的设计实现相关推荐

  1. 一个完整的交互设计步骤有哪些

    本文由:"学设计上兔课网"原创,图片素材来自网络,仅供学习分享 一个完整的交互设计步骤有哪些?很多朋友在问交互设计过程中的步骤有哪些?一般而言,交互设计师都遵循类似的步骤进行设计, ...

  2. FPGA--(verilog)一个完整工程的设计(包含设计块和激励块)及仿真

    1. 模块设计完成之后,我们需要检验功能的正确性,通过设计激励块来完成测试.(可以把激励块理解成一个新的设计块,但是又和原来的设计块存在联系) 将激励块和测试块分开设计是一种良好的设计风格.激励块一般 ...

  3. 3天时间,给你一个完整的APP设计模型

    第一步:需求梳理.分析 1.产品功能导图:Xmind 2.构思产品功能列表: 第二步:产品原型图绘制 产品功能需求梳理清楚之后,就可以绘制产品原型图.搞清楚各个功能板块如何在APP上排布. 同时根据具 ...

  4. 【UI入门必读】一个完整的UI设计流程是怎样的?

    UI设计绝不是掌握几种软件技能或了解入门知识就可以的.想要做好UI设计,一定要多看多练,先借鉴,再原创.还应该多培养自己的设计思维和逻辑思维.这就需要在设计前清楚的知道UI设计的所有流程. UI设计一 ...

  5. android美观项目界面,android(安卓)漂亮的完整UI界面设计

    [实例简介] android 漂亮的UI界面 完整的界面设计 这是一个完整的UI设计,新建个项目,把这些东西拷进去就可以了,直接导入他找不到android的包. [实例截图] [核心代码] 漂亮的安卓 ...

  6. 可编辑杂志模板|简单的得到一个完整的杂志预先设计版式

    从头开始设计一本杂志可能会有很多工作要做. 你必须为多页设计独特的布局,设计封面,格式化段落等等. 简单的方式,是可以通过简单地使用杂志模板获得一个良好的起步? 对于设计小白或是没有接触过太多此类项目 ...

  7. 在Altium Designer 2022中创建一个完整的PCB电子设计工程项目(超详细)

    [Altium Designer]学习笔记第二篇--创建一个完整的PCB电子设计工程项目 一.概述 1.一个完整的PCB设计文件共包含五部分:原件库文件,原理库文件(包含网络表文件),PCB库文件,P ...

  8. 如何设计一个完整的交互流程,提升产品用户体验

    交互流程设计是一项关乎用户体验的重要工作.通过设计和规划用户与产品或服务的交互方式和流程,我们可以提高用户的满意度和使用效果.在本文中,我们将深入探讨交互流程设计的关键要素以及其对用户体验的重要性. ...

  9. 一个完整的壁纸应用——[仿爱壁纸],从设计到实现的过程

    一个完整的壁纸应用--[仿爱壁纸],从设计到实现的过程 正如我的GitHub上的README上说的,偶然之间发现了一个接口,觉得挺有意思的,于是乎,就开始着手的写一个壁纸类应用了,其实之前就一直有这样 ...

最新文章

  1. 解决win7 64位操作系统下安装PL/SQL后连接报错问题: make sure you have the 32 bits oracle client installed
  2. 项目上线与LOG记录
  3. DBA(七):PXC、MySQL存储引擎
  4. FLASH开发[00]
  5. C++ 程序内存泄漏检测方法
  6. java线程读取流的时候卡死,java – 线程中断没有结束阻塞调用输入流读取
  7. 深入解析React创建组件的三种方式
  8. 工作笔记-增加swap分区空间
  9. vs2015移植linux编译,windows平台移植(原linux项目)时,用vs2015开发,碰到的问题及处理方案记录...
  10. 使用hibernate可以优化的地方
  11. 教你编写高性能的mysql语法
  12. linux负载均衡总结性说明(四层负载/七层负载)
  13. 电解电容封装尺寸(插件)
  14. Python之字典遍历元素
  15. 程序员的百宝箱:提升工作效率的七大神器
  16. Django DTL 与verbatim
  17. ZZNUOJ_C语言1039:n个数求和(完整代码)
  18. Python基础算法案例:24点纸牌游戏算法
  19. 区块链游戏项目(战舰游戏)基于layer2区块链技术,使用以太坊的solidity语言, 含全栈完整源码
  20. TimesNet复现

热门文章

  1. 安卓中Paint类和Canvas类的方法汇总
  2. DS18B20温度采集报警系统,原理及汇编、C语言实现
  3. 云原生IDE:iVX免费的首个通用无代码开发平台
  4. 如何从dump文件中提取出C#源代码学习通http://www.bdgxy.com/
  5. SMT贴片元件拆卸的妙招分享
  6. 示波器(Oscilloscope)快速入门
  7. base64格式图片直接显示
  8. YOLOV5的FPS计算问题
  9. saltstack安装 [一]
  10. 123 白沙 李恒福 今見도(才+壽)人而成逆賊