一 推荐系统

1.1 推荐系统概述

​ 在现今信息数据爆炸的背景下,如何从海量数据中找到感兴趣的信息?在这样的情况下,搜索引擎无疑成了人们最常用的信息获取工具,通过搜索引擎可以精准的获取感兴趣的信息,但搜索引擎并不能完全满足用户对信息发现的需求,那是因为在很多情况下,用户其实并不明确自己的需要,或者他们的需求很难用简单的关键字来表述。又或者他们需要更加符合他们个人口味和喜好的结果,因此出现了推荐系统,与搜索引擎对应又叫做推荐引擎。

1.2 推荐引擎原理

推荐系统算法与KTV点歌推荐

​ 上图给出了推荐引擎的工作原理图,这里先将推荐引擎看作黑盒,它接受的输入是推荐的数据源,一般情况下,推荐引擎所需要的数据源包括:

  • 要推荐物品或内容的元数据,例如关键字,基因描述等;

  • 系统用户的基本信息,例如性别,年龄等

  • 用户对物品或者信息的偏好,根据应用本身的不同,可能包括用户对物品的评分,用户查看物品的记录,用户的购买记录等。其实这些用户的偏好信息可以分为两类:

  • 显式的用户反馈:这类是用户在网站上自然浏览或者使用网站以外,显式的提供反馈信息,例如用户对物品的评分,或者对物品的评论。

  • 隐式的用户反馈:这类是用户在使用网站是产生的数据,隐式的反应了用户对物品的喜好,例如用户购买了某物品,用户查看了某物品的信息等等。

​ 显式的用户反馈能准确的反应用户对物品的真实喜好,但需要用户付出额外的代价,而隐式的用户行为,通过一些分析和处理,也能反映用户的喜好,只是数据不是很精确,有些行为的分析存在较大的噪音。但只要选择正确的行为特征,隐式的用户反馈也能得到很好的效果,只是行为特征的选择可能在不同的应用中有很大的不同,例如在电子商务的网站上,购买行为其实就是一个能很好表现用户喜好的隐式反馈。

​ 推荐引擎根据不同的推荐机制可能用到数据源中的一部分,然后根据这些数据,分析出一定的规则或者直接对用户对其他物品的喜好进行预测计算。这样推荐引擎可以在用户进入的时候给他推荐他可能感兴趣的物品。

二 推荐引擎评价指标

推荐准确度:这个参数可以离线计算所得,而且较为的客观,所以是各大研究论文算法最重要的参考指标。总体来说,推荐系统有两大任务:“预测”和“推荐”,所以推荐系统准确度的评分包括:

  • 评分预测:学习用户的评价模型,用于预测用户对于未接触事物的评分,其实可以看作是一个回归模型,一般用均方根误差或者绝对误差来衡量;
  • TopN推荐:给用户一个个性化的推荐列表,其一般通过准确度、召回率等指标评估。其中N也是一个可变参数,可以根据不同的N描绘出对应算法的ROC曲线来进一步评价推荐效果;

覆盖率:体现了挖掘算法对发掘长尾商品的能力。最简单的定义是,对所有用户推荐出的产品做并集,然后看这个出现的并集产品与总产品数中所占的比例,这种方式比较的粗线条,因为推荐系统中马太效应频繁,所以好的推荐算法应当是所有商品被推荐的几率差不多,都可以找到各自合适的用户,所以实际中会考虑信息熵、基尼系数等指标。
多样性:其原理可以表述为不在一棵树上吊死。因整个推荐系统涉及到的因素太多,如果只推荐用户一个类别的相似物品,失败风险比较的大,而且也难以实现整个推荐效益的最大化。
新颖性:原理就是那些用户没有接触过、没有操作过的商品,或者是流行度比较低的商品,对用户来说是比较新鲜的物品,往往会有意外的效果。
信任度:这个指标比较的主观,就是让用户信任推荐系统做出的推荐是有根据有理由的,以及推荐系统内部是如何运作的。例如亚马逊的商品推荐会给出推荐理由,作为用户的我会觉得很贴心,否则用户会觉得商家的利益驱动而带有抵触心理。
健壮性:比如针对关联推荐算法,商户恶意下单提高产品的推荐频率,水军恶意评论等。

