导读: 在本文中,将详细介绍多种类型的推荐系统,具体介绍基于近邻算法的推荐引擎、个性化推荐引擎、基于模型的推荐系统和混合推荐引擎等,并分析介绍每种推荐系统的优缺点。
主要介绍的不同类型的推荐系统包括:
最近几年,推荐系统发展迅猛。从简单的近邻算法到个性化推荐再到情境感知推荐,从批处理推荐到实时推荐,从启发式的相似度计算到更准确、更复杂的机器学习方法的应用。
在推荐系统发展的早期阶段,生成推荐时只能基于用户对产品的评级。在这段时期,研究人员只能使用现有的评级数据,使用简单的启发式方法,例如:在计算相似度时,常采用诸如欧氏距离、皮尔逊系数、余弦相似度等。这些计算方法虽然简单,但是在相似度上的判断,却有非常好的表现,目前仍是一些推荐引擎比较常用的方法。
第一代推荐引擎可以称为协同过滤或近邻算法推荐。这些推荐算法虽然简单易用,在数据上也有不错的表现,但是也有它们自身的弱点和局限性,比如对已有数据过于依赖造成的冷启动问题,即它们无法实现向新用户 ( 指未对商品等进行过任何评价的用户 ) 进行商品推荐,也无法向用户推荐没有评级的新商品。当用户对产品的评级很少时,这些推荐系统无法处理这类数据十分稀疏的情形。
为了克服这些限制,一些新的方法被挖掘出来。例如,在处理大量用户评价与处理数据稀疏性问题上,通常采用数学方法 ( 如矩阵分解和奇异值分解等 )。
为了应对冷启动问题,也有新的方法出现,比如基于内容的推荐系统。这些推荐系统的出现扩大了视野,注入了新的思路,比如个性化推荐系统,它能够向每位用户独立推荐产品。在这种方法中,依赖的数据不再是评级信息,而考虑用户个人喜好和产品特征,如下图所示。
在推荐系统发展初期,相似度计算被用于基于内容的推荐系统,随着技术发展和硬件设备的不断强化升级,更为先进的方法逐步被实现出来,机器学习中更为复杂的模型渐渐取代传统的启发式方法。机器学习模型提高了推荐信息的准确性。
虽然基于内容的推荐系统解决了很多协同过滤中的缺点,但其自身也有固有的缺点,比如新发现,换句话说,就是不能在用户的偏好范围之外进行新项目的推荐。但这个问题协同过滤却可以解决。
为了解决这个问题,研究人员开始尝试将不同的推荐模型混合进行使用,之后提出了混合推荐模型。这种模型比任一单个模型都更加强大。
随着个性化推荐引擎的成功实现,人们开始将个性化扩展到其他的维度,称之为情境,例如添加位置、时间、分组信息等,这些信息改变了生成推荐信息的基础数据集。
随着技术进步,如大数据生态系统、内存分析工具 ( 如Apache Spark ) 和实时推荐处理这些技术的发展,使处理大数据集成为可能。
目前,推荐系统越来越趋向个性化方面,例如时间维度和无处不在的推荐方式。
在技术方面,正在从机器学习向更先进的神经网络深度学习方法进行扩展。
顾名思义,基于近邻算法的推荐系统认为相同或相似用户的喜好相近,使用这种方式对活跃用户进行推荐。这种基于近邻算法的推荐思想设定是非常简单的:根据某一个给定的用户评级,寻找所有相似用户的历史喜好信息,根据这些活跃用户的历史信息对所有未知产品做出预测,对没有评级过该商品的用户根据近邻原则进行推荐猜测,如下图所示。
同时考虑到邻居的喜好或品味,我们先计算一下活跃用户与其他用户的相似程度,然后再向该活跃用户进行未评级项目的推荐。这里的活跃用户指的是正在使用推荐系统提供的服务的用户。由于涉及相似度计算,这些推荐系统也被称为基于相似度的推荐系统。同时,由于偏好或品味都被考虑在内,这些推荐系统也被称为协同过滤推荐系统。在这些类型的系统中,主要元素是用户、产品和用户的偏好信息,如评级、排名、对产品的喜好。
下图是来自亚马逊近邻推荐算法的展示。
这些基于启发的方法是基于以下假设:
协同过滤系统 ( 如上图所示 ) 有两种类型:
近邻算法只有当有用户的商品交互信息时才能工作,比如评级、喜欢/不喜欢、看过/没看过等。与基于内容的推荐不同,它不考虑任何产品特征或用户对产品的个人偏好信息。
1. 基于用户的协同过滤
如前所述,基于用户的协同过滤系统的基本判断思想是过去具有相似口味的人,在将来也会喜欢类似的物品。例如,如果用户A和用户B有非常相似的购物历史,当用户A购买了一本用户B还没有看过的新书,就可以将这本新书推荐给用户B,因为他们有相似的品味。
举个例子以便我们理解基于用户的协同过滤:
问题陈述:现有用户对电影网站中电影作品的评级数据集。任务是向这些用户推荐电影,数据集如下表所示:
在学习使用推荐方法前,我们首先要做的是:理解和分析现有的数据。现在我们按照如下步骤来分析:
不是所有的用户对所有电影都进行了评级,但是未评级的电影作品只占少数。
第一步是为活跃用户找到相似的用户,然后向活跃用户推荐其还没有看过但是与其相似用户已经看过的电影。
可以归纳成两步:
根据上面表格的数据,尝试为活跃用户Jack Mathews推荐新电影:
将用户、电影和评级的数据映射到坐标轴上,用户作为x轴,电影作为y轴,评级作为向量空间中的点。现在我们已经把数据投影到向量空间,两个点之间的相似度或紧密度可以用欧氏距离和皮尔逊相关系数来计算。
使用前面的公式,我们可以计算表中所有用户之间的相似度,如上表所示。通过观察该表,我们可以发现活跃用户Toby与Lisa Rose最为相似。
第二步,我们通过其他用户对《Just My Luck》给出的评级,通过加权平均方法计算,预测Jack对未评级电影《Just My Luck》的评级,方法如下:
(3×0.9285 + 1.5×0.944+3×0.755 + 2×0.327)÷(0.8934051 + 0.3812464 + 0.9912407 + 0.9244735) = 2.23
在上面的等式中,将其他用户对《Just My Luck》的评级与他们与Jack的相似度乘积求和。然后将这个乘积之和除以所有相似度之和以得到最后的评级。同样的方法,我们可以为其他用户推荐他们未评级过的电影。
2. 基于项目的协同过滤
基于项目的协同过滤推荐系统与基于用户的协同过滤不同,它使用项目之间的相似度而不是用户之间的相似度。基于项目的推荐系统的基本思想是,如果用户的历史数据中显示过对项目A喜欢,如果项目B与项目A相似,那么该用户可能也喜欢项目B,如下图所示。
基于用户的协同过滤有几个缺点:
当用户画像或用户输入变化很快时,那么我们必须重新计算相似度,它的计算成本非常高昂。
基于项目的推荐引擎可以避免上述这些缺点,通过计算项目或产品之间的相似度,而不是计算用户之间的相似度,从而降低计算成本。因为项目目录不会经常发生改变,我们不需要经常重新计算相似度。
与基于用户的协同过滤方法步骤大致相同,基于项目的协同过滤步骤如下:
基于项目的协同过滤最常用的相似度度量是余弦相似度。余弦相似度计算的是在向量空间中两个n维向量之间的相似度。由以下方程给出:
在将余弦相似度应用于推荐系统时,我们将项目列看作n维向量,并将两个项目之间的相似度看作它们之间的夹角。角度越小,项目越相似。
例如,在前面的数据集中,如果我们想要预测Toby对电影《Lady in the Water》评级,首先我们要找出与《Lady in the Water》相似的电影。使用上面的余弦方程,我们可以计算所有项目的相似度。下表显示所有电影的相似度值。
以项目为基础的相似度计算只针对共评项目。
通过观察上面表格,可以看出《You Me and Dupree》与《Lady in the Water》相似度最高 ( 0.8897565 )。
现在可以通过Toby对《Lady in the Water》评级计算加权总和来进行预测。也就是说,我们使用Toby评级过的每一部电影与《Lady in the Water》的相似度分数,乘以对应的评级,并对所有已评级电影的分数求和。这个最后的总和除以《Lady in the Water》的相似度分数总和,如下所示:
计算《Lady in the Water》的电影评级:
(0.795×4.5 + 0.814×4 + 0.889×1)÷(0.795+0.814+0.889) = 3.09
同理,通过上述的计算方式可以推算出其他用户对电影的评级。
3. 优点
4. 缺点
在上一节我们看到通过仅参考用户对产品的评级或是交互信息从而生成推荐信息,换而言之,为活跃用户推荐新项目是基于与当前用户相似的用户对该项目的评级来进行的。
回忆一下前面介绍到的电影评级数据,其中有个用户给某部电影打了4星,在协同过滤中,算法只需要考虑根据评级去生成推荐。而在现实世界中,真实用户之间进行推荐时会根据电影特点或者内容来评级,比如电影的类型、演员、导演、故事情节和剧本。真实用户会根据个人喜好有选择性地进行观看。根据这些现实情况,想要达到最大化实现商业目的,在构建推荐引擎时,需要通过考虑如何根据个人的品味和产品内容来进行推荐,而不是单纯地将目标设定在寻找相似用户的品味以进行推荐。
这种针对用户自身偏好和产品内容的推荐,称之为基于内容的推荐系统,如下图所示。
构建基于内容的推荐引擎的另一个目的是想要解决协同过滤方法中新用户面临的冷启动问题。当一个新用户登录时,可以根据个人的品味,进行新项目的推荐。
构建基于内容的推荐系统,主要有以下三个步骤:
项目画像生成: 该步主要将产品根据产品特征进行抽象描述。最常见是将产品内容表示在向量空间模型中,将产品名称作为行,特征作为列。通常产品内容可能是结构化数据,也可能是非结构化数据。结构化数据会存储到数据库中,非结构化的特征可能包含网站中相关的评论、标签或者是文本属性。在本步骤中,需要提取相关的特征以及它们与产品相关的相对重要性分值。
对项目进行画像生成时可以使用词频—逆文档频率 ( 简称TF—IDF ),它可以计算出项目相关的较为重要特征。由于该推荐系统需要将项目的特征使用向量进行表示,所以可以使用TF—IDF。
举个例子以方便大家更好地理解这种思想。上面提到基于内容的推荐引擎需要更多关于电影内容的信息,如下表所示。
首先我们要做的是使用TF—IDF创建项目画像。详细步骤如下:
创建一个特征词频矩阵,它通常包含对每个文档中每个特征词的详细统计,引入到本例中,可以理解成每部电影是否属于某一类型。数字1代表属于该类型,而0代表不属于该类型,如下表所示。
接下来通过逆文档频率 ( IDF ) 的公式计算出每个电影类型的频率。公式如下:
Idf = log ( 文档总数/文档频率 )
本例中,文档的总数是电影的总数,文档频率指的是它们在所有文档中出现的总次数,如下表所示。
最后一步是通过以下公式构建TF—IDF矩阵:
tf*idf
1. 用户画像生成
本步将构建匹配产品内容的用户画像或偏好矩阵。一般来说,在构建用户画像或特征时基于共同的产品内容,而通过比较用户和项目画像并计算它们之间的相似度将会更有意义。
考虑下表中的数据集,该数据集记录了每位用户的历史观影记录。单元格中为1表示用户观看过该部电影。这些信息清晰地说明了用户对电影的偏好。
根据前面的信息,我们将创建一个可以用来与项目画像比较的用户画像,也就是说,我们现在要构建一个用户画像,其中包含用户对项目特征 ( 这里是电影类型信息 ) 的偏好。将TF—IDF和用户偏好矩阵求点积,从而得到用户对每种类型电影的亲和度,如下表所示。
DotProduct(Tf-idf, userPreference matrix)
现在已经得到用户画像和项目画像,接下来可以预测用户对每个项目的喜爱程度。我们现在可以通过余弦相似度计算用户对项目的喜好。在本例中,通过计算用户画像和项目画像的余弦相似度得出以下结果。
cosineSimilarity(userProfile, ItemProfile)
从上面的表格中,我们不难发现,余弦角越大越可能是用户喜欢的电影,也就是可以向用户推荐的电影。
现在我们已经完成了推荐,让我们回头看一下如何收集用户喜好数据。通常有两种获取用户数据的方法,如下所示:
到目前为止介绍的基于内容的推荐引擎,都是基于相似度计算。当然并不是只有相似度算法,也可以使用有监督的机器学习方法,如分类也可以用在推测用户最有可能喜欢的产品上。
使用机器学习或其他数学模型、统计模型生成推荐信息的推荐系统称为基于模型的推荐系统。基于分类的方法属于基于模型的推荐系统,首先使用用户画像和项目画像构建机器学习模型来预测用户对项目是否喜欢。有监督分类常用的有:逻辑回归、KNN分类、概率方法等。基于模型的推荐引擎将在下一节中讨论。
2. 优点
3. 缺点
随着时间的推移,推荐系统一直在不断地快速发展变化,从最初的基于近邻算法的推荐引擎到针对单个用户的个性化推荐系统的出现。这些个性化推荐系统在商业上的应用取得了巨大的成功,它为用户提供了较合理的推荐信息,提高了用户的购买可能性,使企业获得更多利益。
尽管个性化推荐系统定位在单个用户级别,推荐的信息是根据个人喜好得出,但仍然有可以改进的地方。比如,同一个人在不同的地方可能有不同的需求。又或者,同一个人在不同的时间也会有不同的需求。如下图所示。
我们的推荐引擎需要足够智能,它需要进化到能够满足用户在不同时间、不同地点的需求。比如冬天推荐用户购买皮夹克,夏天推荐人们购买衬衫。又或是,根据一天的不同时段,为用户推荐好的餐厅进行早餐或者晚餐,这样的推荐信息对于用户来说是非常有帮助的。这种可以考虑到位置、时间、情绪等相关因素,定义用户的情境并进行推荐的系统,被称为情境感知推荐系统,如下图所示。
上图展示了一个在寒冷的天气向用户推荐热咖啡的推荐引擎。
1. 情境定义
那么到底什么是情境呢?一般来说,情境指的是用户所处的当前状态。用户的情境可以是用户所处的任何状态,比如地点、时间、日期、季节、心情、计划、用户是否一个人、是在办公室、在度假、与家人或朋友在一起、是否面临人生大事等。正是因为用户在不同的情境下会有不同的需求,所以推荐系统可以捕捉用户的情境信息,从而为用户提供更为有效的推荐。
例如,旅游度假推荐引擎可以考虑把季节、地点和时间作为情境以改善推荐。又或者在电子商务网站的推荐引擎中,可以把用户是否面临人生大事和用户的购买行为考虑为推荐情境。又或是一个食品网站推荐引擎可以考虑用餐时间、地点等信息。
情境感知推荐系统需要如何设计?到现在为止,书中已经介绍的推荐引擎最多是在二维空间中建模,主要是基于用户的偏好和项目特征数据而进行的。而对于情境感知推荐系统来说,它在建模的时候加入了一个新的维度,即分析用户的情境。使推荐引擎从解决二维问题扩展到三维问题,如下图所示。
Recommendations = User x Item x Context
回顾一下基于内容的推荐系统中涉及的例子。基于内容的推荐引擎考虑用户画像和项目画像,通过计算用户画像和项目画像的相似度并基于用户偏好以为每个项目生成用户评级。而在情境感知推荐系统中,需要考虑加入情境,对应用户偏好和情境生成项目排序。
举例说明,假设推荐系统已经收集到用户在不同时间观影的历史数据,类型包括weekday、weekend和Holiday。通过该情境信息,可以分析出每位用户与电影内容之间的关系。如下表所示,表中数据显示用户TOBY在以观影时间类型为情境的前提下,会对哪种电影内容比较感兴趣。
通过对用户数据的分析,参考所有的电影内容类型,可以为用户TOBY构建一个基于内容情境的用户画像。
将得到情境矩阵和用户画像矩阵求点积,从而得出关于所有情境的用户画像,如下表所示。
Dotproduct(user profile, context matrix) for TOBY:
现在计算得到了TOBY关于电影内容的各个情境的偏好。下一步是计算TOBY在全部情境中对每部电影的排序,如下表所示。
Cosine similarity (contextual movie content preference matrix, item profile):
现在得到了TOBY的情境级电影排序,可以在此基础上进行电影推荐了。
从上面的例子中,不难看出现在接触到的这种情境感知推荐系统,其实是在基于内容的推荐系统的基础上加入了一个新的维度,即情境。情境感知系统在生成推荐信息时,主要过程分为两步,如下所述:
常用的构建情境感知系统的方法如下:
2. 前置过滤法
在前置过滤法中,情境信息会被应用到用户画像和产品内容上。这一步会过滤掉所有非相关的特征,最终的个性化推荐会通过剩余的特征集生成。因为特征过滤是在生成个性化推荐之前进行的,所以称这种方法为前置过滤法。如下图所示。
3. 后置过滤法
在后置过滤法中,首先会基于用户画像和产品特征生成个性化推荐,之后再根据当前情境过滤出相关产品。如下图所示。
4. 优点
5. 缺点
协同过滤推荐系统与基于内容的推荐系统都很有效,适用范围也很广。它们都有很成功的实现,但也有各自的局限性。目前的研究已经开始朝着如何结合协同过滤和基于内容的推荐的方向发展。将这两种推荐系统相结合,产生的新型推荐系统,被称之为混合推荐系统。
如何选择要混合的推荐系统呢?这要根据需要解决什么类型的现实问题或是基于什么样的业务需求考虑,当然还要取决于一个经验丰富的开发人员对问题的判断。
构建混合推荐系统最常见的方法有:加权法、混合法、变换法、层叠法、特征组合法、特征扩充法、元级别 ( Meta-level )。
1. 加权法
在这种方法中,最终的推荐将是所有可用的推荐引擎的推荐结果的组合,通常是线性的。在部署这种加权混合推荐引擎之初,对各个推荐引擎的结果赋予的权重是相等的,然后通过评估用户对推荐的响应,逐渐调整权重。
2. 混合法
当可以混合所有可用的推荐引擎的有效推荐结果时,就可以应用混合法。这种方法主要应用在因为数据稀疏导致不能通过所有可用的推荐系统获得产品评分的情况。因此在采用这种方式生成推荐信息时,推荐是独立生成的,并在发送给用户之前先进行混合。
3. 层叠法
在这种方法中,推荐信息通常采用协同过滤的方式生成。之后应用基于内容的推荐技术,将最终的推荐信息或排序列表进行输出。
4. 特征组合法
特征组合法组合不同推荐系统的特征并将最终推荐方法应用于组合的特征集。在这种技术中,我们组合来自基于内容的推荐系统的用户—项目偏好特征和用户—项目评级信息,并考虑一个新的策略来构建混合推荐系统 ( 如下图所示 )。
5. 优点
到目前为止,我们都专注于用于协同过滤方法的包含用户或产品之间相似度计算的近邻方法,或是将用户和项目内容在一个向量空间模型表示,并寻找相似度度量以识别相似于用户偏好的项目。基于相似度的方法的主要目标是计算出产品或者产品内容的用户偏好权重,然后使用这些特征权重来推荐项目。
这些方法一直很成功,但它们也有自身的局限性。因为相似度计算时,所有的数据都必须加载到环境中,这些方法也被称为基于内存的模型。这些基于内存的模型当数据量非常大时在实时场景中响应速度非常慢,因为所有数据都需要被加载。另一个局限是权重的计算并不是像机器学习应用一样自动学习的。第三个局限是,冷启动问题对系统的限制,基于近邻的方法与基于内存的方法都存在这个问题。
为了突破上述这些局限,相关研究人员已经开始采用更为先进的方法来提升推荐引擎处理问题的能力。如引入概率模型、机器学习模型和矩阵方法等,机器学习常用的有:有监督模型和无监督模型,矩阵方法常用的有:矩阵分解和奇异值分解。在基于模型的方法中,可以利用现有的历史数据,通过自动学习得到的权重进行建模。根据得到的权重信息进行针对产品的预测,将得到的最终结果按照特定需求进行排序,最后得到推荐结果。
1. 概率法
在概率法中,根据来自可用数据的先验概率构建一个概率模型,并根据计算每个用户对产品的偏好概率,如喜欢/不喜欢的概率值,生成推荐排序列表。其中最常用的有朴素贝叶斯算法,这种技术的特点是简单易用,但是功能强大。
2. 机器学习法
如在基于内容的推荐系统中所述,我们可以将推荐问题转变成机器学习的问题进行思考。使用已有的历史用户和产品数据,我们可以从中提取出特征和输出类,然后构建机器学习模型。再使用生成的模型,生成最终的产品推荐列表。常用的机器学习方法有:逻辑回归、KNN分类、决策树、SVM ( 支持向量机 )、聚类等。这些方法在协同过滤、基于内容的推荐系统、情境感知系统和混合推荐系统中都有应用。在第4章中将详细讲解每种机器学习方法。
3. 数学法
在这些方法中,我们假设产品的用户评级或交互信息是简单的矩阵。在这些矩阵中,我们使用数学方法来预测用户对缺失项的评级。最常用的方法是矩阵分解模型和奇异值分解模型,如下图所示。
通过应用矩阵分解方法,假设将原有的评级矩阵R分解成两个新的矩阵 ( U,V ),分别代表用户和电影的潜在特征。
使用数学方法,我们可以把矩阵分解为两个低秩矩阵。在上面的例子中,矩阵R分解成矩阵U和V,现在当我们将U和V进行乘法运算时,将会得到原来的矩阵R。这个概念常被用在推荐引擎中以对原始评级矩阵中的未知评级进行填充。然后对推荐信息进行排序,并向用户进行推荐。
4. 优点
通过本文的学习,我们已经了解到很多流行的推荐引擎技术,如协同过滤、基于内容的推荐系统、情境感知系统、混合推荐系统、基于模型的推荐系统,还有这些系统自身存在的优缺点。本文还介绍了多种相似度计算的方法,如余弦相似度、欧氏距离和皮尔逊系数。对每个推荐系统的子分类也进行了说明。
今天的分享就到这里,谢谢大家。
——本文摘自《自己动手做推荐引擎》 经出版方授权发布。
作者介绍:
苏雷什·库马尔·戈拉卡拉 ( Suresh Kumar Gorakala ) 是一位专注于人工智能方向的数据科学家。他拥有近10年的专业经验,曾为多个领域的全球客户服务,并帮助他们使用先进的大数据分析技术解决业务问题。他主要从事推荐引擎、自然语言处理、高级机器学习和图数据库等方面的工作。
领取专属 10元无门槛券
私享最新 技术干货