2015年7月3日星期五

个性化推荐算法简介(转载)


     个性化推荐,是指根据用户的个人属性、历史偏好等,向用户推荐个性化的信息和商品的一种服务。目前很多互联网产品和推荐相关。典型场景如电商网站的商品推荐,新闻网站的新闻推荐,音乐网站的音乐推荐以及视频网站的电影、电视剧推荐等等。具体比如亚马逊会根据你的历史购买情况,推荐相应的商品,豆瓣音乐会根据使用者标注过“红心”以及跳过的歌曲,推荐新的用户可能感兴趣的音乐等等。
 
  常用算法:
  • 1.基于静态规则的推荐
  这类算法比较直观,主要依据的预先定义的一些列“规则”。然后来了一个用户之后,通过规则库里已有的规则逐个匹配,匹配上了,即做相应的推荐。
     假设我们经营一家网上的书店,我们根据用户历史的购书情况给其推荐其可能感兴趣的新书。我们的规则是:
给用户推荐同一领域的新出版的书
       我们对已有的图书通过“标签”分类,标签可以是图书自带的,也可以是人为新增的。此时,书店新购了一批新书,《Web开发》,假设我们给这批书添加一个标签,“web”,然后我们看历史卖出的图书的清单里,带有“web”标签的书都会被哪些用户购买,比如我们发现李四,购买了《mysql指南》,《php指南》,全部带有“web”标签,我们可以给李四推送《Web开发》这个讯息,我们认为,李四很可能会感兴趣。
      基于静态的规则的推荐模型有很多好处,具体包括
  • 模型较为简单
  • 模型可解释
  • 针对性的规则配置,可以不依赖历史的交易数据,解决了“冷启动”问题
  当然这类方法的缺点同样很明显

  • 规则的配置依赖于领域的具体的知识
  • 规则配置的粒度不好确定,粒度太大,不够具体,推荐的不会太有针对性,粒度太小,规则集会非常庞大
        一般来讲,如果我们对场景,对用户有足够的了解,使用基于规则的推荐方式是非常有效的,反之,可能需要借助其他的策略。
  • 2.协同过滤

        协同过滤是指,完全根据历史行为(比如,电商领域,主要指购买行为,电影/音乐领域,主要指用户的评分行为等),根据历史行为来定义用户或者商品之间的相关性。再以这个相关性来给用户做相应的推荐。如下图,完全根据用户观看电影的行为数据,给用户做相应的推荐。
     此类算法的假设包括
  • 相似的用户会购买相似的商品
  • 用户间的相似度可以由购买的商品度量
  • 商品间的相似度可以由被哪些用户购买来度量
  根据主体的不同,我们把协同过滤分为两类
  • 基于用户的协同过滤
  • 基于物品的协同过滤

2.1 基于用户的协同过滤

  根据假设,我们认为
  • 喜欢同样商品的用户彼此间是”相似的“
  • 推荐和目标用户”相似“的其他用户喜欢的商品时合理的
  从而,主要步骤包括
  • 用户间相似度的计算,找到和目标用户最相似的其他用户
  • 找到这些用户喜欢的,并且目标用户未注意到的商品,以此推荐
用户间的相似度由购买/偏好历史决定,假设我们处理的是电商类的场景,对应某个用户 u , 令 N (u) 表示其曾经购买过的商品的集合,从而一种最简单的定义用户 u 1 ,u 2 间的相似度方式如下
 
   
当然,对于另外某些场景,可能余弦距离更加合适
 

    
得到用户间的相似度信息后,令 p(u,i) 表示用户 u 对商品 i 的感兴趣的程度
 

   其中, S (u,k) 表示和用户 u 最相似的 K 个用户, N (i) 表示和这些用户购买过的商品的集合,而 $r_{vi}$ 表示用用户 v 对商品 i 的偏好程度
   有了用户和商品间的关系的度量,我们就可以给用户推荐其最可能感兴趣的商品了。
   当然,上面的模型过于粗略,实际处理时,我们常常需要根据实际的场景做一些针对性的调整。比如,我们可能会认为,同样的购买热门的商品并不能说明两个用户之间有多相似,而冷门商品有时更加能说明问题。
  • 2.2 基于物品的协同过滤

类似的,我们有假设
  • 推荐和目标用户喜欢的商品类似的商品
  • 相似的商品会被许多用户同时购买/喜欢
  根据这个假设,基于物品的协同过滤主要包括下面的步骤
  • 计算物品间的相似度
  • 根据用户的历史购买情况(电商背景),生成推荐列表类似于用户间相似度的计算方式,我们有物品间相似度的计算,对于物品 i,j ,定义他们间的相似度 w(i,j) 如下

   