三 推荐引擎分类

3.1 其实这里讲的是如何发现数据的相关性,因为大部分推荐引擎的工作原理还是基于物品或者用户的相似集进行推荐。那么参考图 1 给出的推荐系统原理图,根据不同的数据源发现数据相关性的方法可以分为以下几种:

  • 根据系统用户的基本信息发现用户的相关程度,这种被称为基于人口统计学的推荐(Demographic-based Recommendation)
  • 根据推荐物品或内容的元数据,发现物品或者内容的相关性,这种被称为基于内容的推荐(Content-based Recommendation)
  • 根据用户对物品或者信息的偏好,发现物品或者内容本身的相关性,或者是发现用户的相关性,这种被称为基于协同过滤的推荐(Collaborative Filtering-based Recommendation)。

3.2 根据推荐模型的建立方式

​ 可以想象在海量物品和用户的系统中,推荐引擎的计算量是相当大的,要实现实时的推荐务必需要建立一个推荐模型,关于推荐模型的建立方式可以分为以下几种:

  • 基于物品和用户本身,这种推荐引擎将每个用户和每个物品都当作独立的实体,预测每个用户对于每个物品的喜好程度,这些信息往往是用一个二维矩阵描述的。由于用户感兴趣的物品远远小于总物品的数目,这样的模型导致大量的数据空置,即我们得到的二维矩阵往往是一个很大的稀疏矩阵。同时为了减小计算量,我们可以对物品和用户进行聚类, 然后记录和计算一类用户对一类物品的喜好程度,但这样的模型又会在推荐的准确性上有损失。
  • 基于关联规则的推荐(Rule-based Recommendation):关联规则的挖掘已经是数据挖掘中的一个经典的问题,主要是挖掘一些数据的依赖关系,典型的场景就是“购物篮问题”,通过关联规则的挖掘,我们可以找到哪些物品经常被同时购买,或者用户购买了一些物品后通常会购买哪些其他的物品,当我们挖掘出这些关联规则之后,我们可以基于这些规则给用户进行推荐。
  • 基于模型的推荐(Model-based Recommendation):这是一个典型的机器学习的问题,可以将已有的用户喜好信息作为训练样本,训练出一个预测用户喜好的模型,这样以后用户在进入系统,可以基于此模型计算推荐。这种方法的问题在于如何将用户实时或者近期的喜好信息反馈给训练好的模型,从而提高推荐的准确度。

​ 其实在现在的推荐系统中,很少有只使用了一个推荐策略的推荐引擎,一般都是在不同的场景下使用不同的推荐策略从而达到最好的推荐效果,例如 Amazon 的推荐,它将基于用户本身历史购买数据的推荐,和基于用户当前浏览的物品的推荐,以及基于大众喜好的当下比较流行的物品都在不同的区域推荐给用户,让用户可以从全方位的推荐中找到自己真正感兴趣的物品。

四 推荐机制

4.1 基于人口统计学的推荐

​ 基于人口统计学的推荐机制(Demographic-based Recommendation)是一种最易于实现的推荐方法,它只是简单的根据系统用户的基本信息发现用户的相关程度,然后将相似用户喜爱的其他物品推荐给当前用户,图 2 给出了这种推荐的工作原理。

推荐系统算法与KTV点歌推荐

图2 基于人口统计学的推荐

​ 从图 2中可以很清楚的看到,首先,系统对每个用户都有一个用户 Profile 的建模,其中包括用户的基本信息,例如用户的年龄,性别等等;然后,系统会根据用户的 Profile 计算用户的相似度,可以看到用户 A 的 Profile 和用户 C 一样,那么系统会认为用户 A 和 C 是相似用户,在推荐引擎中,可以称他们是“邻居”;最后,基于“邻居”用户群的喜好推荐给当前用户一些物品,图中将用户 A 喜欢的物品 A 推荐给用户 C。

