推荐系统入门【分类、传统推荐算法、UserCF和ItemCF】
一、推荐系统分类
推荐系统根据推荐对象的特点,可分成两种类型: 一种是网页作为推荐对象的推荐系统,采用Web数据挖掘的方法与技术,为用户推荐符合其兴趣爱好的网页; 另一种是商品为推荐对象的个性化推荐系统,为用户推荐符合其兴趣爱好的各类产品,如各种书籍、音像等,这种推荐系统是一般意义上的推荐系统。 ?
推荐系统按其实现的技术来分,可分为如下几类: 基于关联规则的推荐系统、基于内容的推荐系统、基于协同过滤推荐系统和混合式推荐系统。 由于实现技术各有优缺点,在实际应用中,经常采用混合式推荐思路,其中研究时间最久和应用最多的是基于内容的推荐系统和协同过滤推荐系统。 ?
二、传统推荐算法
2.1 基于规则的推荐
在基于规则的推荐系统中,定义了许多的规则,根据规则来决定不同的情况下如何提供不同的服务,因此,推荐的质量依赖于规则的质量和数量。一个规则本质上是一个 如果-就 语句,规则之间具有不同的支持度。基于规则的推荐使用挖掘出的关联规则对用户进行推荐。 基于规则的系统一般分为3个部分:关键词层、描述层和用户接口层。 关键词层提供上层描述所需的关键词,并定义关键词间的依赖关系,在该层可定义静态属性的个性化规则。 描述层定义用户描述和资源描述,由于描述层是针对具体的用户和资源,所以描述层的个性化规则是动态变化的。描述层中的用户描述文件和资源描述文件需用由关键词层提供的相同的关键词集合来进行描述。 用户接口层提供个性化服务,根据上面两层定义的个性化规则将满足规则的资源推荐给用户。 推荐的具体过程如下:首先根据当前用户浏览过的感兴趣的内容,通过规则推算出用户还没有浏览过的感兴趣的内容,然后根据规则的支持度或重要程度将这些内容排序并展现给用户。 ?
基于规则的系统简单、直接,可应用于所有领域,具有通用性,不仅可推荐与用户过去喜欢的项目相关的项目,还可以推荐与用户过去喜欢的项目不相关的项目。规则的建立可离线进行,因此可保证有效推荐算法的实时性要求。 但是,由于基于规则的推荐算法推荐给用户的项目一定是曾经被某个用户浏览过的,因此新加入的项目在任何一个用户浏览之前无法获得推荐,随着规则数量的增多,系统也将越来越难以管理。
2.2 基于内容的推荐
基于内容过滤推荐是最早被应用的一种个性化推荐技术,能够解决传统的协同过滤推荐中存在的稀疏性等问题。 ?
基于内容的推荐系统利用信息内容和用户兴趣的相似性来过滤信息。基于内容的推荐,又被称为基于信息过滤的推荐,是由信息检索领域提出来的,因此使用了许多信息领域的技术。 基于内容的推荐的基本思想是:对每个用户,都用一个称作用户的兴趣模型的文件构成数据结构来描述其喜好;对每个项目的内容进行特征提取,使用这些特征构成资源描述文件。当需要对某个用户进行推荐时,把该用户的用户兴趣模型同所有项目的待征矩阵进行比较,得到二者的相似度,系统通过相似度推荐文档。 纯粹基于内容的推荐系统是忽略用户行为的,它只考虑信息和信息之间的相似关系,因此它可以解决在协同式过滤中出现的第一评价问题,稀疏问题,特殊用户问题等缺陷。其最大的优点就是建模和商品间的相似度量可脱机运化,因此它具有很快的推荐响应好间,系统简洁有效。 缺点主要包括下几点: (1)模型的有效性问题。 比如在电子商务中,如果用特征向量模型描述商品特征的话,首先得建立一个商品的特征向量空间。选择商品的什么特征和怎么用这些特征能更好地表达一个商品是一件很困难的工作,如果这个工作做得不好的话,对推荐响应时间和推荐质量都会产生负面的影响。 (2)过度特征化问题。 由于基于内容的推荐系统过分依赖于信息的将征,使得用这种技术实现的模型并不能总是很好的表达信息之间关联性。导致系统只能发现和用户己有兴趣相似的资源,不能为用户发现新的感兴趣的资源。比如一些事实上是有很大关联性但从表面特征上看来它们并不是相关的信息就有可能得不到推荐。 (3)自我学习能为较差。 由于基于内容的推荐依赖于己经建立的商品特征向量,这种向量空间并不能快速自动地反映数据环境的变化,例如大量新增加商品或顾客购买行为的不断积累变化的情况,从一定程度上影响其推荐质量。 (4)基于内容的推荐系统在碰到相同主题的内容时,很难区分质量的离低。 例如,在对专业文章资源的推荐中,同一专业科目的文章经常会在内容近似,但实际水平相差较大,因此应具有不同的推荐度,但是基于内容的推荐系统不能识别其质量差异,也从一定程度上影响了其推荐质量。
2.3 基于协同过滤的推荐
协同过滤推荐是至今为止最成功的个巧化推荐技术,被应用到很多领域中。协同过滤通过分析用户兴趣,在用户群中寻找与目标用户具有相似兴趣的用户,综合这些相似用户对某一信息的评价,形成系统对该指定用户对此信息的喜好程度进行预测。协同过滤的实现一般分为两步: 首先,获得用户信息,即获得用户对某些信息项的评价; 其次,分析用户之间的相似性并预测特定用户对某一信息的喜好。 基于用户的协同过滤的基本思想,就是先计算用户之间的相似度,然后找到与目标用户具有相近兴趣爱好的几个用户,称之为邻居,然后将这些邻居所喜好的资源推荐给目标用户。其基本思想非常直观:在日常生活中,人们往往会根据亲朋好友的推荐来做一些选择。协同过滤系统就是将这一思想运用到网络信息服务信息推荐中,基于其它用户对某一信息的评价来向用户进行推荐。详细来说,这种算法主要包括以下步骤:
(1)建立用户-项目评分矩阵
这一步骤将用户对项目的评价转化为用户-项目评分矩阵的形式
(2)寻找最近邻
基于用户的协同过滤算法中最关键的步骤就是为目标用户找到与其兴趣爱好最接近的N个邻居,称为最近邻集合,然后才能依据这个最近邻集合中的用户,给目标用户进行个性化推荐。也就是说,对于每个用户都要维护一个最近邻集合。 在寻找最近邻的过程中,计算相似度是基于用户的协同推荐中最重要的一个环节,能否准确的计算出用户之间的相似度直接影响推荐的准确性。常用的相似性的度量方法有余弦相似性、相关相似性、皮尔森相关系数等。 计算出用户之间的相似度后,就可以根据用户之间的相似度来计算目标用户的最近邻集合。 一般来说,选择最近邻有两种方式: 一种是选择与目标用户的相似度大于某个阈值的用户作为最近邻集合; 另一种是把与目标用户的相似度按照从小到大排序,选择前N个最巧似的用户作为最近邻集合。
(3)产生推荐
得到目标用户的最近邻集合之后,就可W预测用户对某项目的感兴趣程度,并且产生Top-N形式的推荐集。 协同过滤推荐只考虑用户对项目的评价,并不关心用户特征、项目属性等具体内容,能够处理图像、音频和视频等非结构化的复杂数据对象,可以实现跨类别推荐,能够推荐属性内容完全无关的项目,用户无法预测所推荐内容,能够发现用户潜在新奇兴趣。 但实际应用也暴露出很多问题,例如数据稀疏性、冷开始问题,随着用户和项目数不断增多,推荐系统的实时性、可扩展性和推荐性能也越来越差。 ?
2.4 基于混合模式的推荐
由于各种推荐方法都有优缺点和技术特点,并且具有将强的互补性,因此在实际推荐系统中,通常采用组合推荐的方式来对用户做出推荐。目前的组合推荐方法中,较为流行的是将协同过滤和基于内容推荐相结合,最简单的做法就是用协同滤推荐方法和基于内容的方法分别得到一个推荐结果,最终结果由这两者然后按照一定的原则组合产生。 尽管在理论上有很多种方法的组合方式,但在实际应用中解决某一问题时并不见得都有效,因此在混合式的推荐技术中,一个最重要原则就是根据实际情况选择合适的组合方式,使得组合后的推荐方法能够扬长避短,避免或弥补各自的缺点。 在组合方式上,Robin提出了七种组合思路:加权、变换、混合、特征组合、层叠、特征扩充和元级别。其中,
- 加权方式是指将多种推荐技术产生的结果设置成不同的比重,而后累加得到最终的推荐结果;
- 变换方式是指推荐系统根据问题背景和实际情况变换不同的推荐策略,推荐系统中存在多种推荐技术,但每次只能根据具体的环境采取其中的一种策略;
- 混合方式是指同时使用多种推荐技术得到多种推荐结果呈献给用户,为用户提供参考。该方法同加权的方法有些类似,不同之处在于无需对各个推荐结果进行加权,而是直接将全部的推荐结果返回给用户,并注明每一种推荐结果所对应的推荐方法;
- 特征组合方式组合来自不同推荐数据源的特征,将其应用到一种推荐算法中;
- 层叠方式一般使用两种或者多种推荐技术,首先使用一种推荐技术得到一个相对粗糙的结果,而后使用第二种推荐技术在前一次推荐的基础上得到更精确的结果;
- 特征扩充同样也是使用两种或者多种推荐技术,一种技术产生附加的特征信息嵌入到另一种推荐技术的特征输入中,结合前一种推荐技术产生推荐;
- 元级别方法类似于特征扩充法,区别在于元级别用一种推荐方法产生的模型作为另一种推荐方法的输入。
三、存在的问题与挑战
3.1 数据稀疏性
在推荐系统中,用户的评分数据越多,预测精度越准确。然而在实际系统中,由于项目数量通常都远大于用户数量,每个用户仅在少数项目上有评价信息,随着用户规模和项目数量的不断扩大,用户-项目评分矩阵往往变得极其稀疏,用户间的相似性计算会变的非常不准确,无法为目标用户找到正确的近邻集合,从而导致推荐结果质量低下。目前,解决数据稀疏问题的研究大都集中在维数约简的方法,通过使用分类、聚类等技术进行降维,使变换后的数据变得相对稠密。
3.2 特征抽取
在信息检索中,对于文本的特征提取已经比较成熟,常用的方法包括文档频率、信息增益、互信息等。然而在推荐系统中,并不是所有的推荐项目都具有文本特征,譬如音乐、视频、图像等,对这些多媒体内容的特征提取往往需要结合多媒体分析领域的相关技术,特征抽取的难度较大。现在常用的一种替代方式是为这些多媒体内容进行文本描述,然后从这些描述中进行特征抽取;另一种方法就是使用UserCF,通过用户相似性来得到推荐结果。
3.3 冷启动
冷启动主要分成用户冷启动和项目冷启动,是协同过滤中广泛存在的问题之一。用户冷启动通常针对新注册用户,当用户没有查看或者评价任何项目,或者评价信息很少时,系统就无法通过分析获得用户的兴趣爱好,也就无法对用户做出推荐。项目冷启动通常指新增加的项目,如果一个项目没有任何人对其进行评价,这个项目就不会被推荐。目前通常的解决方法是将基于内容的推荐与协同过滤推荐相结合。
3.4 可扩展性
随着系统中用户和项目数量的不断増长,推荐系统的计算量呈现指数级增长趋势,传统协同推荐算法由于需要在整个用户和项目空间上对用户感兴趣的内容进行评分预测,将会消耗大量的计算资源,而长时间的等待和延时会严重影响用户傑验。为了适应大规模的计算,算法的设汁需要兼顾实时性和准确性。目前比较常用的方法是通过对用户和项目进行聚类,在聚类中寻找邻居用户并进行评分预测,缩小了邻居用户的寻找空间,实验结果显示,效果比传统的协同算法有很大的效果提升。 ?
除了上述几个比较重要的问题外,推荐系统的健壮性、推荐可解释性、安全性等方面同样需要人们进行深入研究。 ?
四、UserCF和ItemCF
4.1 User-based CF 基于用户的协同过滤
算法核心思路:当用户进入一个电商平台时,作为电商平台系统找到那些和该用户兴趣/喜好类似的人,然后看看他们喜欢什么,就给该用户推荐什么。简而言之,A和B两个用户相似,然后给A推荐B喜欢的东西。 举个例子:在电商产品中,有用户ID为10001至10006这六位用户,他们对几种商品进行了浏览、收藏、购买、添加到购物车、评论、分享等操作。为了得到用户对某类别产品的兴趣度,我们可以设计这样一个简单的模型,给不同的用户行为赋予不同的分值,比如浏览行为赋予0.1分。整体的行为分值如表:
根据用户的行为,商品分值累加计算,满分10分,加到10后则不再累加。比如A买手机这个商品得到10分(可能是购买2部,则购买分为4分,两次5星评价,则评论分为6分;也有可能是购买分为4分,一次4星评价,一次5星评价,一次分享……) 然后,我们得到1001-1006六位用户对各种商品的偏好程度得分表:(其中表格的数字是用户对该商品“兴趣程度”的一个量化值,0为没兴趣,10为非常有兴趣。空白代表这个商品在系统内,还没有任何依据来判断兴趣如何。)
如果以用户10005作为标本,现在要找到和他兴趣最接近的人,需要对商品的多维向量进行近似求法。一般用余弦相似度来进行度量。 余弦函数相信大家都不陌生,就是中学时候学的cosine函数cos(θ)。余弦相似度,又称为余弦相似性,是通过计算两个向量的夹角的余弦值来评估他们的相似度。具体公式如下:
这里的xi和yi表示a和b的分向量。 给出的相似性范围从-1到1:结果为-1时意味着两个向量指向的方向正好截然相反,1表示它们的指向是完全相同的,0通常表示它们之间是独立的,而在这之间的值则表示中间的相似性或相异性。用简单的话来说,最相似的是1,最不相似的是-1。 在刚才的例子中,把用户在一些不相干的商品类别的爱好当做一个空间向量,把每个商品类别作为一个维度,我们例子中就有手机、平板、电脑、化妆品、零食、水果和玩具共7个维度。我们试着求一下10005这个用户和10006这个用户已知部分的爱好相似程度:
由于“用户10005”没有零食的记录,“用户10006”没有水果和玩具的记录,所以不需要用“用户10005”的零食维度的分数和“用户10006”的水果和玩具两个维度分数来计算相似度。 因为“最相似的是1,最不相似的是-1”。所以10005和10006两个用户的相似度还是很高的。同理也能够求出10005用户和其他任何一个用户的兴趣相似程度。 之后设置一个相似的阈值,如0.8、0.85……或者其他任何一个值,看看相似度超过这个阈值的用户都有什么购物喜好,把他们喜好购买的东西推荐给10005用户作为推荐方案即可(例如例子中,10005和10006的喜好高度相似,就可以将10006的喜欢的水果和玩具推荐给10005)。这就是一种思路最为朴素的基于用户的协同过滤算法思路。 除了上述通过分析用户的行为来设计这个用户相似度外,还可以考虑通过用户的画像思维来补充和完善这个用户协调过滤算法。用户属性表如表所示。
4.2 Item-based CF 基于商品的协同过滤
这种算法给用户推荐那些和他们之前喜欢的商品相似的商品。(天猫经常这么搞) 一般,推荐算法核心思想是,给用户推荐那些和他们之前喜欢的物品相似的物品。 比如,内容推荐算法的“基于内容的协同过滤”,用户A之前阅读过NBA的相关信息,该算法会根据此行为给你推荐所有NBA相关的内容(去看头条的,就是这个套路),但是基于物品的协同过滤有点不同,Item-based CF算法并不利用物品的内容属性计算物品之间的相似度,它主要通过分析用户的行为记录计算物品之间的相似度。 Item-based CF算法认为,“有很多人喜欢商品A,同时他们也喜欢商品B,所以A和B应该是比较类似的商品。”计算起来可以分成以下两个步骤:
- 计算商品之间的相似度。
- 根据物品的相似度和用户的偏好来给用户生成推荐列表。
(一)计算物品之间的相似度。 这里同样用到了余弦相似性来求物品的相似度,但是公式略有不同:
其中,|N(i)|是喜欢物品i的用户数,|N(j)|是喜欢物品j的用户数,|N(i)UN(j)|是同时喜欢物品i和物品j的用户数。 从上面的定义看出,在协同过滤中两个物品产生相似度是因为它们共同被很多用户喜欢,两个物品相似度越高,说明这两个物品共同被很多人喜欢。 这里面蕴含着一个假设:就是假设每个用户的兴趣都局限在某几个方面,因此如果两个物品属于一个用户的兴趣列表,那么这两个物品可能就属于有限的几个领域,而如果两个物品属于很多用户的兴趣列表,那么它们就可能属于同一个领域,因而有很大的相似度。 举例说明,首先我们假定有5个用户,分别为A、B、C、D、E,他们的商品购买记录分别如下:
这是一个水果店商店的销售记录,记录了每一个用户购买的产品内容。首先要分别得到每个用户购买物品的邻接矩阵,如用户A购物邻接矩阵如表所示:
这个矩阵就是根据刚刚看到的用户A的购买记录得到的,由于红酒、啤酒和显示器同时出现在他的购物列表里,所以“梨和苹果”、“苹果和荔枝”、“荔枝和西瓜”、“西瓜和梨”两两“邻接”,也就是说这些标注1的小格子代表这两种一起在一个人的购物记录里出现过一次——注意买过就算,不是必须出现在同一次购物篮里。 同理能够得到其他B、C、D、E几人的购物邻接矩阵(所有的邻接矩阵都是沿对角线对称的。)。然后将A、B、C、D、E五人的邻接矩阵,通过矩阵“叠加”的方式,即将每一个矩阵的每个对应的方格数字相加,最后得到中间矩阵C,过程如下:
最终的叠加结果——ABCDE购买记录汇总:
从这个ABCDE购买记录汇总里,可以看到同时喜欢西瓜和梨的有2个人,同时喜欢柚子和板栗的有2个人,同时喜欢苹果和梨的有1个人……由于矩阵是对称的,我为大家都划出了对角线,大家看表格对角线的一边就行。 这时便可以计算任意两个商品的相似度做评估了,如计算西瓜和梨的相似程度,套用刚才的公式:
说明相似度极高,买西瓜的人必买梨,买梨的人必买西瓜。再试算一下板栗和柚子的相似度:
说明相似度极高,买板栗的人必买柚子,买柚子的人必买板栗。再试算一下西瓜和荔枝的相似度:
以此类推,便可计算出所有商品之间的相似度。 (二)根据物品的相似度和用户的历史行为给用户生成推荐列表: 得到相似度后,便可以计算基于相似度的商品推荐列表了。计算完汇总列表之后,当要对一个用户做推荐时,先把这个用户的历史购买记录都列出来,假设有n个购买记录。然后对这个列表里每一个产品都用查表的方法查一次相似度,这样会得到n个列表,每个列表里都是一个产品和其对应的相似度的关系。把这n个列表做一个排序,相似度高的在前,相似度低的在后。如果要推荐3个商品就取前3个,如果要推荐5个商品就取前5个。 大概的推荐算法思路说到这大概就说完了,因为我们不是技术,产品经理了解到这个层面就差不多了。深挖一层还可以根据相似度和历史行为计算出用户对物品的感兴趣度,然后再给用户生成推荐列表。就是在相似度的维度上,在增加一个感兴趣的维度,作为推荐商品的衡量指标,思路相似,这里不再展开。
4.3 优缺点说明
优点是推荐都是基于用户的行为数据去不断学习和完善,在过程中发现用户的潜在商品兴趣,能给用户“制造惊喜”的同时,也在为自己制造惊喜。这是一个持续成长的过程,而推荐不过是其中的一个短程跑道,设计者的目光应该长远些,将最终的目放在构建行业的大数据库和用户画像的产业生态上。 缺点则是启动的门槛高,用户量不够时,商品量太少时几乎无法开展;并且学习量不够时推荐结果较差,就会导致文初说的“愚蠢”现象出现,这也是很多时候人工智能被大家吐槽为“人工智障”的原因之一。 关于个性化推荐的算法,在网上有很多资料,也有很多其他的实现方法。这里只是尝试以作为产品经理的角度,用较简单的语言来将自己学到的推荐算法原理剖析给大家听。 关于产品经理要不要懂技术的问题,也是老生常谈了,高论很多,不敢多赞一词。只说一句,产品经理在算法产品的设计中,绝不能一句“做个性化推荐”就完事的,你须深入算法内部,了解算法,然后结合产品特点来优化和设计。
|