其中 (i),(j)  表示喜欢/购买过商品 i,j  的用户集合
从而,用户 u  对物品 j  的,可由其历史购买过的物品的集合与物品 j  的相似度得到
 

       N (u) 表示该用户 u 喜欢的物品的集合, S (j,K ) 表示和物品 j 最相似的 K 个物品的集合, w ji 表示物品 j,i 间的相似度,而 r_{ui} 表示用户 u 对历史购买商品 i 的兴趣。
   简言之,和用户历史购买商品越相似的物品,排名可能越靠前,从而被优先的推荐。
       和基于用户的协同过滤类似,基于物品的协同过滤也会有”热门“用户问题,即对于一次性购买大量的不同商品的用户,其对于计算商品间相似度的权重可以类似的进行弱化。除此之外,考虑到推荐结果的多样性,在生成推荐列表时,某些过于”热门“商品的权重类似的可以进行弱化。
        另外,在利用用户的历史购买信息时,通常认为,最近的购买历史会比很久以前的购买情况更有价值,从而还会考虑一些时间上的权重的偏好等等。
  • 2.3 两类算法比较
        根据之前的讨论,我们可以看到,基于用户的协同过滤,实际上比较适用于商品实时性变化比较快,时效性比较强的场景,典型如新闻推荐等。因为这种场景下,商品类型变化十分剧烈,从而商品间的相似度非常不稳定,而用户由于相对固定,根据历史阅读情况计算用户间的相似度,是非常合理的。
       基于物品的协同过滤,比较适合商品类别稳定,用户个性化需求强烈的场景,典型如电商平台等。
  实际在使用中,Digg,这是一家提供个性化新闻阅读的网站,使用的就是基于用户的协同过滤的方式,而Amazon, Hulu 则是主要使用了基于物品的协同过滤方式提来提供个性化的服务。
  • 3.隐因子模型
        这个模型认为,用户对物品的偏好,实际上是因为用户对”类别“有偏好。比如,对于下面这种情况,给定一个用户,三个物品(三本书,《计算机文化》,《中国古代史》,《天文学历史》),用户对这三本书的偏好,实际上,是因为用户对三个潜在的类别的偏好以及每件物品与这些类别的关系决定的。

  • 3.1 与协同过滤的比较
   和经典的协同过滤相比,隐因子模型最大的好处是优化了空间的复杂度。假设我们需要处理包含 N 个用户, M 个物品的推荐问题,我们人为将物品定义为 K 类(通常来说 K ≪M ),

  • 基于用户的协同过滤由于需要计算两两用户间的相似情况,空间要求是 O(N^ 2 ) 
  • 基于物品的协同过滤,需要计算两两物品间的相似情况,空间要求是 O(M^ 2 ) 
隐因子模型需要计算用户-类别以及类别-物品间关联情况,空间要求是 O((M +N )∗K )

通常情况下 N >M ≫K ,从而隐因子模型的空间复杂度有明显优势。

时间复杂度上,三者相当,没有明显的区别

冷启动问题
      
   这是推荐领域一个很经典的问题。具体来讲,很多推荐的算法依赖于用户或者物品的历史数据,对于一个新的用户,或者新的物品的推荐,系统并没有用户/物品的历史数据,对这样的用户或者物品做推荐(被推荐)就是所谓的“冷启动问题”。

   冷启动问题的解决,通常需要依赖于一些外部的知识,典型的解决方案包括:
  • 对于新用户的推荐,可以结合用户的注册信息,使用静态规则匹配,或者给用户推荐一些常见的热门商品
  • 对于新物品的推荐,同样可以借助于物品的标签以及静态规则

  • 某些像电影、音乐类的推荐,还可以利用一些社交网络的关系信息。现在很多网站可以使用一些第三方的社交网络的ID来注册,电影、音乐类的推荐即可以借助这些社交网络里用户的社交关系里的其他用户的偏好来做推荐等等。


总结
        以上我们介绍了一些比较典型的推荐相关的算法。需要注意的是,推荐服务通常会和实际的业务场景关系非常紧密。比如,音乐、书籍类的推荐,除历史记录外,还可以参照用户的社交信息。新闻类的推荐可能需要考虑地域信息等等。除此之外,即使是协同过滤,在定义用户或者商品相似度时,也可以结合一些属性、标签信息等等。另外,很多细节也需要根据世界处理的问题针对性的解决,同时一个实际场景下的推荐,很多时候也会依赖多种方法。本文介绍的更多的是一些通用的解决思路。


没有评论:

发表评论