这种基于人口统计学的推荐机制的好处在于:

  1. 因为不使用当前用户对物品的喜好历史数据,所以对于新用户来讲没有“冷启动(Cold Start)”的问题。
  2. 这个方法不依赖于物品本身的数据,所以这个方法在不同物品的领域都可以使用,它是领域独立的(domain-independent)。

​ 那么这个方法的缺点和问题是什么呢?这种基于用户的基本信息对用户进行分类的方法过于粗糙,尤其是对品味要求较高的领域,比如图书,电影和音乐等领域,无法得到很好的推荐效果。可能在一些电子商务的网站中,这个方法可以给出一些简单的推荐。另外一个局限是,这个方法可能涉及到一些与信息发现问题本身无关却比较敏感的信息,比如用户的年龄等,这些用户信息不是很好获取。

4.2 基于内容的推荐

​ 基于内容的推荐是在推荐引擎出现之初应用最为广泛的推荐机制,它的核心思想是根据推荐物品或内容的元数据,发现物品或者内容的相关性,然后基于用户以往的喜好记录,推荐给用户相似的物品。图 3 给出了基于内容推荐的基本原理。

推荐系统算法与KTV点歌推荐

图3 基于内容的推荐

​ 图 3 中给出了基于内容推荐的一个典型的例子,电影推荐系统,首先我们需要对电影的元数据有一个建模,这里只简单的描述了一下电影的类型;然后通过电影的元数据发现电影间的相似度,因为类型都是“爱情,浪漫”电影 A 和 C 被认为是相似的电影(当然,只根据类型是不够的,要得到更好的推荐,我们还可以考虑电影的导演,演员等等);最后实现推荐,对于用户 A,他喜欢看电影 A,那么系统就可以给他推荐类似的电影 C。

​ 这种基于内容的推荐机制的好处在于它能很好的建模用户的口味,能提供更加精确的推荐。但它也存在以下几个问题:

  1. 需要对物品进行分析和建模,推荐的质量依赖于对物品模型的完整和全面程度。在现在的应用中我们可以观察到关键词和标签(Tag)被认为是描述物品元数据的一种简单有效的方法。
  2. 物品相似度的分析仅仅依赖于物品本身的特征,这里没有考虑人对物品的态度。
  3. 因为需要基于用户以往的喜好历史做出推荐,所以对于新用户有“冷启动”的问题。

​ 虽然这个方法有很多不足和问题,但他还是成功的应用在一些电影,音乐,图书的社交站点,有些站点还请专业的人员对物品进行基因编码,比如潘多拉,在一份报告中说道,在潘多拉的推荐引擎中,每首歌有超过 100 个元数据特征,包括歌曲的风格,年份,演唱者等等。

4.3 基于协同过滤的推荐

4.3.1 基于用户的推荐(User-based Recommendation 找与你品位相似的K-邻居用户,他们喜欢的,你也可能喜欢)

​ 基于用户的协同过滤推荐的基本原理是,根据所有用户对物品或者信息的偏好,发现与当前用户口味和偏好相似的“邻居”用户群,在一般的应用中是采用计算“K- 邻居”的算法;然后,基于这 K 个邻居的历史偏好信息,为当前用户进行推荐。下图 4 给出了原理图。

推荐系统算法与KTV点歌推荐

图4 基于用户的协同过滤推荐

​ 上图示意出基于用户的协同过滤推荐机制的基本原理,假设用户 A 喜欢物品 A,物品 C,用户 B 喜欢物品 B,用户 C 喜欢物品 A ,物品 C 和物品 D;从这些用户的历史喜好信息中,我们可以发现用户 A 和用户 C 的口味和偏好是比较类似的,同时用户 C 还喜欢物品 D,那么我们可以推断用户 A 可能也喜欢物品 D,因此可以将物品 D 推荐给用户 A。

​ 基于用户的协同过滤推荐机制和基于人口统计学的推荐机制都是计算用户的相似度,并基于“邻居”用户群计算推荐,但它们所不同的是如何计算用户的相似度,基于人口统计学的机制只考虑用户本身的特征,而基于用户的协同过滤机制是在用户的历史偏好的数据上计算用户的相似度,它的基本假设是,喜欢类似物品的用户可能有相同或者相似的口味和偏好。

