为推荐系统选择正确的推荐算法很是重要,而可用的算法不少,想要找到最适合所处理问题的算法仍是颇有难度的。这些算法每种都各有优劣,也各有局限,所以在做出决策前咱们应当对其作以衡量。在实践中,咱们极可能须要测试多种算法,以便找出最适合用户的那种;了解这些算法的概念以及工做原理,对它们有个直观印象将会颇有帮助。算法
推荐算法一般是在推荐模型中实现的,而推荐模型会负责收集诸如用户偏好、物品描述这些可用做推荐凭借的数据,据此预测特定用户组可能感兴趣的物品。数组
主要的推荐算法系列有四个(表格1-4):网络
此外,还有不少高级或非传统的方式,可参见表格5。机器学习
本文是系列文中的第一篇,将会以表格形式来介绍推荐算法的主要分类,包括算法简介、典型的输入内容、常见的形式及其优劣。在系列文的第二与第三篇中,咱们将会更详细地介绍各类算法的不一样,以便让你们更深刻地理解其工做原理。本文的某些内容是基于一篇2014年的推荐算法2014教程《推荐问题再探(Recommender Problem Revisited)》来撰写的,该文的做者是Xavier Amatriain。ide
表格一:协同过滤推荐算法概览wordpress
表格二:基于内容过滤的推荐算法概览函数
表格三:混合方式的推荐算法概览工具
表格四:流行度推荐算法概览学习
表格五:高级或“非传统”推荐算法概览测试
本文是系列文中的第二篇,将会列出推荐算法的备忘列表,介绍推荐算法的主要分类。在本文中,咱们会更详细地介绍协同过滤推荐算法,并讨论其优劣,以便你们更深入地理解其工做原理。
协同过滤(CF)推荐算法会寻找用户的行为模式,并据此建立用户专属的推荐内容。这种算法会根据系统中的用户使用数据——好比用户对读过书籍的评论来肯定用户对其喜好程度。关键概念在于:若是两名用户对于某件物品的评分方式相似,那么他们对于某个新物品的评分极可能也是类似的。值得注意的是:这种算法无需再额外依赖于物品信息(好比描述、元数据等)或者用户信息(好比感兴趣的物品、统计数据等)。协同过滤推荐算法可分为两类:基于邻域的与基于模型的。在前一种算法(也就是基于内存的协同过滤推荐算法)中,用户-物品评分可直接用以预测新物品的评分。而基于模型的算法则经过评分来研究预测性的模型,再根据模型对新物品做出预测。大体理念就是经过机器学习算法,在数据中找出模式,并将用户与物品间的互动方式模式化。
基于邻域的协同过滤则着眼于物品之间的关系(即基于物品的协同过滤)或者用户之间的关系(基于用户的协同过滤)。
基于用户的协同过滤是探索对物品拥有类似品味的用户,并基于彼此喜好的物品来进行互推。
基于物品的协同过滤是用户喜好的物品,推荐相似的东西。而这种类似性创建在物品同时出现的基础上,好比购买了x物品的用户也购买了y物品。
首先,在执行基于物品的协同过滤前,咱们先看一个基于用户的协同过滤案例。
假设咱们有一些用户已经表达了他们对某些书籍的偏好,他们越喜欢某本书,对这本书的评分也越高(评分范围是1分到5分)。咱们能够在一个矩阵中重现他们的这种偏好,用行表明用户,用列表明书籍。
图一:用户书籍偏好全部偏好的范围都是1分到5分,5分是最高(也就是最喜欢的)。第一个用户(行1)给第一本书(列1)的评分为4分,若是某个单元格为空,表明着用户并未对这本书做出评价。
在基于用户的协同过滤算法中,咱们要作的第一件事就是根据用户对书籍的偏好,计算出他们彼此间的类似度。咱们从某个单独用户的角度来看一下这个问题,以图一中第一行的用户为例。一般咱们会将每一个用户都做为向量(或者数组),其中包含了用户对物品的偏好。经过多种相似的指标对用户进行对比是至关直接的。在本例中,咱们会使用余弦类似点。咱们将第一位用户与其余五位相对比,能够发现第一位与其余用户的类似度有多少(图二)。就像大多类似度指标同样,向量之间的类似度越高,彼此也就越类似。在本例中,第一位用户与其中两位有两本相同的书籍,类似度较高;与另两位只有一本相同书籍,类似度较低;与最后一位没有相同书籍,类似度为零。
图二:第一位用户与其余用户的类似性。能够在一个单独的维度中绘制用户间的余弦类似性。
更常见的状况下,咱们能够计算出每名用户与全部用户的类似程度,并在类似性矩阵中表现出来(图三)。这是一个对称矩阵,也就是说其中一些有用的属性是能够执行数学函数运算的。单元格的背景色代表了用户彼此间的类似程度,红色越深则类似度越高。
图三:用户间的类似矩阵,每一个用户的类似度是基于用户阅读书籍间的类似性。
如今,咱们准备使用基于用户的协同过滤来生成给用户的推荐。对于特定的用户来讲,这表明着找出与其类似性最高的用户,并根据这些相似用户喜好的物品进行推荐,具体要参照用户类似程度来加权。咱们先以第一个用户为例,为其生成一些推荐。首先咱们找到与这名用户类似程度最高的n名用户,删除这名用户已经喜欢过的书籍,再对最类似用户阅读过的书籍进行加权,以后将全部结果加在一块儿。在本例中,咱们假设n=2,也就是说取两名与第一位用户最类似的用户,以生成推荐结果,这两名用户分别是用户2及用户3(图四)。因为第一名用户已经对书籍1和书籍5作出了评分,推荐结果生成书籍3(分数4.5)及书籍4(分数3)。
图四:为一名用户生成推荐。咱们取这两名最类似的用户所阅读的书籍,进行加权,而后对这名用户还没有评分的书籍进行推荐。
如今咱们对基于用户的协同过滤有了更深入的理解,以后来看一个基于物品的协同过滤的案例。咱们仍是用同一组用户(图一)为例。
在基于物品的协同过滤中,与基于用户的协同过滤相似,咱们要作的第一件事就是计算类似度矩阵。但这一回,咱们想要针对物品而非用户来看看它们之间的类似性。与以前相似,咱们以书籍做为喜好者的向量(或数组),将其与余弦类似度函数相对比,从而揭示出某本书籍与其余书籍之间的类似程度。因为同一组用户给出的评分大体相似,位于列1的第一本书与位于列5的第五本书类似度是最高的(图五)。其次是类似度排名第三的书籍,有两位相同的用户喜好;排名第四和第二的书籍只有一位共同读者;而排名最后的书籍因为没有共同读者,类似度为零。
图五:第一本书与其余书籍的对比。书籍经过所阅读用户的评价来表现。经过余弦类似度指标(0-1)来进行对比,类似度越高,两本书就越类似。
咱们还能够在类似矩阵中展现出全部书籍彼此间的类似程度(图六)。一样以背景颜色区分了两本书彼此间的类似程度,红色越深类似程度也越高。
图六:书籍的类似矩阵
如今咱们知道每本书彼此间的类似程度了,能够为用户生成推荐结果。在基于物品的协同过滤中,咱们根据用户此前曾评过度的物品,推荐与其最为类似的物品。在案例中,第一位用户得到的推荐结果为第三本书籍,而后是第六本(图七)。一样地,咱们只取与用户以前评论过的书籍最类似的两本书。
图七:为某位用户生成推荐结果。咱们取到他们以前评论过的书籍目录,找出与每本书籍最类似的两本,再对用户还没有评论过的书籍进行推荐。
根据上述描述,基于用户与基于物品的协同过滤彷佛很是相似,所以能得出不一样的结果这一点确实颇有意思。即使在上例中,这两种方式都能为同一名用户得出不一样的推荐结果,尽管二者的输入内容是相同的。在构建推荐时,这两种形式的协同过滤方式都是值得考虑的。尽管在向外行描述时,这两种方法看起来很是相似,但实际上它们能得出很是不一样的推荐结果,从而为用户带来彻底不一样的体验。
因为简单高效,且生成的推荐结果准确、个性化,邻域方法也是至关受欢迎的。但因为要计算(用户或物品间的)类似度,随着用户或物品数量的增加,也会出现一些伸缩性方面的局限。在最糟的状况下,须要计算O(m*n),但在现实中状况略好一些,只要计算O(m+n)便可,部分缘由在于利用了数据的稀疏度。尽管稀疏度有助于扩展实现,但同时也为基于邻域的方法提出了挑战,由于在海量的物品中,仅有少许是有用户评论过的。例如,Mendeley系统中有数百万篇文章,而一名用户也许只读过其中几百篇。两名各读过100篇文章的用户具备类似度的可能性仅为0.0002(在5000万篇文章的目录中)。
基于模型的协同过滤方式能够克服基于邻域方法的限制。与使用用户-物品评分直接预测新物品评分的邻域方式不一样,基于模型的方法则使用评分来研究预测性模型,并根据模型来预测新物品。大体理念就是经过机器学习算法,在数据中找出模式,并将用户与物品间的互动方式模式化。整体来说,基于模型的协同过滤方式是构建协同过滤更高级的算法。不少不一样的算法都能用来构建模型,以进行预测;例如贝叶斯网络、集群、分类、回归、矩阵因式分解、受限波尔兹曼机等,这些技术其中有些在得到Netflix Prize奖项时起到了关键性做用。Netflix在2006年到2009年间举办竞赛,当时还为可以生成准确度超过其系统10%的推荐系统制做团队提供100万美圆的大奖。胜出的解决方案是一套综合了逾100种不一样算法模型,并在生产环境中采用了矩阵因式分解与受限玻尔兹曼机的方法。
矩阵因式分解(好比奇异值分解、SVD++)将物品与用户都转化为同一个隐空间,表现了用户与物品间的底层互动(图八)。矩阵因式分解背后的原理在于:其潜在特性表明了用户如何对物品进行评分。根据用户与物品的潜在表现,咱们就能够预测用户对未评分的物品的喜好程度。
图八:矩阵分解算法的演示,用户偏好矩阵能够分解为用户主题矩阵乘以物品主题矩阵。
在表一中,咱们列出了邻域算法与基于模型的协同过滤算法的关键优劣点。因为协同过滤算法只依赖于用户的使用数据,想要生成足够优秀的推荐结果无需对技术工做有太多了解,但这种算法也有其局限。例如,CF更容易推荐流行物品,所以为品味独特的用户推荐物品时就会比较困难(即对其感兴趣的物品可能不具备太多的使用数据),也就是流行度偏好的问题,这一点一般能够经过基于内容的过滤算法解决。CF算法更重要的一个限制就是所谓的“冷启动问题”——系统没法为没有或使用行为不多的用户提供推荐(也就是新用户的问题),也没法为没有或使用行为不多的物品提供推荐(也就是新物品的问题)。新用户的“冷启动问题”能够经过流行度和混合算法来解决,而新物品问题能够经过基于内容过滤或multi-armed bandit推荐算法(即探索-利用)来解决。在下篇文章中咱们会详细讨论其中一些算法。
本文中,咱们介绍了三种基本的协同过滤算法实现。基于物品、基于用户的协同过滤算法,以及矩阵分解算法之间的区别都很细微,一般很难简单地解释其差别。理解这些算法间的差别有助于咱们选择推荐系统最适合的算法。在下篇文章中,咱们会继续深刻探讨推荐系统的流行算法。
本文是系列文中的第三篇。第一篇文章经过列表形式介绍了推荐算法的主要分类,第二篇文章介绍了不一样类型的协同过滤算法,强调了其间的一些细微差异。在本文中,咱们将会更加详细地介绍基于内容的过滤算法并讨论其优缺点,以更好地理解其工做原理。
基于内容的过滤算法会推荐与用户最喜欢的物品相似的那些。可是,与协同过滤算法不一样,这种算法是根据内容(好比标题、年份、描述),而不是人们使用物品的方式来总结其相似程度的。例如,若是某个用户喜欢电影《魔戒》的第一部和第二部,那么推荐系统会经过标题关键字向用户推荐《魔戒》的第三部。在基于内容的过滤算法中,会假设每一个物品都有足够的描述信息可做为特征向量(y)(好比标题、年代、描述),而这些特征向量会被用来建立用户偏好模型。各类信息检索(好比tf-idf)以及机器学习技术(好比朴素贝叶斯算法、支持向量机、决策树等)均可用于生成用户模型,以后再根据模型来进行推荐。
假设咱们有一些用户已经表达了他们对某些书籍的偏好,他们越喜欢某本书,对这本书的评分也越高(评分范围是1分到5分)。咱们能够在一个矩阵中重现他们的这种偏好,用行表明用户,用列表明书籍。
图一:用户书籍偏好全部偏好的范围都是1分到5分,5分是最高的(也就是最喜欢的)。第一个用户(行1)给第一本书(列1)的评分为4分,若是某个单元格为空,表明着用户并未对这本书做出评价。
在基于内容的协同过滤算法中,咱们要作的第一件事就是根据内容,计算出书籍之间的类似度。在本例中,咱们使用了书籍标题中的关键字(图二),这只是为了简化而已。在实际中咱们还可使用更多的属性。
图二:用户已经评论过的书籍标题
首先,一般咱们要从内容中删除中止词(好比语法词、过于常见的词),而后用表明出现哪些词汇的向量(或数组)对书籍进行表示(图三),这就是所谓的向量空间表示。
图三:使用标题的词汇若是在标题中有这个词,咱们以1为标记,不然为空。
有了这个表格,咱们就可使用各类类似指标直接对比各本书籍。在本例中,咱们会使用余弦类似点。当咱们使用第一本书籍,将其与其余五本书籍对比时,就能看到第一本书籍与其余书籍的类似程度(图四)。就像大多类似度指标同样,向量之间的类似度越高,彼此也就越类似。在本例中,第一本书与其余三本书都很相似,都有两个共同的词汇(推荐和系统)。而标题越短,两本书的类似程度越高,这也在情理之中,由于这样一来,不相同的词汇也就越少。鉴于彻底没有共同词汇,第一本书与其余书籍中的两本彻底没有相似的地方。
图四:第一本书与其余书籍间的类似性在单个维度中经过两本书之间的余弦类似度就能绘制出来。
咱们还能够在类似矩阵中展现出全部书籍彼此间的类似程度(图五)。单元格的背景色代表了用户彼此间的类似程度,红色越深类似度越高。
图五:书籍间的类似矩阵,每一个类似点都是基于书籍向量表示之间的余弦类似度。
如今咱们知道每本书彼此间的类似程度了,能够为用户生成推荐结果。与基于物品的协同过滤方式相似,咱们在以前的文章中也介绍过,推荐系统会根据用户以前评价过的书籍,来推荐其余书籍中类似度最高的。区别在于:类似度是基于书籍内容的,准确来讲是标题,而不是根据使用数据。在本例中,系统会给第一个用户推荐第六本书,以后是第四本书(图六)。一样地,咱们只取与用户以前评论过的书籍最类似的两本书。
图六:为某个用户生成推荐结果。咱们取到他们以前评论过的书籍目录,找出与每本书籍最类似的两本,再对用户还没有评论过的书籍进行推荐。
基于内容的算法解决了协同过滤算法的某些限制,尤为能协助咱们克服流行度偏见,以及新物品的冷启动问题,而这些咱们已经在协同过滤的部分中讨论过了。然而,值得注意的是:纯粹基于内容的推荐系统一般在执行时效果不如那些基于使用数据的系统(好比协同过滤算法)。基于内容过滤的算法也会有过分专业化的问题,系统可能会向用户推荐过多相同类型的物品(好比得到全部《魔戒》电影的推荐),而不会推荐那些虽然类型不一样,可是用户也感兴趣的物品。最后,基于内容的算法在实现时只会使用物品元数据中所含的词汇(好比标题、描述年份),更容易推荐更多相同的内容,限制了用户探索发现这些词汇以外的内容。关于基于内容过滤的优劣总结见表二。
本文是系列文中的第四篇。第一篇文章经过列表形式介绍了推荐算法的主要分类,第二篇文章介绍了不一样类型的协同过滤算法,强调了其间的一些细微差异,在第三篇中咱们详细介绍了基于内容的过滤算法。本文将会讨论基于以前提过算法而造成的混合型推荐系统,也会简单讨论如何利用流行度来解决一些协同过滤算法与基于内容过滤算法的限制。
混合算法结合了用户及物品的内容特性以及使用数据,以利用这两类数据的优势。结合了A算法与B算法的某个混合型推荐系统会尝试利用A算法的优势以解决B算法的缺点。例如,协同过滤算法存在新物品的问题,也就是说这种算法没法推荐用户未评价或使用过的物品。由于是基于内容(特性)预测的,这一点并不会对基于内容的算法产生限制。而结合了协同过滤与基于内容过滤算法的混合型推荐系统可以解决单个算法中的一些限制,好比冷启动的问题与流行度偏好的问题。表一列出了一些不一样的方法,包括如何结合两种甚至更多基础推荐系统技术,以建立新的混合型系统。
表一:结合两种甚至更多的基础推荐算法,以建立新混合算法的不一样方式。
假设咱们有一些用户已经表达了他们对某些书籍的偏好,他们越喜欢某本书,对这本书的评分也越高(评分级别分别为1-5)。咱们能够在一个矩阵中重现他们的这种偏好,用行表明用户,用列表明书籍。
图一:用户书籍偏好全部偏好的范围都是1分到5分,5分是最高的(也就是最喜欢的)。第一名用户(行1)对第一本书(列1)的评分为4分,若是某个单元格为空,表明着用户并未对这本书做出评价。
在本文所属系列的第二篇中,咱们给出了两个案例,包括如何使用基于物品及基于用户的协同过滤算法来计算推荐结果;在本文所属系列的第三篇中,咱们演示了如何使用基于内容的过滤算法来生成推荐结果。如今咱们将这三种不一样的算法结合起来,生成一种全新的混合型推荐结果。咱们会使用加权法(表一)结合多种技术得出的结果,以后这三种算法即可按照不一样的权值(根据重要性不一样)结合得出一组新的推荐结果。
咱们先以第一个用户为例,为其生成一些推荐。首先咱们会根据第二篇中的基于用户的协同过滤算法,基于物品的协同过滤算法,以及第三篇中基于内容过滤的算法,各自生成推荐结果。值得注意的是,在这个小案例中,这三种方法为同一名用户生成的推荐结果有着轻微的差别,尽管输入的内容是彻底相同的。
图二:为某个用户生成的推荐结果——分别使用基于用户的协同过滤算法,基于物品的协同过滤算法,以及基于内容的过滤算法。
下一步,咱们使用加权混合推荐算法为指定用户生成推荐结果,加权值分别为:基于用户的协同过滤算法40%,基于物品的协同过滤算法30%,基于内容过滤的算法30%(图三)。在这个案例中,系统会向用户推荐他们从未看过的全部三本书,而使用单个算法只会推荐其中两本。
图三:使用加权混合推荐系统为某个用户生成推荐结果,具体权值参见上文。
尽管混合型算法解决了CF与CB算法的一些重大挑战与限制(见图三),但在系统中平衡不一样的算法也须要不少工做量。另外一种结合单个推荐算法的方式是使用集成方法,关于如何结合不一样算法得出的结果,咱们研究得出了一个函数。值得注意的是:一般集成算法不只结合了不一样的算法,还结合了根据同一种算法得出的不一样变体与模型。例如:得到Netflix Prize奖项的解决方案包含了从10多种算法(流行度、邻域算法、矩阵分解算法、受限波尔兹曼机、回归等等)得出的100多种不一样的模型,并经过迭代决策树(GBDT)将这些算法与模型结合在一块儿。
另外,基于流行度的算法对于新用户的冷启动问题来讲也是一个优秀的解决方案。这些算法经过某些流行度的测量标准,好比下载最多的或者购买最多的,来对物品进行排名,并将这些流行度最高的物品推荐给新用户。当拥有合适的流行度衡量指标时,这个办法虽然基础却颇有效,一般能够为其余算法提供很好的基线标准。流行度算法也能够单独做为算法使用,以引导推荐系统在换到其余更切合用户兴趣点的算法(好比协同过滤算法以及基于内容过滤的算法)前得到足够的活跃度与使用量。流行度模型也能够引入混合算法中,从而解决新用户的冷启动问题。
本文是推荐算法系列文中的第五篇。第一篇文章经过列表形式介绍了推荐算法的主要分类,第二篇文章介绍了不一样类型的协同过滤算法,强调了其间的一些细微差异,在第三篇中咱们详细介绍了基于内容的过滤算法,在第四篇中咱们讲解了混合型推荐系统以及基于流行度的算法。在本篇中,咱们会对简单了解一下如何对一些高级的推荐算法作以选择,再回顾一下基础算法得出的推荐结果差别有多大,以便本系列完美收官。
除了咱们截至目前提到的一些更为传统的推荐系统算法以外(好比流行度算法、协同过滤算法、基于内容过滤的算法、混合型算法),还有许多其余算法也可用于增强推荐系统的功能,包括有:
这些更为高级的非传统算法对于将现有推荐系统的质量推向更高层次颇有好处,但理解起来也更困难,推荐工具的支持上也不够。在实践中,咱们总要权衡实现高级算法的代价与对基础算法的增益相比较是否值得。根据经验来看,基础算法还能使用好久,为一些很优秀的产品提供服务。
在本系列文中,咱们但愿介绍一些常见的推荐模块算法,包括基于用户的协同过滤算法,基于物品的协同过滤算法,基于内容的过滤算法,以及混合型算法。咱们使用了一个案例,说明了这四种不一样算法在输入数据相同时,应用于同一个案例时,为同一个用户生成的不一样推荐结果(图一)。当应用于真实世界的大型数据时,这样的效应依然存在,所以决定使用哪一种算法时,须要考虑相关的优缺点以及执行效果。
图一:四种推荐系统算法所有使用同一组数据,却得出了不一样的结果。左侧咱们给出了一个矩阵,标明了用户对大量物品的不一样偏好,并列出了能够推荐的物品名称。在中间,咱们展现了这四种不一样算法如何为第一名用户生成推荐结果(也就是用户偏好矩阵中第一行的用户)。就像类似矩阵中展现的那样,这些算法对类似度有不一样的定义。右侧则是每种推荐算法生成的一些物品,从上到下分别按照四种算法的介绍顺序来排序。
在实践中,通常若是在推荐模型中使用协同过滤算法,就不会犯太大错误。协同过滤算法彷佛比其余算法更优秀,但在冷启动用户及物品方面会有问题,所以一般会使用基于内容的算法做为辅助。若是有时间的话,使用混合型算法就能够结合协同过滤及基于内容过滤算法优点了。将这些基础算法放在一块儿固然是个好办法,甚至比高级算法还要更好。
最后这一点值得牢记:推荐模型只是五个推荐系统组件中的一个。与全部组件相似,正确设置并努力创建模型很是重要,不过选择数据集、处理、后处理、在线模块及用户界面也一样重要。正如咱们再三强调的那样,算法只是推荐系统的一部分,整个产品应当将你的决策归入考量。