推荐算法总结

本文为《推荐系统实战》(项亮编著)的阅读笔记。

推荐算法的评价指标

  1. 用户满意度:用户满意度没有办法离线计算,只能通过用户调查或者在线实验获得
  2. 预测准确度:
    1. 评分预测:一般通过均方根误差(RMSE)和平均绝对误差(MAE)计算。
    2. TopN 推荐:TopN 推荐的预测准确率一般通过准确率( precision ) / 召回率( recall )度量。
  3. 覆盖率:覆盖率( coverage )描述一个推荐系统对物品长尾的发掘能力。也可使用基尼指数。
  4. 多样性:多样性描述了推荐列表中物品两两之间的不相似性。
  5. 新颖性:新颖的推荐是指给用户推荐那些他们以前没有听说过的物品。
  6. 惊喜度:目前并没有什么公认的惊喜度指标定义方式,这里只给出一种定性的度量方式。上面提到,
    令用户惊喜的推荐结果是和用户历史上喜欢的物品不相似,但用户却觉得满意的推荐。
  7. 信任度:用户对推荐系统的信任程度。(以让用户信任的方式推荐给用户就更能让用户产生购买欲)
  8. 实时性:推荐系统需要实时地更新推荐列表来满足用户新的行为变化;推荐系统需要能够将新加入系统的物品推荐给用户。
  9. 健壮性:任何一个能带来利益的算法系统都会被人攻击,这方面最典型的例子就是搜索引擎。健壮性可以通过以下方法提高:
    1. 设计推荐系统时尽量使用代价比较高的用户行为。如购买的代价远高于浏览
    2. 在使用数据前,进行攻击检测,从而对数据进行清理。
  10. 商业目标:网站评测推荐系统更加注重网站的商业目标是否达成,而商业目标和网站的盈利模式是息息相关的。

基于用户行为分析的推荐算法

基于用户行为分析的推荐算法是个性化推荐系统的重要算法,学术界一般将这种类型的算法称为协同过滤算法。顾名思义,协同过滤就是指用户可以齐心协力,通过不断地和网站互动,使自己的推荐列表能够不断过滤掉自己不感兴趣的物品,从而越来越满足自己的需求。

用户行为数据

  1. 显性反馈行为:显性反馈行为包括用户明确表示对物品喜好的行为(如评分、评论等)
  2. 隐性反馈行为:隐性反馈行为指的是那些不能明确反应用户喜好的行为(如浏览行为、购买行为等)。隐性反馈行为一般数量非常庞大,且只有正反馈。

用户行为分析

用户活跃度和物品流行度的分布

用户活跃度和物品流行度的分布均服从长尾分布,即大部分用户、物品都是不活跃的。

用户活跃度和物品流行度的关系

新用户倾向于浏览热门的物品,因为他们对网站还不熟悉,只能点击首页的热门物品,而老用户会逐渐开始浏览冷门的物品。

基于邻域的方法

基于用户的协同过滤算法

基于用户的协同过滤算法主要包括两个步骤。

  1. 找到和目标用户兴趣相似的用户集合。
  2. 找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户。

计算不同样本的相似性,通常采用计算样本间的“距离” 的方式,常用的有欧拉距离、余弦相似度、相关系数等,具体计算可参考推荐算法入门(1)相似度计算方法大全

用户相似度的改进

之前的评分公式过于粗糙,如果两个用户都曾经买过《新华字典》,这丝毫不能说明他们兴趣相似,因此提出User-IIF公式计算相似度:
$$
w _ {uv} = \dfrac{\sum\limits _ {i\in N(u)\bigcap N(v)} \dfrac{1}{\log(1+\mid N(i)\mid)}}{\sqrt{\mid{N(u)}\mid \mid{N(v)\mid}}}
$$
通过 $\dfrac{1}{\log(1+\mid N(i)\mid)}$惩罚了用户 u 和用户 v 共同兴趣列表中热门物品对他们相似度的影响。

缺点

基于用户的协同过滤算法在一些网站(如 Digg )中得到了应用,但该算法有一些缺点。首先,随着网站的用户数目越来越大,计算用户兴趣相似度矩阵将越来越困难,其运算时间复杂度和空间复杂度的增长和用户数的增长近似于平方关系。其次,基于用户的协同过滤很难对推荐结果作出解释。

基于物品的协同过滤算法

基于物品的协同过滤算法(简称 ItemCF )给用户推荐那些和他们之前喜欢的物品相似的物品。该算法认为,物品 A 和物品 B 具有很大的相似度是因为喜欢物品 A 的用户大都也喜欢物品B 。基于物品的协同过滤算法主要分为两步:

  1. 计算物品之间的相似度(主要通过分析用户的行为记录计算物品之间的相似度,而不是依靠物品属性计算相似度)。
  2. 根据物品的相似度和用户的历史行为给用户生成推荐列表。