4.3.2 基于项目的推荐(Item-based Recommendation,发现物品和物品之间的相似度,用户喜欢B,B和C类似,则用户也可能喜欢C)

​ 基于项目的协同过滤推荐的基本原理也是类似的,只是说它使用所有用户对物品或者信息的偏好,发现物品和物品之间的相似度,然后根据用户的历史偏好信息,将类似的物品推荐给用户,图 5 很好的诠释了它的基本原理。

​ 假设用户 A 喜欢物品 A 和物品 C,用户 B 喜欢物品 A,物品 B 和物品 C,用户 C 喜欢物品 A,从这些用户的历史喜好可以分析出物品 A 和物品 C 时比较类似的,喜欢物品 A 的人都喜欢物品 C,基于这个数据可以推断用户 C 很有可能也喜欢物品 C,所以系统会将物品 C 推荐给用户 C。

​ 与上面讲的类似,基于项目的协同过滤推荐和基于内容的推荐其实都是基于物品相似度预测推荐,只是相似度计算的方法不一样,前者是从用户历史的偏好推断,而后者是基于物品本身的属性特征信息。

推荐系统算法与KTV点歌推荐

​ 同为协同过滤,在基于用户和基于项目两个策略中应该如何选择呢?其实基于项目的协同过滤推荐机制是 Amazon 在基于用户的机制上改良的一种策略,在大部分场景中,物品的个数是远远小于用户的数量的,而且物品的个数和相似度相对比较稳定,同时基于项目的机制比基于用户的实时性更好一些。但也不是所有的场景都是这样的情况,可以设想一下在一些新闻推荐系统中,也许物品,也就是新闻的个数可能大于用户的个数,而且新闻的更新程度也有很快,所以它的形似度依然不稳定。所以,其实可以看出,推荐策略的选择其实和具体的应用场景有很大的关系。

4.3.3 基于模型的推荐(Model-based Recommendation ,基于用户喜好构建一个模型,然后基于模型金进行实时推荐)

​ 基于模型的协同过滤推荐就是基于样本的用户喜好信息,训练一个推荐模型,然后根据实时的用户喜好的信息进行预测,计算推荐。

基于协同过滤的推荐机制是现今应用最为广泛的推荐机制,它有以下几个显著的优点:

  1. 它不需要对物品或者用户进行严格的建模,而且不要求物品的描述是机器可理解的,所以这种方法也是领域无关的。
  2. 这种方法计算出来的推荐是开放的,可以共用他人的经验,很好的支持用户发现潜在的兴趣偏好

而它也存在以下几个问题:

  1. 方法的核心是基于历史数据,所以对新物品和新用户都有“冷启动”的问题。
  2. 推荐的效果依赖于用户历史偏好数据的多少和准确性。
  3. 在大部分的实现中,用户历史偏好是用稀疏矩阵进行存储的,而稀疏矩阵上的计算有些明显的问题,包括可能少部分人的错误偏好会对推荐的准确度有很大的影响等等。
  4. 对于一些特殊品味的用户不能给予很好的推荐。
  5. 由于以历史数据为基础,抓取和建模用户的偏好后,很难修改或者根据用户的使用演变,从而导致这个方法不够灵活。

4.4 混合推荐机制

​ 在现行的 Web 站点上的推荐往往都不是单纯只采用了某一种推荐的机制和策略,他们往往是将多个方法混合在一起,从而达到更好的推荐效果。
​ 举个例子如Amazon中除此基于用户的推荐之外,还会用到基于内容的推荐(物品具有相同关键词和Tag):如新产品的推荐;基于项目的协同过滤推荐(喜欢A,C与A类似,可能也喜欢C):如捆绑销售和别人购买/浏览的商品。
​ 总之,多种推荐方式结合,加权(用线性公式(linear formula)将几种不同的推荐按照一定权重组合起来,具体权重的值需要在测试数据集上反复实验,从而达到最好的推荐效果。)、切换、分区、分层等混合。但不论是哪种推荐方式,一般也就涵盖在上文所述的推荐方式中。

