推荐系统那些事儿

作者:前进

本文为原创文章,转载请注明作者及出处

 

1、推荐系统为何而来?

 

上世纪90年代,美国沃尔玛的超市管理人员分析销售数据时发现了一个令人难于理解的现象:在某些特定的情况下,“啤酒”与“尿布”两件看上去毫无关系的商品会经常出现在同一个购物篮中。

《推荐系统那些事儿》

按常规思维,尿布与啤酒风马牛不相及,沃尔玛正是借助了关联规则分析的数据挖掘技术对海量交易数据进行挖掘和分析,发现这一藏在数据背后的奇特价值的(据说,在美国有婴儿的家庭中,一般是母亲在家中照看婴儿,年轻的父亲前去超市购买尿布。父亲下班之后去购买尿布的同时,往往会顺便为自己购买啤酒)。

 

同样地,推荐系统 (Recommender System, RS) 也是商业领域用来挖掘藏在数据背后那些奇特价值的数据挖掘技术。准确的说,推荐系统是在用户没有明确的需求的情况下向用户建议有用物品的推荐技术,在以个性化的方式指引用户在众多选择中找到感兴趣的东西。比如,我从 Amazon 买了一本《时间简史》,回过头来再浏览,它可能推荐我可能喜欢《未来简史》;两个朋友在同一地方同一时刻打开今日头条,他们却在首页看到了不一样的消息列表。推荐系统实际上已经在我们的生活中十分常见。

 

互联网时代是信息过载的时代,面对包罗万象的各种信息,我们应该如何应对?研究互联网技术对社会和经济影响的美国作家ClayShirkey在10年Web2.0 Expo的演讲中曾说“It’s Not Information Overload. It’s Filter Failure”。是的,为了解决信息过载的问题,已经陆续的诞生了很多优秀的解决方案(分类目录、收搜索引擎、推荐系统等),其中推荐系统就是最具代表性的解决方案之一。

 

另外,就像美国《连线》杂志主编 Chris Anderson 曾在他的《长尾理论》中指出的一样,传统的 80/20 原则(80% 的销售额来自于 20% 的热门商品)在互联网出世后已经受到了挑战。互联网条件下,由于货架成本极端低廉,电子商务往往能出售比传统零售店更多的商品。虽然这些商品绝大多数都不热门,但这些不热门的商品数量是极其庞大,因此这些长尾商品的总销售额将是一个不可小觑的数字,也许会超过热门商品带来的销售额。热门商品往往代表了绝大多数用户的需求,而长尾商品往往代表了小部分用户的个性化需求。因此,如果要通过发掘长尾提高销售额,就必须充分研究用户的兴趣,而这正是个性化推荐系统主要解决的问题。

《推荐系统那些事儿》

 

2、推荐系统基本原理

 

推荐算法是推荐系统的根本,迄今为止,已经有许多推荐算法可供选择,每一种推荐算法都有其优点和缺点,当然也有其限制条件,在具体实践中,合理的选择合适的推荐算法却不是一件容易的事,需要了解各类算法的工作原理,然后多次尝试和仔细考量。本节依次介绍推荐算法中比较常用的流行度推荐算法、基于内容的推荐算法、基于领域的协同过滤算法以及混合推荐算法(除此之外,比较常用的还有基于模型的协同过滤算法和非传统的高级推荐算法,限于篇幅和复杂性,本文不作介绍)。

 

设定情景:现有6位用户(User1,2,3,4,5,6),对如下6本图书(Book1,2,3,4,5,6)。

《推荐系统那些事儿》

这些用户曾经部分购买过这6本图书并且进行了评价(注:评分函数记为《推荐系统那些事儿》),如下表2:(其中,用户对一本图书的喜好程度越高,对其评价越高。最低评分1分,最高评分5分)。

《推荐系统那些事儿》

2.1 流行度推荐算法

 

流行度推荐算法根据大众的流行指标(最高评分、最多购买、最多下载、最多观看等)进行推荐。在为具体用户推荐之前,我们需要计算出每个商品的流行指标,对任意一本图书,我们以User1,User2,User3,User4, User5,User6对其评分的平均值作为流行度指标。有:

《推荐系统那些事儿》

有:

《推荐系统那些事儿》