相似度的计算

可以使用计算距离的方式,也可使用如下公式
$$
w _ {ij} = \frac{|N(i)\bigcap N(j)|}{|N(i)|}
$$
$w _ {ij}$代表同时喜欢物品ij的用户数($|N(i)\bigcap N(j)|$)与喜欢物品i的用户数($|N(i)|$)的比值。

上式存在的问题是如果j很热门,大家都喜欢,那么$w _ {ij}$就会很大,即任何物品都会与热门物品相似。可将改公式改进如下
$$
w _ {ij} = \frac{|N(i)\bigcap N(j)|}{\sqrt{|N(i)||N(j)|}}
$$
这个公式惩罚了物品j的权重,因此减轻了热门物品会和很多物品相似的可能性。

从上面的定义可以看到,在协同过滤中两个物品产生相似度是因为它们共同被很多用户喜欢,也就是说每个用户都可以通过他们的历史兴趣列表给物品“贡献”相似度。这里面蕴涵着一个假设,就是每个用户的兴趣都局限在某几个方面,因此如果两个物品属于一个用户的兴趣列表,那么这两个物品可能就属于有限的几个领域,而如果两个物品属于很多用户的兴趣列表,那么它们就可能属于同一个领域,因而有很大的相似度。

用户活跃度对物品相似度的影响

通过IUF 修正物品相似度,活跃用户对物品相似度的贡献应该小于不活跃的用户
$$
w _ {ij} = \frac{\sum\limits_{u\in N(i)\bigcap N(j)}\dfrac{1}{\log(1+|N(u)|)}}{\sqrt{|N(i)||N(j)|}}
$$

物品相似度的归一化

如果将 ItemCF 的相似度矩阵按最大值归一化,可以提高推荐的准确率、覆盖率与多样性。

UserCF和ItemCF的综合比较

UserCF 的推荐结果着重于反映和用户兴趣相似的小群体的热点,而 ItemCF的推荐结果着重于维系用户的历史兴趣。换句话说, UserCF 的推荐更社会化,反映了用户所在的小型兴趣群体中物品的热门程度,而 ItemCF 的推荐更加个性化,反映了用户自己的兴趣传承。

UserCF

UserCF比较适用于新闻站点,因为:

  1. UserCF可以给用户推荐和他有相似爱好的一群其他用户今天都在看的新闻,这样在抓住热点和时效性的同时,保证了一定程度的个性化。
  2. 同时新闻的更新非常快,每时每刻都有新内容出现,而 ItemCF 需要维护一张物品相关度的表,如果物品更新很快,那么这张表也需要很快更新,这在技术上很难实现。而 UserCF 只需要用户相似性表即可。

ItemCF

ItemCF比较适用于图书、电子商务和电影网站:

  1. 在这些网站中,用户的兴趣是比较固定和持久的。
  2. 这些系统中的用户大都不太需要流行度来辅助他们判断一个物品的好坏,而是可以通过自己熟悉领域的知识自己判断物品的质量。
  3. 此外,这些网站的物品更新速度不会特别快

对比

UserCF ItemCF
性能 适用于用户较少的场合,如果用户很多,计算用户相似度矩阵代价很大 适用于物品数明显小于用户数的场合,如果物品很多(网页),计算物品相似度矩阵代价很大
领域 时效性较强,用户个性化兴趣不太明显的领域 长尾物品丰富,用户个性化需求强烈的领域
实时性 用户有新行为,不一定造成推荐结果的立即变化 用户有新行为,一定会导致推荐结果的实时变化
冷启动 在新用户对很少的物品产生行为后,不能立即对他进行个性化推荐,因为用户相似度表是每隔一段时间离线计算的。新物品上线后一段时间,一旦有用户对物品产生行为,就可以将新物品推荐给和对它产生行为的用户兴趣相似的其他用户 新用户只要对一个物品产生行为,就可以给他推荐和该物品相关的其他物品。但没有办法在不离线更新物品相似度表的情况下将新物品推荐给用户
推荐理由 很难提供令用户信服的推荐解释 利用用户的历史行为给用户做推荐解释,可以令用户比较信服

冷启动问题

冷启动问题(cold start)主要分3类。

  1. 用户冷启动:如何给新用户做个性化推荐
  2. 物品冷启动:如何将新的物品推荐给可能对它感兴趣的用户
  3. 系统冷启动:如何在一个新开发的网站上(还没有用户,也没有用户行为,只有一些物品的信息)设计个性化推荐系统