五 推荐系统应用

5.1 听歌音乐推荐的实现

5.1.1 推荐算法

​ 音乐是一个典型的长尾物品丰富,用户个性化需求强烈的领域,且物品的数量与变化程度都不如用户方面显著,十分适用于基于物品的协同过滤算法(以下简称ItemCF)

推荐系统算法与KTV点歌推荐

​ 需要注意的是,因为热门音乐的消费面广,使得任何音乐都和热门音乐有很大的相似度,同时每个用户产生行为的权重也不一样,比如活跃用户因为大量的消费行为,导致许多音乐之间都产生了联系,这显然是不能完全等同不活跃用户产生的行为的,所以这里对热门音乐做了的惩罚。一般认为,冷门音乐比热门音乐更反映兴趣,不活跃用户比活跃用户的消费行为更有价值,当然此处“专家”用户不包括在活跃用户中。

​ 在得到音乐的相似度后,我们可以通过如下公式计算用户u对一个音乐j的兴趣(兴趣度*相似度),并得到一个初始的推荐结果,即和用户历史上感兴趣的音乐越相似的音乐,越有可能获得更高的相似度。

推荐系统算法与KTV点歌推荐

S(j,K)S(j, K)是和音乐j最相似的K首音乐的集合, WjiW_{ji}是音乐j和i的相似度,ruir_{ui}是用户u对音乐i的兴趣,该公式的含义是:和用户历史上感兴趣的歌曲越相似的歌曲,越有可能在用户的推荐列表中获得比较高的排名。

5.1.2 过滤和排序

​ 在获得了初始结果后,需要对数据做进一步的处理,才能得到可用的推荐列表。首先推荐系统会根据某些既定策略进行过滤,比如质量很差的音乐、用户在某个时间段内产生过规定行为(如喜欢/下载)的音乐、用户表现出明音乐等等。

​ 举个例子:张三喜欢听音乐A,但是不喜欢听音乐B且选过不喜欢,但是音乐A和音乐B具有很高的相似度,那么根据初始的推荐算法计算,音乐B会进入初始推荐结果中,此时系统为了保证张三得到满意的推荐结果,就需要在正式推荐列表中过滤音乐B。

​ 在过滤完成后,将剩余的结果按照已有的排名规则进行Ranking,一般来说排名规则需要综合考虑相似度、用户预估反馈(听/下载/喜欢)、新颖性、多样性以及时间多样性等因素,得到一个包含多个解释变量的方程,根据每首歌计算出的值。

​ 这里着重解释下时间多样性,时间多样性是指用户在不同时间或在产生新的行为后使用推荐得到的结果是不尽相同的。要提高推荐系统的时间多样性要从两个地方着手,**首先要保证推荐系统的实时性,**在用户有新行为时实时调整推荐结果以满足用户最近的需求。第二方面是要在用户没有新行为时,也要保证推荐结果每天都有变化。

​ 具体来看:当用户在每日推荐对推荐的歌曲中点击不感兴趣后,歌单会马上移除这首歌曲,同时系统需要实时记录这些数据并转化为新特征,保证在之后的推荐中实时用到该特征;同时每日推荐也需要保证即使用户在连续的几日没有使用的情况下,歌单的内容也是不断变化的。

5.1.3 归一化与多样性

​ 既然提到多样性,就不得不讨论下归一化的问题,尤其在物品具有较多类目的音乐平台中,我们更需要考虑下面这样一个场景:

​ 假设张三喜欢五首A类歌曲,喜欢五首B类歌曲,A类歌曲之间的相似度为0.7,而B类的歌曲相似度只有0.4,A类与B类的歌曲相似度只有0.3,那根据上文的相似度公式得到的推荐结果应该全为A类歌曲,而这显然是不符合我们的预期的。

​ 上述的情况的产生主要是由于一些音乐类的类内音乐相似度较高(一般来说,热门的类的类内相似度比较大)如果不进行归一化,有可能会导致推荐列表都是某一类的音乐,所以在实际操作中,可以将所有A类和B类歌曲分别看做一个物品,这样推荐的结果应该是A类和B类歌曲数量占比差不多,再从A类和B类中分别选出5首歌,可以按照上文的方式进行选取。当然在实际操作中,归一的粒度粗细还需要视具体情况决定。