由此有了流行指标的排序,便可以对用户进行推荐了。以对User1进行推荐为例,将User1已经购买过得图书(Book1,Book2,Book5)从流行指标有序列表中剔除,就得到了对User1的实际推荐列表:

《推荐系统那些事儿》

即流行度推荐算法将顺次为User1推荐Book6,Book3, Book4。

 

流行度推荐算法仅仅依赖使用惯用数据(有的系统可能会依赖商品目录等内容数据),容易实现、没有用户的冷启动问题;缺点是需要对产品进行统一标准化惯用数据、存在新商品的冷启动问题、推荐结果缺乏个性化。

 

2.2 基于内容的推荐系统

 

基于内容的推荐系统主要在于利用已知的用户偏好、用户兴趣等和物品内容的属性的相关和匹配程度,从用户曾经喜欢的物品出发,尝试去推荐用户过去喜欢物品的类似物品。

 

首先,对内容(这里以书名为例)进行数据预处理,找出描述图书的向量表示。鉴于语法词在书名中很常见,忽略内容中语法连接词(to, and, the)。可将6本图书描述成向量矩阵如下:(其中1表示行对应的书中存在列元素对应的词)

《推荐系统那些事儿》

 

有了每本书的向量表示矩阵,还需解决一个问题:相似不相似怎么度量呢?推荐算法中常用的相似度量有欧氏距离(《推荐系统那些事儿》 、余弦相似度(《推荐系统那些事儿》 )、皮尔逊相关系数等多种方式。其中余弦相似度是最为常用的度量方式,接下来的算法中相似性均以余弦相似度表示。对于任意两个向量《推荐系统那些事儿》 它们的余弦相似度为:

《推荐系统那些事儿》

其中《推荐系统那些事儿》 值越大,X和Y越相似。

有了每一本书的内容向量矩阵和相似度的度量方法,我们就可以比较书与书之前的相似性了。以第一本书为例,根据余弦相似度公式分别计算Book1与其他各书(Book2,Book3,Book4,Book5,Book6)的相似度。

《推荐系统那些事儿》

同上,分别计算所有书与书之间的相似度可以得到一个相似矩阵(相似矩阵是一个对角阵,即《推荐系统那些事儿》。例如,Book1与Book2的相似度等于Book2与Book1的相似度)。

《推荐系统那些事儿》

 

有了图书之间的相似矩阵之后,我们就可以为一个具体的用户进行推荐了。具体做法是,选择用户已经评分过的图书 ,然后找到三本与它们最相似的书,推荐给用户未评分过的图书

以对User1进行推荐为例,根据用户对图书的评分矩阵(表2),选取User1此前评分过的图书(Book1,Book2,Book5),分别挑选三本与它们最相似的图书,如下表:

《推荐系统那些事儿》

然后按下面公式计算User1还没有购买过的相似图书的期望评分,推荐给用户期望评分最高的两本图书即可。

《推荐系统那些事儿》

从表5可知,User1还没有购买过的相似图书有Book3,Book4,Book6,即上述公式中i=3,4,6。计算:

User1Book3的期望评分  

《推荐系统那些事儿》

User1Book4的期望评分  

《推荐系统那些事儿》

User1Book6的期望评分

《推荐系统那些事儿》

《推荐系统那些事儿》可知,基于内容的推荐算法将会首先为用户顺次推荐Book6,Book3,Book4。

基于内容的推荐系统以商品的内容或描述作为输入,不需要惯用数据,没有冷启动问题,没有流行度偏见,同时内容特性容易解释;缺点是商品的内容难于标准话,同事推荐结果缺乏多样性。

 

2.3 协同过滤算法

 

俗话说“物以类聚,人以群分”,协同过滤算法正是借鉴了“人以群分”的道理对用户进行推荐的。协同过滤算法通过用户的惯用数据(评分,下载量,播放量等)推断出用户的偏好。

 

协同过滤方法大体可分为两类:基于邻域和基于模型的方法。其中基于邻域方法是使用用户对已有项的评分直接预测该用户对新项的评分,包括基于项的协同过滤算法和基于用户的协同过滤算法;基于模型方法是使用历史评分数据找出用户与向的相互作用模型,通过数据中的特定模式作为预测模型来预测用户对新项的评分(构建模型算法如贝叶斯网络、聚类、分类、回归、矩阵分解、受限玻尔兹曼机等,本节不作讨论)。

 

2.3.1 基于项的协同过滤算法

 

从表2 用户对图书的评价矩阵可知,可以将图书的表现看作是User1,User2, User3,User4,User5, User6对其的评价的向量。

《推荐系统那些事儿》

与基于内容的推荐算法类似的,有了每本图书的向量表示矩阵,通过余弦相似度的度量方法,就可以比较图书与图书之间的相似性了。以Book1为例,根据余弦相似度公式分别计算Book1与其他用户(Book2,Book3,Book4,Book5,Book6)的相似度。

《推荐系统那些事儿》

同上,分别计算所有图书与图书之间的相似度可以得到一个图书间的相似矩阵。

《推荐系统那些事儿》

有了图书之间的相似矩阵之后,我们就可以为一个具体的用户进行推荐了。具体做法是,选择三本用户已经评分过的图书,然后分别找到三本与它们最相似的书,以图书相似度作为权重,计算用户对未曾购买图书的期望评分,最后按照期望评分从高到底进行推荐。

以对User1进行推荐为例,根据用户对图书的评分矩阵(表2),选取User1此前评分过的三本图书(Book1,Book2,Book5),分别挑选三本与它们最相似的图书,如下表:

《推荐系统那些事儿》

然后按下面公式计算User1还没有购买过的相似图书的期望评分,推荐给用户期望评分最高的两本图书即可。

《推荐系统那些事儿》

从表5可知,User1还没有购买过的相似图书有Book3,Book4,Book6,即上述公式中i=3,4,6。计算:

User1对Book3的期望评分为 

《推荐系统那些事儿》

User1对Book4的期望评分为 

《推荐系统那些事儿》

User1对Book6的期望评分为

《推荐系统那些事儿》

《推荐系统那些事儿》可知,基于项的协同过滤算法将为用户顺次推荐Book3,Book4,Book6。

 

2.3.1 基于用户的协同过滤

 

从表2 用户对图书的评价矩阵可知,可以将用户行为看着是对Book1,Book2, Book3,Book4,Book5, Book6的评价的向量。

《推荐系统那些事儿》

 

与基于内容的推荐算法类似的,有了每个用户的向量表示矩阵,通过余弦相似度的度量方法,就可以比较书用户与用户之间的相似性了。以User1为例,根据余弦相似度公式分别计算User1与其他用户(User2,User3,User4,User5,User6)的相似度。

《推荐系统那些事儿》

同上,分别计算所有用户与用户之间的相似度可以得到一个用户间的相似矩阵。

《推荐系统那些事儿》

 

有了用户之间的相似矩阵之后,我们就可以为一个具体的用户进行推荐了。具体做法是,选择3位与该用户最相似的两位用户,然后从相似用户购买过但该用户未曾购买过的图书中产生待推荐图书列表;然后以该用户与相似用户的相似度作为权重,计算该用户对待推荐图书的期望评分,最后按照期望评分从高到底进行推荐即可。

以对User1进行推荐为例,选取与User1最相似的三位用户(相似度为0.75的User2,相似度为0.63的User3,相似度为0.30的User5),分别列举相似用户曾经买过的图书,如下表:

《推荐系统那些事儿》

然后按下面公式计算User1还没有购买过的相似图书的期望评分,推荐给用户期望评分最高的两本图书即可。

《推荐系统那些事儿》

从表8可知,User1还没有购买过的相似图书有Book3,Book4,Book6,即上述公式中i=3,4,6。计算:

User1对Book3的期望评分为 

《推荐系统那些事儿》

User1对Book4的期望评分为 

《推荐系统那些事儿》

User1对Book6的期望评分为

《推荐系统那些事儿》

《推荐系统那些事儿》可知,基于内容的推荐算法将会首先为用户顺次推荐Book3,Book6,Book4。

 

基于邻域方法由于其简单性和效率具有相当的知名度,同时也是由于它们有产生准确的和个性化的推荐的能力。协同过滤算法仅仅依赖于惯用数据(评价、购买、下载等用户偏好行为),不需要用户和商品属性信息、输入要求少、大部分场景中能够产生足够好的结果;缺点是存在新用户和新商品的冷启动问题,同时难于为产生的推荐提供解释。

 

2.4 混合推荐算法

 

混合推荐算法,即通过加权的方式混合使用多个算法方法,试以“扬长避短”的方式寻找更好的推荐效果的推荐算法。

例如对于User1的推荐,我们前面分别介绍了基于内容的推荐算法、基于项的协同过滤算法和基于用户的协同过滤算法。然而从具体的推荐结果可知,因为不同算法均有它自身的属性,不同算法对User1推荐结果是存在差别的。这里如何利用混合推荐算法来平衡上述三种不同的推荐结果呢?记基于内容的推荐算法为Algorithm 1,基于项的协同过滤算法为Algorithm 2,基于用户的协同过滤算法为Algorithm 3。有:

《推荐系统那些事儿》

假设,加权混合推荐系统配置基于内容的推荐算法、基于项的协同过滤算法、基于用户的协同过滤算法的权重分别为w1,w2,w3,w4,记第k个算法对第i本书的期望评分为《推荐系统那些事儿》,那么可以根据下面公式计算User1还没有购买过的相似图书的期望评分,推荐给用户期望评分最高的两本图书即可。

《推荐系统那些事儿》

假设《推荐系统那些事儿》计算:

User1对Book3的期望评分为 

《推荐系统那些事儿》

User1对Book4的期望评分为 

《推荐系统那些事儿》

User1对Book6的期望评分为

《推荐系统那些事儿》

《推荐系统那些事儿》可知,混合推荐算法将为用户顺次推荐Book3,Book6,Book4。

 

混合推荐算法综合利用了多种其他子算法,其输入由其所有依赖的子算法决定,它可以获得各子算法响应的优点;其缺点是难以找到各子算法组合方式(加权、交换等)的平衡点,通常还需要话大力气通过集成方法来获取不同算法之间的平衡。

 

3.推荐系统案例

 

了解了上述常见的传统推荐算法之后,我们已经可以编写了一个不错的推荐系统,然而一个优秀的推荐系统却远远没有这么简单。让我们以Netflix推荐系统为例,来观膜下Netflix推荐系统的架构细节,如下图。Netflix推荐系统由许多种不同的推荐算法组成,其中最为核心两个算法是受限玻尔兹曼机和举证奇异值分解(鉴于他们的复杂性和篇幅限制,我们没有在前面的算法原理章节介绍他它们),它们均属于协同过滤算法的范畴,我们可以衍生的理解他们工作特点。Netflix推荐系统存在三种不同的工作方式:离线模式,近线模式和在线模式。特别地,其中的在线模式中算法服务模块负责对不同推荐算法的应用策略。

 

《推荐系统那些事儿》

Netflix推荐系统架构图

 

在线计算利用最近的数据,实时响应在线的事件,实时的响应限制了在线计算不能处理复杂度较高的计算算法,数据集规模也不能太大。与之相反的是离线计算,离线计算对计算复杂度和数据集规模限制较小,离线计算可以有更多的算法选择。近线计算可以视为在线和离线计算的组合,其计算类似于在线计算,但计算结果不会实时响应,而是以缓存的方式暂存这些数据,再通过异步的方式进行加载响应,特别地,近似在线计算对增量计算算法有着天然的支持。

推荐算法(特别是机器学习类推荐算法)的部分计算都可以离线完成,但是推荐系统的特色是个性化,要追求新颖性,要求对新的数据和用户行为反应迅速使得推荐结果及时被更新。为了达到上述效果,除了周期性的调度算法训练模型外,还需综合考虑不同算法在具体情况的时间复杂度、如何最快得到最佳的推荐效果、数据存储的读写延迟时间、如何保证事务一致性等,这就需要我们对于具体应用需求进行深入的分析,谨慎选择各种推荐算法和技术,仔细权衡和优化不同算法在不同策略上的工作效益,以达到最佳的推荐效果。

《推荐系统那些事儿》

技术沙龙推荐

点击下方图片即可阅读

《推荐系统那些事儿》

一个关于 nolock 的故事

翻译 | Android O 中的 seccomp 过滤器

舒适的前端开发环境是怎样一种体验?

不要密码?关于帐号系统的若干遐想

深度学习在自然语言处理中的应用之情感分析

《推荐系统那些事儿》

《推荐系统那些事儿》

    原文作者:数据挖掘
    原文地址: https://juejin.im/entry/59c322bf5188254f584126ca
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