基本思路为:

  1. 提供非个性化的推荐:非个性化推荐的最简单例子就是热门排行榜,我们可以给用户推荐热门排行榜,然后等到用户数据收集到一定的时候,再切换为个性化推荐。

  2. 利用用户注册时提供的年龄、性别等数据做粗粒度的个性化。

  3. 利用用户的社交网络账号登录(需要用户授权),导入用户在社交网站上的好友信息,然后给用户推荐其好友喜欢的物品。

  4. 要求用户在登录时对一些物品进行反馈,收集用户对这些物品的兴趣信息,然后给用户推荐那些和这些物品相似的物品。

  5. 对于新加入的物品,可以利用内容信息,将它们推荐给喜欢过和它们相似的物品的用户。

  6. 在系统冷启动时,可以引入专家的知识,通过一定的高效方式迅速建立起物品的相关度表。

利用用户注册信息

  1. 人口统计学信息:包括用户的年龄、性别、职业、民族、学历和居住地。
  2. 用户兴趣的描述:有一些网站会让用户用文字描述他们的兴趣。
  3. 从其他网站导入的用户站外行为数据:比如用户通过豆瓣、新浪微博的账号登录,就可以在得到用户同意的情况下获取用户在豆瓣或者新浪微博的一些行为数据和社交网络数据。

基于用户注册信息的推荐算法其核心问题是计算每种特征的用户对某物品的喜好程度。比如某一物品i中具有某特征f的用户比例很高,则该特征对i的偏好较高。

选择合适的物品启动用户的兴趣

在新用户第一次访问推荐系统时,给用户提供一些物品,让用户反馈他们对这些物品的兴趣,根据用户的选择结果做个性化推荐。

能够用来启动用户兴趣的物品需要具有以下特点:比较热门(用户必须了解此物品是什么)、具有代表性和区分性、启动物品集合需要有多样性

物品的区分性可通过如下方式确定:对于物品 i ,将用户分成 3 类——喜欢物品 i 的用户、不喜欢物品 i 的用户和不知道物品 i 的用户(即没有给 i 评分的用户)。如果这 3 类用户集合内的用户对其他的物品兴趣很不一致,说明物品 i 具有较高的区分度。

利用物品的内容信息

物品冷启动需要解决的问题是如何将新加入的物品推荐给对它感兴趣的用户。物品冷启动在新闻网站等时效性很强的网站中非常重要,因为那些网站中时时刻刻都有新加入的物品,而且每个物品必须能够在第一时间展现给用户,否则经过一段时间后,物品的价值就大大降低了。

UserCF

UserCF 算法对物品冷启动问题并不非常敏感,当一个新物品加入时,总会有用户从某些途径看到这些物品(就算用户获取信息途径单一,也可使用随机展示的方式,发现喜欢新物品的用户群),对这些物品产生反馈,并最后推荐给相似用户。

ItemCF

对于 ItemCF 算法来说,物品冷启动就是一个严重的问题了。

当新物品加入时,内存中的物品相关表中不会存在这个物品,从而 ItemCF 算法无法推荐新的物品。而且,新物品如果不展示给用户,用户就无法对它产生行为,则无法计算该物品相关性。为此,我们只能利用物品的内容信息计算物品相关表,并且频繁地更新相关表(比如半小时计算一次)。

不同的物品有不同的内容信息,比如电影,那么内容信息一般包括标题、导演、演员、编剧、剧情、风格、国家、年代等。如果是图书,内容信息一般包含标题、作者、出版社、正文、分类等。

对于一个新物品,从其内容信息提取关键词做关键词向量,对物品 d ,它的内容表示成一个关键词向量如下:
$$
d _ i ={(e _ 1,w _ 1),(e _ 2,w _ 2),\cdots}
$$
其中,$e _ i $ 就是关键词,$w _ i$ 是关键词对应的权重。

如果物品是文本,我们可以用信息检索领域著名的 TF-IDF 公式计算词的权重:
$$
w _ i =\dfrac{\text{TF}(e _ i)}{\log \text{DF}(e _ i)}
$$
如果物品是电影,可以根据演员在剧中的重要程度赋予他们权重。向量空间模型的优点是简单,缺点是丢失了一些信息,比如关键词之间的关系信息。不过在绝大多数应用中,向量空间模型对于文本的分类、聚类、相似度计算已经可以给出令人满意的结果。

在给定物品内容的关键词向量后,物品的内容相似度可以通过向量之间的余弦相似度计算。

发挥专家的作用

使用专家标注,比如音乐、电影等。(计算音乐、电影的相似度很难)

本文标题:推荐算法总结

文章作者:微石

发布时间:2018年08月02日 - 11:08

最后更新:2018年08月03日 - 08:08

原始链接:akihoo.github.io/posts/69ac6833.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。