5.2 KTV点歌推荐的实现

​ 听歌推荐一般是基于用户行为(播放、收藏等)和歌曲自身风格(类型、情感、音色、旋律、节奏等)等数据,推荐用户可能感兴趣的歌。这里用户感兴趣的歌指的是:不关注用户之前是否听过、是否会唱该歌曲,根据推荐系统产生的结果进行推送的歌曲。也就是说听歌推荐系统对于使用场景的要求没有那么严格。

​ 与听歌推荐相比,点歌推荐系统受使用场景限制十分明显:只有在点歌前后,甚至只是在点歌时才会有使用。关注点在于,为用户找到想唱的和能唱的歌。但是两者之间又存在着联系,对于一般人来说,只有听过的歌曲,听得多的歌曲才会唱,从这一点来看,点歌推荐系统和用户的历史听歌记录存在着强联系。

​ KTV点歌推荐可以分为线下推荐和线上推荐,线下推荐是指在KTV点歌房使用点歌终端点歌推荐,线上推荐是指利用手机APP,微信公众号等绑定点歌房,在线点歌。针对这两种点歌场景,需要设计不同的推荐方式。

5.2.1 KTV线上点歌推荐

​ 对于使用手机APP,微信公众号等在KTV进行在线点歌的用户,在关注公众号,或者注册APP时,系统已经记录下了其个人信息,并且每次点歌的数据都会保存,这里我们不考虑冷启动的问题,有了个人信息,点歌列表和歌曲库,可以利用基于内容的推荐和系统过滤算法来为用户推荐个性化歌曲。现在的商用推荐系统一般采用混合推荐,将基于内容的推荐,流行度推荐,协同过滤推荐,进行线性加权结合。

5.2.2 KTV线下点歌推荐(点歌台点歌)

​ 对于使用KTV点歌房终端进行点歌的用户,不能事先知道其用户信息,只拥有其当前所点歌曲的信息,同时由于KTV点歌台一般为多人使用,比如用户A在点歌台点了5首歌,用户B紧随其后又点了3首歌,如何在这种对于用户信息一无所知,点歌用户变更比较频繁的场景下进行推荐呢?一个自然而然的想法是,利用已有的点歌信息,生成下一首的歌曲推荐。这种方式利用到了在KTV中经常在一起被点歌曲的记录,在一个包厢之中产生的歌曲都可以看成是常在一起出现的歌曲,就像啤酒和尿布的例子,利用关联规则挖掘,找出频繁项集,再利用排序算法为用户产生下一首歌曲的推荐。

​ 在现今深度学习背景下,深度模型大行其道。Word2vec是一种神经网络模型,起初被用来学习对自然语言处理课题非常有用的词嵌入(word embeddings)。最近几年,这项技术被更广泛地用到其他机器学习问题上,如产品推荐。神经网络分析输入的文本语料库,对词汇表中的每个单词生成代表这个单词的向量,这些向量编码了词义与上下文的关系这一重要信息。如何应用到KTV点歌推荐呢?我们可以把每个包厢每次点歌的歌曲列表当作一个句子,句子中的每个单词就是歌名。通过这些句子训练Word2vec模型意味着对该包厢某一次点歌列表中某个歌曲的前后歌曲训练模型,训练后得到一个模型,能够输出代表歌曲的高维向量,经常在一起点的歌曲其向量距离比不常在一起点的向量距离近。简单来说,就是如果两首歌经常在一起点,那么他们的距离就近,反之亦然。所以对于特定的某一首歌,我们可以通过这首歌和其他所有歌曲向量之间的余弦相似性取余弦值最大的k首歌,即找到了k首最相似歌曲(向量之间的夹角最小就最相似)。由于只利用了包厢产生的点歌列表,不依赖于用户信息,可以用在KTV线下点歌场景,根据用户当前点歌,立即为用户推荐下一首歌曲。

相关文章: